diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..1c9686b1 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 0d351e8de45ab7fb14c715e2dfdfe08d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/alias_python_api.doctree b/.doctrees/alias_python_api.doctree new file mode 100644 index 00000000..48f533de Binary files /dev/null and b/.doctrees/alias_python_api.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 00000000..9b6d5268 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 00000000..315d477e Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_sources/alias_python_api.rst.txt b/_sources/alias_python_api.rst.txt new file mode 100644 index 00000000..847c29e7 --- /dev/null +++ b/_sources/alias_python_api.rst.txt @@ -0,0 +1,13 @@ +Alias Python API +#################################################### + +The Alias Python API is a Python module that provides communication with Alias. It provides the python bindings for the Alias C++ API. The API is used to interact with Alias from Python. See the :ref:`Reference ` for what functionality is available in the API. + +.. _alias_python_api_reference: + +Reference +---------- + +* `Alias 2023 <_static/alias_api/2023.1.1/index.html>`_ +* `Alias 2024.0 - 2025.0 <_static/alias_api/2024.0/index.html>`_ +* `Alias 2025.1 <_static/alias_api/2025.1/index.html>`_ diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..9fc19c53 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,15 @@ +Toolkit Framework for Alias +#################################################### + +Overview +*********** + +The Flow Production Tracking Toolkit (FPTR) Framework for Alias provides support for integrating FPTR into Alias. It is used alongside the FPTR Engine for Alias (tk-alias) to allow running FPTR Toolkit Apps from within Alias. This framework provides the necessary Alias distribution files to run FPTR in all the supported versions of Alias. + +Contents +*********** + +.. toctree:: + :maxdepth: 2 + + alias_python_api diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/alias_api/2023.1.1/.buildinfo b/_static/alias_api/2023.1.1/.buildinfo new file mode 100644 index 00000000..085aae77 --- /dev/null +++ b/_static/alias_api/2023.1.1/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: bfa0799697f886ff36fae673a550e249 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_static/alias_api/2023.1.1/.doctrees/_autosummary/alias_api.doctree b/_static/alias_api/2023.1.1/.doctrees/_autosummary/alias_api.doctree new file mode 100644 index 00000000..93125b3a Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/_autosummary/alias_api.doctree differ diff --git a/_static/alias_api/2023.1.1/.doctrees/changes.doctree b/_static/alias_api/2023.1.1/.doctrees/changes.doctree new file mode 100644 index 00000000..b793ead3 Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/changes.doctree differ diff --git a/_static/alias_api/2023.1.1/.doctrees/environment.pickle b/_static/alias_api/2023.1.1/.doctrees/environment.pickle new file mode 100644 index 00000000..6f1e86f1 Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/environment.pickle differ diff --git a/_static/alias_api/2023.1.1/.doctrees/index.doctree b/_static/alias_api/2023.1.1/.doctrees/index.doctree new file mode 100644 index 00000000..68435f2c Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/index.doctree differ diff --git a/_static/alias_api/2023.1.1/.doctrees/module_summary.doctree b/_static/alias_api/2023.1.1/.doctrees/module_summary.doctree new file mode 100644 index 00000000..63ad3c98 Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/module_summary.doctree differ diff --git a/_static/alias_api/2023.1.1/.doctrees/reference.doctree b/_static/alias_api/2023.1.1/.doctrees/reference.doctree new file mode 100644 index 00000000..aeed3d6c Binary files /dev/null and b/_static/alias_api/2023.1.1/.doctrees/reference.doctree differ diff --git a/_static/alias_api/2023.1.1/_autosummary/alias_api.html b/_static/alias_api/2023.1.1/_autosummary/alias_api.html new file mode 100644 index 00000000..d1352c52 --- /dev/null +++ b/_static/alias_api/2023.1.1/_autosummary/alias_api.html @@ -0,0 +1,103 @@ + + + + + + + alias_api — Alias Python API documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

alias_api

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/_sources/_autosummary/alias_api.rst.txt b/_static/alias_api/2023.1.1/_sources/_autosummary/alias_api.rst.txt new file mode 100644 index 00000000..338ba601 --- /dev/null +++ b/_static/alias_api/2023.1.1/_sources/_autosummary/alias_api.rst.txt @@ -0,0 +1,383 @@ +alias\_api +========== + +.. automodule:: alias_api + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + add_message_handler + al_are_equal + al_is_valid + apply_iterator_to_dag_nodes + apply_iterator_to_shaders + assign_children_to_parent_layer + assign_nodes_to_layer + cleanup_geometry_model + clear_pick_list + clear_queued_events + convert_face_node_to_trimmed_surface_node + convert_to_trimmed_surface_node + copy_object + copy_object_cleanup + create_alternative + create_construction_plane + create_group_for_layer + create_layer + create_layer_folder + create_layered_shader + create_orthographic_camera + create_perspective_camera + create_reference + create_reference_alternative + create_shader + create_stage + create_switch_shader + create_texture_node + current_window + delete_all + delete_all_construction_entities + delete_all_construction_history + delete_all_locators + delete_construction_history + delete_dag_nodes_by_name + delete_history + delete_layers_by_name + delete_null_nodes + delete_sets_by_name + do_updates + expand_instances + export_by_layer + export_by_layer_sequentially + find_dag_node_by_name + find_top_level_dag_node_by_name + first_construction_entity + first_dag_node + first_environment + first_layer + first_layered_shader + first_locator + first_pick_item + first_set + first_shader + first_switch_shader + flatten_group_nodes + get_alternative_by_name + get_alternatives + get_annotation_locator_strings + get_annotation_locators + get_bounding_box_from_hanger + get_children + get_construction_plane_by_name + get_current_path + get_current_pick_item + get_current_stage + get_dag_nodes_by_name + get_empty_layers + get_empty_sets + get_layer_by_name + get_layer_by_number + get_layered_shader_by_name + get_layered_shader_by_node + get_layered_shaders + get_layers + get_layers_by_name + get_layers_using_multiple_shaders + get_locator_by_name + get_locators + get_locators_by_name + get_nesting_groups + get_perspective_camera_by_name + get_perspective_cameras + get_pick_item_dag_nodes + get_pick_items + get_product_information + get_reference_by_name + get_reference_by_path + get_reference_by_uuid + get_references + get_references_by_name + get_sets_by_name + get_shader_by_name + get_shaders + get_shaders_by_name + get_shaders_by_node + get_stages + get_switch_shader_by_name + get_switch_shader_by_node + get_switch_shaders + get_top_dag_nodes + get_variants + has_annotation_locator + has_construction_history + has_history + has_queued_events + has_reference + has_variants + import_file + import_reference + import_subdiv + import_subdivision + initialize_universe + is_construction_layer + is_copy_of_vred_shader + is_empty_file + is_queuing_events + is_stage_empty + linear_scale + linear_units + log_message + log_to_errlog + log_to_prompt + log_to_prompt_no_history + log_to_stderr + log_to_stdout + next_construction_entity + next_layer + next_locator + next_pick_item + next_shader + next_switch_shader + node_first_shader + node_switch_shader + open_file + pick + pick_all_layers + pick_all_locators + pick_by_name + pick_layers + pick_locators + pick_nodes + pick_nodes_assigned_to_layers + pick_nodes_assigned_to_shaders + pop_pick_list + prev_pick_item + push_pick_list + queue_events + redraw_screen + remove_message_handler + remove_message_handlers + remove_reference + remove_references + reset + reset_pivots + reset_stages + retrieve + retrieve_options + save_file + save_file_as + save_layers + search_dag + search_node_has_history + search_node_has_non_origin_pivot + search_node_has_non_zero_transform + search_node_is_instance + search_node_layer_does_not_match_parent_layer + search_node_unused_curves_on_surface + search_node_unused_curves_on_surface_with_history + set_layer_symmetry + set_retrieve_options + set_store_options + store + store_active + store_current_window + store_options + tessellate_adaptive + tessellate_chord_height_deviation + tessellate_chord_height_deviation_accurate + tessellate_chord_height_deviation_fast + tessellate_number + tessellate_render_settings + tessellate_uniform + traverse_dag + ungroup + unpick + unpick_all_layers + unpick_all_locators + update_reference + zero_transform + zero_transform_top_level + + + + + + .. rubric:: Classes + + .. autosummary:: + + AlAction + AlActionExtrapType + AlAngleLocator + AlAnimatable + AlAnnotationLocator + AlArcAttributes + AlAttributes + AlCamera + AlCameraNode + AlChannel + AlChannelDataType + AlCloud + AlCluster + AlClusterMember + AlClusterNode + AlClusterable + AlConicAttributes + AlConicType + AlConstructionEntity + AlConstructionPlane + AlCoordinateSystem + AlCopyOptions + AlCurve + AlCurveAttributes + AlCurveCV + AlCurveFormType + AlCurveNode + AlCurveNodeJoinErrors + AlCurveOnSurface + AlCurveOnSurfacePoint + AlCurvePoint + AlDagNode + AlDeviationLocator + AlDisplayModeType + AlDistanceLocator + AlEnvironment + AlFace + AlFaceNode + AlFileType + AlGroupNode + AlHashable + AlIKHandle + AlIKHandleNode + AlIterator + AlKeyframe + AlLayer + AlLayeredShader + AlLight + AlLightNode + AlLineAttributes + AlLinkItem + AlList + AlLocator + AlMesh + AlMeshNode + AlMessageType + AlMinmaxLocator + AlObject + AlObjectType + AlOrthographicCamera + AlParamAction + AlPerspectiveCamera + AlPickable + AlPlaneAttributes + AlPoint + AlPointType + AlRadialLocator + AlReferenceFile + AlReferenceFileSet + AlReferenceLayer + AlRetrieveOptions + AlRetrieveOptions._ai + AlRetrieveOptions._autocad + AlRetrieveOptions._c4 + AlRetrieveOptions._catiav4_atf + AlRetrieveOptions._catiav5_atf + AlRetrieveOptions._edf + AlRetrieveOptions._fbx + AlRetrieveOptions._granite_atf + AlRetrieveOptions._iges + AlRetrieveOptions._iges_atf + AlRetrieveOptions._inventor_atf + AlRetrieveOptions._jamais + AlRetrieveOptions._jt_atf + AlRetrieveOptions._level_map + AlRetrieveOptions._nx_atf + AlRetrieveOptions._parasolid_atf + AlRetrieveOptions._sat + AlRetrieveOptions._solidworks_atf + AlRetrieveOptions._step_atf + AlRetrieveOptions._stl_atf + AlRetrieveOptions._trimming_map + AlRetrieveOptions._vdafs + AlRetrieveOptions._vdais + AlRetrieveOptions._wire + AlRevSurfAttributes + AlSet + AlSetMember + AlSettable + AlShader + AlShadingFields + AlShell + AlShellNode + AlSpacePoint + AlStatusCode + AlStoreOptions + AlStoreOptions._ai + AlStoreOptions._autocad + AlStoreOptions._c4 + AlStoreOptions._catiav5_atf + AlStoreOptions._catv5 + AlStoreOptions._edf + AlStoreOptions._fbx + AlStoreOptions._granite_atf + AlStoreOptions._iges + AlStoreOptions._iges_atf + AlStoreOptions._jamais + AlStoreOptions._jt_atf + AlStoreOptions._level_map + AlStoreOptions._nx_atf + AlStoreOptions._parasolid_atf + AlStoreOptions._sat + AlStoreOptions._trimming_map + AlStoreOptions._vdafs + AlStoreOptions._vdais + AlStoreOptions._wire + AlSurface + AlSurfaceNode + AlSurfacePoint + AlSwitchShader + AlTM + AlTangentType + AlTessellateTypes + AlTexture + AlTextureNode + AlTripleComponent + AlWindow + LinearUnit + Menu + MenuItem + MessageResult + ReferenceFileStatus + Stage + SymmetryState + TraverseDagInputData + TraverseDagOutputData + Type + UngroupOption + Variant + Vec3 + VectorAlTangentType + + + + + + .. rubric:: Exceptions + + .. autosummary:: + + AliasCompatibilityException + AliasOpenModelException + AliasPythonException + + + + + diff --git a/_static/alias_api/2023.1.1/_sources/changes.rst.txt b/_static/alias_api/2023.1.1/_sources/changes.rst.txt new file mode 100644 index 00000000..88564903 --- /dev/null +++ b/_static/alias_api/2023.1.1/_sources/changes.rst.txt @@ -0,0 +1,76 @@ +What's Changed +#################### + +Summary +--------------------- + +Summary of changes in the Alias Python API version |version|. + +New +========= + +.. automodule:: alias_api + + .. autosummary:: + :nosignatures: + + assign_children_to_parent_layer + assign_nodes_to_layer + create_group_for_layer + delete_all_construction_history + delete_all + delete_dag_nodes_by_name + delete_layers_by_name + delete_sets_by_name + do_updates + get_dag_nodes_by_name + get_empty_sets + get_layers + get_layers_by_name + get_locators + get_locators_by_name + get_references_by_name + get_sets_by_name + get_shaders_by_name + pick_all + pick_all_locators + pick_all_layers + pick_layers + pick_locators + pick_nodes + pick_nodes_assigned_to_layers + pick_nodes_assigned_to_shaders + remove_references + reset_pivots + search_node_is_template + set_layer_symmetry + unpick_all + unpick_all_layers + unpick_all_locators + AlGroupNode.add_children + TraverseDagInputData.node_names + TraverseDagInputData.nodeNamesInclusive + TraverseDagOutputData.count + + +Updated +========= + +.. autosummary:: + :nosignatures: + + search_node_has_non_origin_pivot: + search_node_is_instance + search_node_layer_does_not_match_parent_layer + search_node_unused_curves_on_surface + search_node_unused_curves_on_surface_with_history + TraverseDagInputData + +**Details:** + +- Function :func:`search_node_has_non_origin_pivot` has new parameter ``reset``. +- Function :func:`search_node_is_instance` has new parameter ``expand``. +- Function :func:`search_node_layer_does_not_match_parent_layer` has new parameter ``returnParent``. +- Function :func:`search_node_unused_curves_on_surface` has new parameter ``deleteUnused``. +- Function :func:`search_node_unused_curves_on_surface_with_history` has new parameter ``deleteHistory``. +- Default constructor :class:`TraverseDagInputData` has new optional parameters ``node_names``, ``node_names_inclusive``, ``node_types``, ``node_types_inclusive``, ``layers``, ``layers_inclusive``, ``shaders`` and ``shaders_inclusive``. diff --git a/_static/alias_api/2023.1.1/_sources/index.rst.txt b/_static/alias_api/2023.1.1/_sources/index.rst.txt new file mode 100644 index 00000000..1a13743f --- /dev/null +++ b/_static/alias_api/2023.1.1/_sources/index.rst.txt @@ -0,0 +1,9 @@ +Alias Python API +============================================ + +.. toctree:: + :maxdepth: 3 + + module_summary + reference + changes diff --git a/_static/alias_api/2023.1.1/_sources/module_summary.rst.txt b/_static/alias_api/2023.1.1/_sources/module_summary.rst.txt new file mode 100644 index 00000000..17f585f4 --- /dev/null +++ b/_static/alias_api/2023.1.1/_sources/module_summary.rst.txt @@ -0,0 +1,8 @@ +Module Overview +############### + +.. autosummary:: + :toctree: _autosummary + :recursive: + + alias_api diff --git a/_static/alias_api/2023.1.1/_sources/reference.rst.txt b/_static/alias_api/2023.1.1/_sources/reference.rst.txt new file mode 100644 index 00000000..23c30535 --- /dev/null +++ b/_static/alias_api/2023.1.1/_sources/reference.rst.txt @@ -0,0 +1,5 @@ +Reference +#################### + +.. automodule:: alias_api + :members: diff --git a/_static/alias_api/2023.1.1/_static/basic.css b/_static/alias_api/2023.1.1/_static/basic.css new file mode 100644 index 00000000..912859b5 --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/basic.css @@ -0,0 +1,904 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/_static/css/badge_only.css b/_static/alias_api/2023.1.1/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.eot b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.svg b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.ttf b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff differ diff --git a/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff2 b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/alias_api/2023.1.1/_static/css/theme.css b/_static/alias_api/2023.1.1/_static/css/theme.css new file mode 100644 index 00000000..0d9ae7e1 --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/_static/doctools.js b/_static/alias_api/2023.1.1/_static/doctools.js new file mode 100644 index 00000000..8cbf1b16 --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/doctools.js @@ -0,0 +1,323 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + break; + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + break; + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/_static/alias_api/2023.1.1/_static/documentation_options.js b/_static/alias_api/2023.1.1/_static/documentation_options.js new file mode 100644 index 00000000..2fa8c97f --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/_static/file.png b/_static/alias_api/2023.1.1/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/alias_api/2023.1.1/_static/file.png differ diff --git a/_static/alias_api/2023.1.1/_static/jquery-3.5.1.js b/_static/alias_api/2023.1.1/_static/jquery-3.5.1.js new file mode 100644 index 00000000..50937333 --- /dev/null +++ b/_static/alias_api/2023.1.1/_static/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

What’s Changed

+
+

Summary

+

Summary of changes in the Alias Python API version 3.10.0.

+
+

New

+
+
+

Updated

+ ++++ + + +
+

Details:

+
    +
  • Function search_node_has_non_origin_pivot() has new parameter reset.

  • +
  • Function search_node_is_instance() has new parameter expand.

  • +
  • Function search_node_layer_does_not_match_parent_layer() has new parameter returnParent.

  • +
  • Function search_node_unused_curves_on_surface() has new parameter deleteUnused.

  • +
  • Function search_node_unused_curves_on_surface_with_history() has new parameter deleteHistory.

  • +
  • Default constructor TraverseDagInputData has new optional parameters node_names, node_names_inclusive, node_types, node_types_inclusive, layers, layers_inclusive, shaders and shaders_inclusive.

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/genindex.html b/_static/alias_api/2023.1.1/genindex.html new file mode 100644 index 00000000..bcda2eae --- /dev/null +++ b/_static/alias_api/2023.1.1/genindex.html @@ -0,0 +1,104 @@ + + + + + + Index — Alias Python API documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/index.html b/_static/alias_api/2023.1.1/index.html new file mode 100644 index 00000000..155cce23 --- /dev/null +++ b/_static/alias_api/2023.1.1/index.html @@ -0,0 +1,120 @@ + + + + + + + Alias Python API — Alias Python API documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Alias Python API

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/module_summary.html b/_static/alias_api/2023.1.1/module_summary.html new file mode 100644 index 00000000..13d7159e --- /dev/null +++ b/_static/alias_api/2023.1.1/module_summary.html @@ -0,0 +1,116 @@ + + + + + + + Module Overview — Alias Python API documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Module Overview

+ ++++ + + +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/objects.inv b/_static/alias_api/2023.1.1/objects.inv new file mode 100644 index 00000000..5ff86760 --- /dev/null +++ b/_static/alias_api/2023.1.1/objects.inv @@ -0,0 +1,6 @@ +# Sphinx inventory version 2 +# Project: Alias Python API +# Version: 3.10.0 +# The remainder of this file is compressed using zlib. +xڅM0=E/ƭ;⊅%HICڂ^ϓhyZm+%~ [@SS؞&;Z&6IA瑔T6Wz[zUF*Tb 73ʆ'(мw\+md2y~/Z \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/reference.html b/_static/alias_api/2023.1.1/reference.html new file mode 100644 index 00000000..345e890f --- /dev/null +++ b/_static/alias_api/2023.1.1/reference.html @@ -0,0 +1,108 @@ + + + + + + + Reference — Alias Python API documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Reference

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/search.html b/_static/alias_api/2023.1.1/search.html new file mode 100644 index 00000000..66dabfc6 --- /dev/null +++ b/_static/alias_api/2023.1.1/search.html @@ -0,0 +1,119 @@ + + + + + + Search — Alias Python API documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_static/alias_api/2023.1.1/searchindex.js b/_static/alias_api/2023.1.1/searchindex.js new file mode 100644 index 00000000..4c03f3c9 --- /dev/null +++ b/_static/alias_api/2023.1.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["_autosummary/alias_api","changes","index","module_summary","reference"],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:56},filenames:["_autosummary\\alias_api.rst","changes.rst","index.rst","module_summary.rst","reference.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4],"10":[0,1,2,3,4],"3":[0,1,2,3,4],"default":1,"function":1,"new":2,alia:1,api:1,chang:2,constructor:1,deletehistori:1,deleteunus:1,detail:1,expand:1,ha:1,layer:1,layers_inclus:1,modul:2,node_nam:1,node_names_inclus:1,node_typ:1,node_types_inclus:1,option:1,overview:2,paramet:1,python:1,refer:2,reset:1,returnpar:1,s:2,search_node_has_non_origin_pivot:1,search_node_is_inst:1,search_node_layer_does_not_match_parent_lay:1,search_node_unused_curves_on_surfac:1,search_node_unused_curves_on_surface_with_histori:1,shader:1,shaders_inclus:1,summari:2,traversedaginputdata:1,updat:2,version:1,what:2},titles:["alias_api","What\u2019s Changed","Alias Python API","Module Overview","Reference"],titleterms:{"new":1,alia:2,alias_api:0,api:2,chang:1,modul:3,overview:3,python:2,refer:4,s:1,summari:1,updat:1,what:1}}) \ No newline at end of file diff --git a/_static/alias_api/2024.0/.buildinfo b/_static/alias_api/2024.0/.buildinfo new file mode 100644 index 00000000..085aae77 --- /dev/null +++ b/_static/alias_api/2024.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: bfa0799697f886ff36fae673a550e249 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_static/alias_api/2024.0/.doctrees/_autosummary/alias_api.doctree b/_static/alias_api/2024.0/.doctrees/_autosummary/alias_api.doctree new file mode 100644 index 00000000..27828538 Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/_autosummary/alias_api.doctree differ diff --git a/_static/alias_api/2024.0/.doctrees/changes.doctree b/_static/alias_api/2024.0/.doctrees/changes.doctree new file mode 100644 index 00000000..fd58179c Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/changes.doctree differ diff --git a/_static/alias_api/2024.0/.doctrees/environment.pickle b/_static/alias_api/2024.0/.doctrees/environment.pickle new file mode 100644 index 00000000..eadb7878 Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/environment.pickle differ diff --git a/_static/alias_api/2024.0/.doctrees/index.doctree b/_static/alias_api/2024.0/.doctrees/index.doctree new file mode 100644 index 00000000..eaa610d4 Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/index.doctree differ diff --git a/_static/alias_api/2024.0/.doctrees/module_summary.doctree b/_static/alias_api/2024.0/.doctrees/module_summary.doctree new file mode 100644 index 00000000..b886d98f Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/module_summary.doctree differ diff --git a/_static/alias_api/2024.0/.doctrees/reference.doctree b/_static/alias_api/2024.0/.doctrees/reference.doctree new file mode 100644 index 00000000..9b7d3af2 Binary files /dev/null and b/_static/alias_api/2024.0/.doctrees/reference.doctree differ diff --git a/_static/alias_api/2024.0/_autosummary/alias_api.html b/_static/alias_api/2024.0/_autosummary/alias_api.html new file mode 100644 index 00000000..174f31e3 --- /dev/null +++ b/_static/alias_api/2024.0/_autosummary/alias_api.html @@ -0,0 +1,1055 @@ + + + + + + + alias_api — Alias Python API documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

alias_api

+

Python bindings to Alias C++ API

+

Functions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

add_message_handler(message_type, callback_func)

Install a message handler in the Alias Universe.

adjust_window(hwnd)

Adjust the specified child window such that it is centered over the Alias main window.

al_are_equal(al_object1, al_object2)

Return True if the two Alias Objects are equal, else False.

al_is_valid(al_object)

Return True if the Alias Object is valid, else False.

apply_iterator_to_dag_nodes(iter, retcode)

Applies the iterator to all AlDagNodes.

apply_iterator_to_shaders(iter, retcode)

Apply the iterator to each AlShader.

assign_children_to_parent_layer(*args, **kwargs)

Overloaded function.

assign_nodes_to_layer(*args, **kwargs)

Overloaded function.

cleanup_geometry_model([face_to_surf, ...])

Clean up the geometry of the model.

clear_pick_list()

Remove all objects from the pick list.

clear_queued_events()

Clear the currently queued events.

convert_face_node_to_trimmed_surface_node(node)

Convert a AlFaceNode to AlSurfaceNode (a trimmed surface).

convert_to_trimmed_surface_node(node)

This function works on a AlSurfaceNode only, and only on a surface that is a closed/periodic and untrimmed surface (e.g.

copy_object(node[, run_cleanup])

This function performs the copy of the dag node based on the copy options that have been set with the setCopyOptionFlags() routine.

copy_object_cleanup()

Call this method after performing a number of dag node copy object operations to clean up the scene.

create_alternative(name[, force])

Create an AlReferenceFileSet in the Alias Universe.

create_construction_plane(tm)

Create a dag node that is a construction plane at the position denoted by 'tm'.

create_group_for_layer(layer_name, group_name)

Create a group node for the specified layer.

create_layer(layer_name)

Create a new AlLayer in the Alias Universe.

create_layer_folder(folder_name)

Create a new AlLayer folder in the Alias Universe.

create_layered_shader()

Create a new AlLayeredShader in the Alias Universe.

create_orthographic_camera(view_type)

Create and return an AlOrthographicCamera object.

create_perspective_camera()

Create and return a AlPerspectiveCamera object.

create_reference(arg0)

Create an AlReferenceFile with the given path, in the Alias Universe.

create_reference_alternative(name)

Create an AlReferenceFileSet with the given name.

create_shader()

Create a new AlShader in the Alias Universe.

create_stage(arg0)

Create a new stage in Alias.

create_switch_shader()

Create a new AlSwitchShader in the Alias Universe.

create_texture_node(*args, **kwargs)

Overloaded function.

current_window()

Returns the currently active window.

delete_all(objs)

Delete all the Alias Objects in the list.

delete_all_construction_entities()

Delete all AlConstructionPlane objects found in the Alias Universe.

delete_all_construction_history(cos)

Delete the construction histor for all the given curve on surface objects.

delete_all_locators()

Delete all locators.

delete_construction_history(cos)

Delete the construction histor for the curve on surface.

delete_dag_nodes_by_name(node_names)

Delete the dag nodes with the given names.

delete_history(*args, **kwargs)

Overloaded function.

delete_layers_by_name(layer_names)

Delete the layers with the given names.

delete_null_nodes()

Delete all null nodes in the Alias scene.

delete_sets_by_name(names)

Delete sets by name.

do_updates([new_state])

The do_updates flag is used to notify the system that you are finished performing.

expand_instances(node)

Convert all instsances below the given node (top node of tree) to uninstanced geometry.

export_by_layer(target_dirname, ...[, overwrite])

Export each layer to a new file.

export_by_layer_sequentially(target_dirname, ...)

Export each layer to a new file.

find_dag_node_by_name(name)

Find and return the DagNode that matches the given name.

find_top_level_dag_node_by_name(name)

Find and return the DagNode that matches the given name.

first_construction_entity()

Return the first AlConstructionPlane object found in the Alias Universe.

first_dag_node()

Return the first AlDagNode in the list of Alias AlDagNode objects (the DAG).

first_environment()

Returns the first Environment in the list of Alias Environment objects.

first_layer()

Return the first layer which refers to the default layer.

first_layered_shader()

Return the first AlLayeredShader in the list of Alias AlLayeredShader objects.

first_locator()

Return the first AlLocator in the list of Alias AlLocator objects.

first_pick_item()

Set the pick list to reference the first object in the list.

first_set()

Return the first set in the Alias Universe.

first_shader()

Return the first AlShader in the list of Alias AlShader objects.

first_switch_shader()

Return the first AlSwitchShader in the list of Alias AlSwitchShader objects.

flatten_group_nodes(*args, **kwargs)

Overloaded function.

get_alternative_by_name(name)

Return the AlReferenceFileSet matching the given name.

get_alternatives()

Return a list of all the alternatives for the current AlReferenceFileSet.

get_annotation_locator_strings()

Return the string value for all annotation locators in the Alias Universe.

get_annotation_locators()

Return all annotation locators in the Alias Universe.

get_bounding_box_from_hanger(node)

Return the bounding box computed from the bounding box hanger for the dag node.

get_children(arg0)

Return a list of all the children in the group node.

get_construction_plane_by_name(name)

Return the AlConstructionPlane matching the given unique name.

get_current_path()

Return the current file path.

get_current_pick_item()

Return the object that the pick list is currently referencing.

get_current_stage()

Return the current stage.

get_dag_nodes_by_name(names)

Returns a list of the dag nodes matching the given names.

get_empty_layers([include_folders, skip_layers])

Return all empty layers.

get_empty_sets()

Return a list of all empty sets in the Alias Universe.

get_layer_by_name(layer_name)

Return a layer given its name in the Alias Universe.

get_layer_by_number(layer_number)

Return a layer given its number in the Alias Universe.

get_layered_shader_by_name(shader_name)

Return the AlLayeredShader found by the given name.

get_layered_shader_by_node(node_name)

Return the AlLayeredShader assigned to the node corresponding to the given name.

get_layered_shaders()

Return a list of all the AlLayeredShader objects in the Alias universe.

get_layers(*args, **kwargs)

Overloaded function.

get_layers_by_name(layer_names)

Return the AlLayer objects found from the given list of names.

get_layers_using_multiple_shaders()

Return layers whose geometry do not all use the one same shader.

get_locator_by_name(name)

Return the AlLocator object with the given name.

get_locators()

Return a list of all AlLocator objects in the Alias Universe.

get_locators_by_name(names)

Return a list of AlLocator objects with the given names.

get_main_window_id()

Return the window handle to the Alias main window.

get_nesting_groups()

Return the list of top-level group nodes that contain at least one group.

get_perspective_camera_by_name(name)

Find and return the AlPerspectiveCamera that matches the unique identifier name.

get_perspective_cameras()

Find and return all AlPerspectiveCameras in the Alias Universe.

get_pick_item_dag_nodes()

Return a list of all dag nodes that are in the pick list.

get_pick_items()

Return a list of all objects that are in the pick list.

get_product_information()

Return the Alias product information.

get_reference_by_name(name)

Return the AlReferenceFile matching the given name.

get_reference_by_path(path)

Return the AlReferenceFile matching the given file path.

get_reference_by_uuid(uuid)

Return the AlReferenceFile matching the given uuid.

get_references()

Return all the AlReferenceFiles imported into the current file.

get_references_by_name(names)

Return the AlReferenceFile objects matching the given list of names.

get_sets_by_name(names)

Get sets by name.

get_shader_by_name(shader_name)

Return the Shader found by the given name.

get_shaders()

Return a list of all the shaders in the Alias universe.

get_shaders_by_name(shader_names)

Return the Shader objects found by the given list of names.

get_shaders_by_node(node_name)

Return a list of all the shaders assigned to the node corresponding to the given name.

get_stages()

Return all the existing stages of the current Alias session.

get_switch_shader_by_name(shader_name)

Return the SwitchShader found by the given name.

get_switch_shader_by_node(node_name)

Return the switch shader assigned to the node corresponding to the given name.

get_switch_shaders()

Return a list of all the switch shaders in the Alias universe.

get_top_dag_nodes()

Returns a list of the top level dag nodes in the Alias Universe.

get_variants()

Return all the variants of the current file.

has_annotation_locator()

Return True if there are any annotation locators in the Alias Universe.

has_construction_history(cos)

Return 1 if the curve on surface has construction history, 0 if no construction history, and -1 if the curve on surface is invalid.

has_history(node)

Return True if the dag node has history, else False.

has_queued_events()

Check if there are Alias event callbacks queued and waiting to execute.

has_reference()

Return True if any AlReferenceFiles found in the current Alias Universe.

has_variants()

Check if the current file contains variants.

import_file(arg0)

Import a file into the current file.

import_reference(filename)

Import the file and create an AlReferenceFile object from it.

import_subdiv(filepath)

Imports a subdiv data from OBJ, TSM, F3D or SF3D file.

import_subdivision(filepath)

Deprecated - use 'import_subdiv' instead.

initialize_universe(up, init_project_env)

Initialize the Alias Universe.

is_construction_layer(layer_number)

Determine if the layer is a construction layer.

is_copy_of_vred_shader(shader)

Returns True if the shader was created from a VRED shader.

is_empty_file()

Deprecated - use 'is_stage_empty' instead.

is_queuing_events()

Check if the Alias event callbacks are currently being queued.

is_stage_empty()

Check if the current file is empty or not.

linear_scale(type)

Return the linear scale factor for the current units.

linear_units(type)

Return the linear units for the current units.

log_message(outputType, msg)

A function which logs a message to the given output.

log_to_errlog(msg)

A function which logs a message to the Alias error log.

log_to_prompt(msg)

A function which logs a message to the Alias prompt.

log_to_prompt_no_history(msg)

A function which logs a message to the Alias prompt without history.

log_to_stderr(msg)

A function which logs a message to the standard error stream.

log_to_stdout(msg)

A function which logs a message to the standard output stream.

next_construction_entity(entity)

Return the next AlConstructionPlane object found, after the given entity, in the Alias Universe.

next_layer(cur_layer)

Return the leaf layer following cur_layer in the graph of Alias AlLayer objects in a pre-order traversal.

next_locator(cur_locator)

Return the AlLocator following cur_locator in the list of Alias AlLocator objects.

next_pick_item()

Set the pick list to reference the next object in the list.

next_shader(*args, **kwargs)

Overloaded function.

next_switch_shader(cur_shader)

Return the AlSwitchShader following cur_shader in the list of Alias AlSwitchShader objects.

node_first_shader(node)

Return the first shader used by the given dag node.

node_switch_shader(node)

Return the switch shader used by the given dag node.

open_file(path[, new_stage, delete_current])

Open a file in Alias.

pick(pickables)

Pick all the given objects.

pick_all_layers()

Pick all layers in the Alias Universe.

pick_all_locators()

Pick all locators.

pick_by_name(name)

Add all objects that match the given string pattern to the pick list.

pick_layers(*args, **kwargs)

Overloaded function.

pick_locators(*args, **kwargs)

Overloaded function.

pick_nodes(*args, **kwargs)

Overloaded function.

pick_nodes_assigned_to_layers(*args, **kwargs)

Overloaded function.

pick_nodes_assigned_to_shaders(*args, **kwargs)

Overloaded function.

pop_pick_list()

Pops the pushed pick list.

prev_pick_item()

Set the pick list to reference the previous object in the list.

push_pick_list(copy)

Push a new pick list onto the stack.

queue_events(queue)

Manage queuing Python callbcacks triggered by Alias message events.

redraw_screen([redraw_flag])

Redraw the Alias screen.

remove_message_handler(message_type, callback_id)

Remove the specific message handler for the message type and callback.

remove_message_handlers(message_type)

Remove all message handlers for the message type.

remove_reference(reference_file)

Remove the AlReferenceFile from the Alias Universe.

remove_references(reference_files)

Remove all the AlReferenceFile from the Alias Universe.

reset()

Deprecated - use 'reset_stages' instaed.

reset_pivots(*args, **kwargs)

Overloaded function.

reset_stages()

Reset the current session by deleting all the stages.

retrieve(file_name)

Retrieves an Alias Wire file and adds the objects stored in the file to the list of Alias AlDagNode objects.

retrieve_options()

Get the options used by retrieve().

save_file()

Save the current file.

save_file_as(path)

Save the current file to the given path.

save_layers(file_path, target_dirname, ...)

Retrieve the file and export each of its layers to a new file.

search_dag(input_data)

Search the entire DAG validating each node with the provided input data.

search_node_has_history(input_data)

Search the entire DAG for nodes with construction history.

search_node_has_non_origin_pivot(input_data)

Search the entire DAG for nodes with scale or rotate pivots not positioned at the origin.

search_node_has_non_zero_transform(input_data)

Search the entire DAG for nodes that do not have a zero transform.

search_node_is_instance(input_data[, expand])

Search the entire DAG for nodes that are instances.

search_node_is_template(input_data)

Search the entire DAG for nodes that are templates.

search_node_layer_does_not_match_parent_layer(...)

Search the entire DAG for nodes that do not have the same layer assigned as their parent node.

search_node_unused_curves_on_surface(input_data)

Search the DAG for nodes that have unused curves on surface.

search_node_unused_curves_on_surface_with_history(...)

Search the DAG for nodes that have unused curves on surface.

set_layer_symmetry(*args, **kwargs)

Overloaded function.

set_parent_window(hwnd)

Set the parent window of the specified child window to the main Alias window.

set_retrieve_options(options)

Set the options used by retrieve().

set_store_options(options)

Set the options used by store().

store(*args, **kwargs)

Overloaded function.

store_active(file_name, file_type)

This method allows the user to store only those objects which are on the pick list.

store_current_window(filename[, width, ...])

Save the current Alias window to a file.

store_options()

Get the options used by store().

tessellate_adaptive(node, type, min, max, ...)

This method causes geometry below the AlDagNode to be subdivided into polygons depending on the curvature of the surface.

tessellate_chord_height_deviation(node, ...)

This method tessellates a dag using a chord height deviation tolerance. The chord height deviation

tessellate_chord_height_deviation_accurate(...)

This method tessellates a dag node using a chord height deviation tolerance and the accurate tessellator.

tessellate_chord_height_deviation_fast(node, ...)

This method tessellates a dag using a chord height deviation tolerance.

tessellate_number(node, type, total, ...)

This method repeatedly tessellates the surfaces with different adaptive subdivision parameters until settings are found that produce a total polygon count close to the requested number.

tessellate_render_settings(node, type)

This method causes the geometry below the AlDagNode to be subdivided into polygons in according to

tessellate_uniform(node, type, alongU, alongV)

This method causes the geometry below the AlDagNode to be subdivided into polygons in a uniform manner.

traverse_dag(*args, **kwargs)

Overloaded function.

ungroup(*args, **kwargs)

Overloaded function.

unpick(pickables)

Unpick all the given objects.

unpick_all_layers()

Unpick all layers in the Alias Universe.

unpick_all_locators()

Unpick all locators.

update_reference(old_path, new_path)

Update an AlReferenceFile path with the new path provided.

zero_transform(*args, **kwargs)

Overloaded function.

zero_transform_top_level()

Apply zero transform to all top-level dag nodes in the universe.

+

Classes

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AlAction

Basic interface to Alias actions

AlActionExtrapType

Pre- and Post- extrapolation (infinite) types for actions

AlAngleLocator

Displays the included angle between three locators.

AlAnimatable

Basic Interface to Alias objects which support animation.

AlAnnotationLocator

Displays a text string for existing locators

AlArcAttributes

Interface to Alias arc curve attributes.

AlAttributes

Interface to Alias curve and surface attributes.

AlCamera

A base class that encapsulates behavior of perspective and orthographic cameras.

AlCameraNode

Dag node class for cameras.

AlChannel

Basic interface to Alias channels

AlChannelDataType

The type of channel.

AlCloud

Interface to Alias clouds.

AlCluster

Encapsulates creation, deletion and manipulation of clusters.

AlClusterMember

Basic Interface to the object representing the relationship between an item and a cluster that it belongs to.

AlClusterNode

The dag node class for clusters.

AlClusterable

Encapsulates methods common to Alias objects which can belong to clusters.

AlConicAttributes

Interface to Alias conic curve attributes.

AlConicType

The type of conic curve.

AlConstructionEntity

Base class for Alias construction entities.

AlConstructionPlane

Interface to Alias construction planes.

AlCoordinateSystem

The coordinate system.

AlCopyOptions

Copy options for AlDagNode.

AlCurve

Interface to Alias nurbs curves geometry.

AlCurveAttributes

Interface to Alias curve attributes.

AlCurveCV

Encapsulates methods common to curve CVs.

AlCurveFormType

Curve form types.

AlCurveNode

A dag node that refers to a nurbs curve's geometry.

AlCurveNodeJoinErrors

Curve node join errors.

AlCurveOnSurface

Interface to curves on surfaces geometry.

AlCurveOnSurfacePoint

Interface to Alias curve on surface points

AlCurvePoint

Interface to Alias curve points.

AlDagNode

// py::class_<AlDagNode, AlObject, AlPickable, std::unique_ptr<AlDagNode>>( m, "AlDagNode", R"doc(

AlDeviationLocator

Interface to Alias deviation locator.

AlDisplayModeType

Display mode types.

AlDistanceLocator

Displays the distance between two locators.

AlEnvironment

Base object for representing shader environment data

AlFace

Interface to Alias face curves.

AlFaceNode

Interface to the dag node that gives access to faces.

AlFileType

File types

AlGroupNode

A dag node which can contain a list of dag nodes.

AlHashable

Base class for objects which can be inserted into an AlDictionary.

AlIKHandle

Interface to Inverse Kinematics Handles.

AlIKHandleNode

Interface to dag nodes of IK handles.

AlIterator

A base class used to derive iterators for performing tasks on elements of a list.

AlKeyframe

Basic interface to Alias keyframes on parameter curve actions.

AlLayer

Interface to Alias layer objects.

AlLayeredShader

Base object for representing shader data

AlLight

Encapsulates methods common to all lights.

AlLightNode

The dag node class for lights.

AlLineAttributes

Interface to Alias line attributes.

AlLinkItem

Base class for objects contained in an AlList.

AlList

Simple List class for AlLinkItem objects.

AlLocator

Contains functionality common to all the Alias locators

AlMesh

Interface to Alias meshes.

AlMeshNode

A dag node that refers to a mesh's geometry.

AlMessageType

The type of message

AlMinmaxLocator

Interface to Alias Min Max locators.

AlObject

Base class for all Alias Data types.

AlObjectType

Alias object types.

AlOrthographicCamera

Orthographic modeling cameras.

AlParamAction

Basic interface to derived class of actions for parameter curve actions.

AlPerspectiveCamera

Encapsulates creation, deletion and manipulation of perspective cameras

AlPickable

Basic Interface to Alias objects which can be picked.

AlPlaneAttributes

Interface to Alias plane surface attributes.

AlPoint

Contains functionality common to all Alias construction entity points.

AlPointType

The type of point.

AlRadialLocator

Interface to Alias Radial locators

AlReferenceFile

A base class that encapsulates access to Reference File.

AlReferenceFileSet

A base class that encapsulates access to Reference File Sets.

AlReferenceLayer

A base class that encapsulates access to Reference Layers.

AlRetrieveOptions

A structure used to transfer options that control the retrieve() method.

AlRevSurfAttributes

Interface to Alias revolved surface attributes.

AlSet

Basic Interface to Alias set structures.

AlSetMember

Basic Interface to the members of Alias set structures.

AlSettable

Encapsulates methods common to Alias objects which can belong to sets.

AlShader

Base object for representing shader data

AlShadingFields

Types for shader methods.

AlShell

Interface to Alias nurbs surface geometry.

AlShellNode

Dag node class for shells.

AlSpacePoint

Interface to Alias space points.

AlStatusCode

Resulting operation status codes

AlStoreOptions

A structure used to transfer options that control the store() method.

AlSurface

Interface to Alias nurbs surface geometry.

AlSurfaceNode

Dag node class for nurbs surfaces.

AlSurfacePoint

Interface to Alias Surface points.

AlSwitchShader

Base object for representing shader data

AlTM

Basic Interface to Alias transformation matrix.

AlTangentType

The type of tangent.

AlTessellateTypes

The tessellation types.

AlTexture

Base object for representing texture data

AlTextureNode

Dag node class for solid textures.

AlTripleComponent

The component of an action that should be extracted when evaluating a channel.

AlWindow

Interface to the Alias modeling windows.

LinearUnit

Linear measurement units.

Menu

Add menus to the Alias menu bar using this object.

MenuItem

Menu items for the Menu object.

MessageResult

The result returned by a message event.

ReferenceFileStatus

The reference file status.

Stage

Class object to represetn a stage in Alias.

SymmetryState

The symmetry state.

TraverseDagInputData

Input data for traversing teh dag.

TraverseDagOutputData

Output data from traversing the dag.

Type

The type of measurment unit.

UngroupOption

Options for ungrouping

Variant

Class object to represent a variant in Alias.

Vec3

Class object to represent a 3D vector.

VectorAlTangentType

A list containing object of type AlTangentType

+

Exceptions

+ ++++ + + + + + + + + + + + +

AliasCompatibilityException

AliasOpenModelException

AliasPythonException

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/_sources/_autosummary/alias_api.rst.txt b/_static/alias_api/2024.0/_sources/_autosummary/alias_api.rst.txt new file mode 100644 index 00000000..b8d59a99 --- /dev/null +++ b/_static/alias_api/2024.0/_sources/_autosummary/alias_api.rst.txt @@ -0,0 +1,388 @@ +alias\_api +========== + +.. automodule:: alias_api + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + add_message_handler + adjust_window + al_are_equal + al_is_valid + apply_iterator_to_dag_nodes + apply_iterator_to_shaders + assign_children_to_parent_layer + assign_nodes_to_layer + cleanup_geometry_model + clear_pick_list + clear_queued_events + convert_face_node_to_trimmed_surface_node + convert_to_trimmed_surface_node + copy_object + copy_object_cleanup + create_alternative + create_construction_plane + create_group_for_layer + create_layer + create_layer_folder + create_layered_shader + create_orthographic_camera + create_perspective_camera + create_reference + create_reference_alternative + create_shader + create_stage + create_switch_shader + create_texture_node + current_window + delete_all + delete_all_construction_entities + delete_all_construction_history + delete_all_locators + delete_construction_history + delete_dag_nodes_by_name + delete_history + delete_layers_by_name + delete_null_nodes + delete_sets_by_name + do_updates + expand_instances + export_by_layer + export_by_layer_sequentially + find_dag_node_by_name + find_top_level_dag_node_by_name + first_construction_entity + first_dag_node + first_environment + first_layer + first_layered_shader + first_locator + first_pick_item + first_set + first_shader + first_switch_shader + flatten_group_nodes + get_alternative_by_name + get_alternatives + get_annotation_locator_strings + get_annotation_locators + get_bounding_box_from_hanger + get_children + get_construction_plane_by_name + get_current_path + get_current_pick_item + get_current_stage + get_dag_nodes_by_name + get_empty_layers + get_empty_sets + get_layer_by_name + get_layer_by_number + get_layered_shader_by_name + get_layered_shader_by_node + get_layered_shaders + get_layers + get_layers_by_name + get_layers_using_multiple_shaders + get_locator_by_name + get_locators + get_locators_by_name + get_main_window_id + get_nesting_groups + get_perspective_camera_by_name + get_perspective_cameras + get_pick_item_dag_nodes + get_pick_items + get_product_information + get_reference_by_name + get_reference_by_path + get_reference_by_uuid + get_references + get_references_by_name + get_sets_by_name + get_shader_by_name + get_shaders + get_shaders_by_name + get_shaders_by_node + get_stages + get_switch_shader_by_name + get_switch_shader_by_node + get_switch_shaders + get_top_dag_nodes + get_variants + has_annotation_locator + has_construction_history + has_history + has_queued_events + has_reference + has_variants + import_file + import_reference + import_subdiv + import_subdivision + initialize_universe + is_construction_layer + is_copy_of_vred_shader + is_empty_file + is_queuing_events + is_stage_empty + linear_scale + linear_units + log_message + log_to_errlog + log_to_prompt + log_to_prompt_no_history + log_to_stderr + log_to_stdout + next_construction_entity + next_layer + next_locator + next_pick_item + next_shader + next_switch_shader + node_first_shader + node_switch_shader + open_file + pick + pick_all_layers + pick_all_locators + pick_by_name + pick_layers + pick_locators + pick_nodes + pick_nodes_assigned_to_layers + pick_nodes_assigned_to_shaders + pop_pick_list + prev_pick_item + push_pick_list + queue_events + redraw_screen + remove_message_handler + remove_message_handlers + remove_reference + remove_references + reset + reset_pivots + reset_stages + retrieve + retrieve_options + save_file + save_file_as + save_layers + search_dag + search_node_has_history + search_node_has_non_origin_pivot + search_node_has_non_zero_transform + search_node_is_instance + search_node_is_template + search_node_layer_does_not_match_parent_layer + search_node_unused_curves_on_surface + search_node_unused_curves_on_surface_with_history + set_layer_symmetry + set_parent_window + set_retrieve_options + set_store_options + store + store_active + store_current_window + store_options + tessellate_adaptive + tessellate_chord_height_deviation + tessellate_chord_height_deviation_accurate + tessellate_chord_height_deviation_fast + tessellate_number + tessellate_render_settings + tessellate_uniform + traverse_dag + ungroup + unpick + unpick_all_layers + unpick_all_locators + update_reference + zero_transform + zero_transform_top_level + + + + + + .. rubric:: Classes + + .. autosummary:: + + AlAction + AlActionExtrapType + AlAngleLocator + AlAnimatable + AlAnnotationLocator + AlArcAttributes + AlAttributes + AlCamera + AlCameraNode + AlChannel + AlChannelDataType + AlCloud + AlCluster + AlClusterMember + AlClusterNode + AlClusterable + AlConicAttributes + AlConicType + AlConstructionEntity + AlConstructionPlane + AlCoordinateSystem + AlCopyOptions + AlCurve + AlCurveAttributes + AlCurveCV + AlCurveFormType + AlCurveNode + AlCurveNodeJoinErrors + AlCurveOnSurface + AlCurveOnSurfacePoint + AlCurvePoint + AlDagNode + AlDeviationLocator + AlDisplayModeType + AlDistanceLocator + AlEnvironment + AlFace + AlFaceNode + AlFileType + AlGroupNode + AlHashable + AlIKHandle + AlIKHandleNode + AlIterator + AlKeyframe + AlLayer + AlLayeredShader + AlLight + AlLightNode + AlLineAttributes + AlLinkItem + AlList + AlLocator + AlMesh + AlMeshNode + AlMessageType + AlMinmaxLocator + AlObject + AlObjectType + AlOrthographicCamera + AlParamAction + AlPerspectiveCamera + AlPickable + AlPlaneAttributes + AlPoint + AlPointType + AlRadialLocator + AlReferenceFile + AlReferenceFileSet + AlReferenceLayer + AlRetrieveOptions + AlRetrieveOptions._ai + AlRetrieveOptions._autocad + AlRetrieveOptions._c4 + AlRetrieveOptions._catiav4_atf + AlRetrieveOptions._catiav5_atf + AlRetrieveOptions._edf + AlRetrieveOptions._fbx + AlRetrieveOptions._granite_atf + AlRetrieveOptions._iges + AlRetrieveOptions._iges_atf + AlRetrieveOptions._inventor_atf + AlRetrieveOptions._jamais + AlRetrieveOptions._jt_atf + AlRetrieveOptions._level_map + AlRetrieveOptions._nx_atf + AlRetrieveOptions._parasolid_atf + AlRetrieveOptions._sat + AlRetrieveOptions._solidworks_atf + AlRetrieveOptions._step_atf + AlRetrieveOptions._stl_atf + AlRetrieveOptions._trimming_map + AlRetrieveOptions._vdafs + AlRetrieveOptions._vdais + AlRetrieveOptions._wire + AlRevSurfAttributes + AlSet + AlSetMember + AlSettable + AlShader + AlShadingFields + AlShell + AlShellNode + AlSpacePoint + AlStatusCode + AlStoreOptions + AlStoreOptions._ai + AlStoreOptions._autocad + AlStoreOptions._c4 + AlStoreOptions._catiav5_atf + AlStoreOptions._catv5 + AlStoreOptions._edf + AlStoreOptions._fbx + AlStoreOptions._granite_atf + AlStoreOptions._iges + AlStoreOptions._iges_atf + AlStoreOptions._jamais + AlStoreOptions._jt_atf + AlStoreOptions._level_map + AlStoreOptions._nx_atf + AlStoreOptions._parasolid_atf + AlStoreOptions._sat + AlStoreOptions._trimming_map + AlStoreOptions._usd_atf + AlStoreOptions._vdafs + AlStoreOptions._vdais + AlStoreOptions._wire + AlSurface + AlSurfaceNode + AlSurfacePoint + AlSwitchShader + AlTM + AlTangentType + AlTessellateTypes + AlTexture + AlTextureNode + AlTripleComponent + AlWindow + LinearUnit + Menu + MenuItem + MessageResult + ReferenceFileStatus + Stage + SymmetryState + TraverseDagInputData + TraverseDagOutputData + Type + UngroupOption + Variant + Vec3 + VectorAlTangentType + + + + + + .. rubric:: Exceptions + + .. autosummary:: + + AliasCompatibilityException + AliasOpenModelException + AliasPythonException + + + + + diff --git a/_static/alias_api/2024.0/_sources/changes.rst.txt b/_static/alias_api/2024.0/_sources/changes.rst.txt new file mode 100644 index 00000000..88564903 --- /dev/null +++ b/_static/alias_api/2024.0/_sources/changes.rst.txt @@ -0,0 +1,76 @@ +What's Changed +#################### + +Summary +--------------------- + +Summary of changes in the Alias Python API version |version|. + +New +========= + +.. automodule:: alias_api + + .. autosummary:: + :nosignatures: + + assign_children_to_parent_layer + assign_nodes_to_layer + create_group_for_layer + delete_all_construction_history + delete_all + delete_dag_nodes_by_name + delete_layers_by_name + delete_sets_by_name + do_updates + get_dag_nodes_by_name + get_empty_sets + get_layers + get_layers_by_name + get_locators + get_locators_by_name + get_references_by_name + get_sets_by_name + get_shaders_by_name + pick_all + pick_all_locators + pick_all_layers + pick_layers + pick_locators + pick_nodes + pick_nodes_assigned_to_layers + pick_nodes_assigned_to_shaders + remove_references + reset_pivots + search_node_is_template + set_layer_symmetry + unpick_all + unpick_all_layers + unpick_all_locators + AlGroupNode.add_children + TraverseDagInputData.node_names + TraverseDagInputData.nodeNamesInclusive + TraverseDagOutputData.count + + +Updated +========= + +.. autosummary:: + :nosignatures: + + search_node_has_non_origin_pivot: + search_node_is_instance + search_node_layer_does_not_match_parent_layer + search_node_unused_curves_on_surface + search_node_unused_curves_on_surface_with_history + TraverseDagInputData + +**Details:** + +- Function :func:`search_node_has_non_origin_pivot` has new parameter ``reset``. +- Function :func:`search_node_is_instance` has new parameter ``expand``. +- Function :func:`search_node_layer_does_not_match_parent_layer` has new parameter ``returnParent``. +- Function :func:`search_node_unused_curves_on_surface` has new parameter ``deleteUnused``. +- Function :func:`search_node_unused_curves_on_surface_with_history` has new parameter ``deleteHistory``. +- Default constructor :class:`TraverseDagInputData` has new optional parameters ``node_names``, ``node_names_inclusive``, ``node_types``, ``node_types_inclusive``, ``layers``, ``layers_inclusive``, ``shaders`` and ``shaders_inclusive``. diff --git a/_static/alias_api/2024.0/_sources/index.rst.txt b/_static/alias_api/2024.0/_sources/index.rst.txt new file mode 100644 index 00000000..1a13743f --- /dev/null +++ b/_static/alias_api/2024.0/_sources/index.rst.txt @@ -0,0 +1,9 @@ +Alias Python API +============================================ + +.. toctree:: + :maxdepth: 3 + + module_summary + reference + changes diff --git a/_static/alias_api/2024.0/_sources/module_summary.rst.txt b/_static/alias_api/2024.0/_sources/module_summary.rst.txt new file mode 100644 index 00000000..17f585f4 --- /dev/null +++ b/_static/alias_api/2024.0/_sources/module_summary.rst.txt @@ -0,0 +1,8 @@ +Module Overview +############### + +.. autosummary:: + :toctree: _autosummary + :recursive: + + alias_api diff --git a/_static/alias_api/2024.0/_sources/reference.rst.txt b/_static/alias_api/2024.0/_sources/reference.rst.txt new file mode 100644 index 00000000..23c30535 --- /dev/null +++ b/_static/alias_api/2024.0/_sources/reference.rst.txt @@ -0,0 +1,5 @@ +Reference +#################### + +.. automodule:: alias_api + :members: diff --git a/_static/alias_api/2024.0/_static/basic.css b/_static/alias_api/2024.0/_static/basic.css new file mode 100644 index 00000000..912859b5 --- /dev/null +++ b/_static/alias_api/2024.0/_static/basic.css @@ -0,0 +1,904 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/alias_api/2024.0/_static/css/badge_only.css b/_static/alias_api/2024.0/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/_static/alias_api/2024.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.eot b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.svg b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.ttf b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff2 b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff b/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff2 b/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff b/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff2 b/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff b/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff2 b/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff b/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff differ diff --git a/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff2 b/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/alias_api/2024.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/alias_api/2024.0/_static/css/theme.css b/_static/alias_api/2024.0/_static/css/theme.css new file mode 100644 index 00000000..0d9ae7e1 --- /dev/null +++ b/_static/alias_api/2024.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/alias_api/2024.0/_static/doctools.js b/_static/alias_api/2024.0/_static/doctools.js new file mode 100644 index 00000000..8cbf1b16 --- /dev/null +++ b/_static/alias_api/2024.0/_static/doctools.js @@ -0,0 +1,323 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + break; + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + break; + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/_static/alias_api/2024.0/_static/documentation_options.js b/_static/alias_api/2024.0/_static/documentation_options.js new file mode 100644 index 00000000..2fa8c97f --- /dev/null +++ b/_static/alias_api/2024.0/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/_static/alias_api/2024.0/_static/file.png b/_static/alias_api/2024.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/alias_api/2024.0/_static/file.png differ diff --git a/_static/alias_api/2024.0/_static/jquery-3.5.1.js b/_static/alias_api/2024.0/_static/jquery-3.5.1.js new file mode 100644 index 00000000..50937333 --- /dev/null +++ b/_static/alias_api/2024.0/_static/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

What’s Changed

+
+

Summary

+

Summary of changes in the Alias Python API version 4.5.0.

+
+

New

+

Python bindings to Alias C++ API

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

assign_children_to_parent_layer

Overloaded function.

assign_nodes_to_layer

Overloaded function.

create_group_for_layer

Create a group node for the specified layer.

delete_all_construction_history

Delete the construction histor for all the given curve on surface objects.

delete_all

Delete all the Alias Objects in the list.

delete_dag_nodes_by_name

Delete the dag nodes with the given names.

delete_layers_by_name

Delete the layers with the given names.

delete_sets_by_name

Delete sets by name.

do_updates

The do_updates flag is used to notify the system that you are finished performing.

get_dag_nodes_by_name

Returns a list of the dag nodes matching the given names.

get_empty_sets

Return a list of all empty sets in the Alias Universe.

get_layers

Overloaded function.

get_layers_by_name

Return the AlLayer objects found from the given list of names.

get_locators

Return a list of all AlLocator objects in the Alias Universe.

get_locators_by_name

Return a list of AlLocator objects with the given names.

get_references_by_name

Return the AlReferenceFile objects matching the given list of names.

get_sets_by_name

Get sets by name.

get_shaders_by_name

Return the Shader objects found by the given list of names.

pick_all_locators

Pick all locators.

pick_all_layers

Pick all layers in the Alias Universe.

pick_layers

Overloaded function.

pick_locators

Overloaded function.

pick_nodes

Overloaded function.

pick_nodes_assigned_to_layers

Overloaded function.

pick_nodes_assigned_to_shaders

Overloaded function.

remove_references

Remove all the AlReferenceFile from the Alias Universe.

reset_pivots

Overloaded function.

search_node_is_template

Search the entire DAG for nodes that are templates.

set_layer_symmetry

Overloaded function.

unpick_all_layers

Unpick all layers in the Alias Universe.

unpick_all_locators

Unpick all locators.

AlGroupNode.add_children

Adds an AlDagNode to the end of the list of child AlDagNodes.

TraverseDagInputData.node_names

Get or set the list of node names to filter the search results.

TraverseDagInputData.nodeNamesInclusive

Get or set the flag to indicate if the nodeNames filter is inclusive.

TraverseDagOutputData.count

Get the number of nodes obtained from traversing the DAG.

+
+
+

Updated

+ ++++ + + + + + + + + + + + + + + + + + +

search_node_is_instance

Search the entire DAG for nodes that are instances.

search_node_layer_does_not_match_parent_layer

Search the entire DAG for nodes that do not have the same layer assigned as their parent node.

search_node_unused_curves_on_surface

Search the DAG for nodes that have unused curves on surface.

search_node_unused_curves_on_surface_with_history

Search the DAG for nodes that have unused curves on surface.

TraverseDagInputData

Input data for traversing teh dag.

+

Details:

+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/genindex.html b/_static/alias_api/2024.0/genindex.html new file mode 100644 index 00000000..5c72ad20 --- /dev/null +++ b/_static/alias_api/2024.0/genindex.html @@ -0,0 +1,3054 @@ + + + + + + Index — Alias Python API documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + | Z + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + +
+ +

Z

+ + + +
+ + + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/index.html b/_static/alias_api/2024.0/index.html new file mode 100644 index 00000000..f1d2f480 --- /dev/null +++ b/_static/alias_api/2024.0/index.html @@ -0,0 +1,123 @@ + + + + + + + Alias Python API — Alias Python API documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Alias Python API

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/module_summary.html b/_static/alias_api/2024.0/module_summary.html new file mode 100644 index 00000000..570665ca --- /dev/null +++ b/_static/alias_api/2024.0/module_summary.html @@ -0,0 +1,122 @@ + + + + + + + Module Overview — Alias Python API documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Module Overview

+ ++++ + + + + + +

alias_api

Python bindings to Alias C++ API

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/objects.inv b/_static/alias_api/2024.0/objects.inv new file mode 100644 index 00000000..62946bb9 Binary files /dev/null and b/_static/alias_api/2024.0/objects.inv differ diff --git a/_static/alias_api/2024.0/py-modindex.html b/_static/alias_api/2024.0/py-modindex.html new file mode 100644 index 00000000..345346d2 --- /dev/null +++ b/_static/alias_api/2024.0/py-modindex.html @@ -0,0 +1,122 @@ + + + + + + Python Module Index — Alias Python API documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Python Module Index
  • +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ a +
+ + + + + + + +
 
+ a
+ alias_api +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/reference.html b/_static/alias_api/2024.0/reference.html new file mode 100644 index 00000000..ea91bb97 --- /dev/null +++ b/_static/alias_api/2024.0/reference.html @@ -0,0 +1,17695 @@ + + + + + + + Reference — Alias Python API documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Reference

+

Python bindings to Alias C++ API

+
+
+class alias_api.AlAction
+

Basic interface to Alias actions

+

AlAction is the base class for an Alias action. An action +is an entity that will map time to a value. In Alias, there are +two types of actions: parameter curve actions, represented by the +derived class AlParamAction, and motion path actions, represented by +the derived class AlMotionAction.

+

You can create new AlActions by creating an AlParamAction or an +AlMotionAction. Existing actions can be accessed either through the +global list of actions (first_action(), next_action()) +or through the list of actions which a channel uses to animate a field +of an item (AlChannel.applied_action()). Note that if you delete an +action, it may cause other classes to be deleted (for example, AlKeyframe, +and AlChannel if the action was the base action of a channel).

+
+
+channel_reference(self: alias_api.AlAction, arg0: int) alias_api.AlChannel
+

This method returns the ‘n’th AlChannel that references this +AlAction. If ‘n’ is less than 1, or greater than the number of +channels that reference this action (as returned by +AlAction::numChannelReferences()), then NULL is returned. +The list of channels is not in any particular order.

+
+
Parameters
+

n (int) – the index between 1 and numChannelReferences() of the +channel reference to return.

+
+
Returns
+

The ‘n’th AlChannel that references this AlAction.

+
+
Return type
+

AlChannel

+
+
+
+ +
+
+comment(self: alias_api.AlAction) str
+

This method returns the comment on the action.

+
+ +
+
+copy(self: alias_api.AlAction) alias_api.AlAction
+

This method makes a copy of this action and returns the copy. +If the copy fails, NULL is returned. Note that this method +copies the action NOT the wrapper object.

+
+ +
+
+eval(self: alias_api.AlAction, time: float, compo: alias_api.AlTripleComponent = <AlTripleComponent.X_Component: 1>) float
+

This method evaluates this action at the given time, and returns +the value of the action at that time. If the action is an +AlMotionAction, then you must specify which component of the resulting +(x,y,z) value to retrieve using the optional second argument.

+

If the action is not valid, 0.0 is returned.

+

Evaluation of an AlParamAction is as follows:

+

An animation parameter curve is a “Poon-Ross” spline (developed by +Angus Poon and Dave Ross). This spline is basically a Hermite-linear +spline. That is, it is a Hermite in y (the vertical axis) and a linear +in x (the horizontal axis). If we call this spline C(t) = (x(t), y(t)), +then we see that it is fairly straightforward to compute for the case +when x = T since x(t) = t. So we would get C(t) for x = T is +(T, y(T)).

+

To compute a point on a curve segment C(t) (which is bounded by the +cvs (t1, y1), (t2, y2) and has tangents m1 and m2 at the start & end of +the segment) at t = T, we first make the mapping

+
+

T’ = (T - t1) / (t2 - t1)

+
+

so that t is in the range [0, 1]. We then get the y value off of the +curve segment using the standard computation

+
+

C(T) = [T’^3 T’^2 T’ 1] * H *%@ | y1 |

+
+

where H is the hermite basis matrix.

+
+
Parameters
+
    +
  • time (float) – the time at which to evaluate the action

  • +
  • compo (AlTripleComponent) – which component to get, for motion actions.

  • +
+
+
Returns
+

The value of the action at the given time.

+
+
Return type
+

float

+
+
+
+ +
+
+extrap_type_post(self: alias_api.AlAction) alias_api.AlActionExtrapType
+

This method returns the out-of-range, or extrapolation to infinite +type of the action after its defined range. If the type can not be +retrieved, kEXTRAP_INVALID is returned.

+
+
Return type
+

AlActionExtrapType

+
+
+
+ +
+
+extrap_type_pre(self: alias_api.AlAction) alias_api.AlActionExtrapType
+

This method gets the out-of-range, or extrapolation to infinite +type of the action before its defined range. If the type could not +be retrieved, Invalid is returned.

+
+
Return type
+

AlActionExtrapType

+
+
+
+ +
+
+property name
+

Get or set the AlAction name.

+
+ +
+
+num_channel_references(self: alias_api.AlAction) int
+

This method returns the number of channels that use this action. +If 0 is returned, this action is considered non-referenced. +Note that if one channel uses this action 2 times, this is counted as 2 +references. Also note that if the action is not valid -1 will be +returned.

+
+ +
+
+set_comment(self: alias_api.AlAction, new_comment: str) int
+

This method makes a copy of ‘newComment’ and replaces the +existing comment on the action with this new comment.

+
+
Parameters
+

new_comment (str) – the new comment to assign to the action

+
+
Returns
+

The status code result of the operation: +Success - action’s comment was changed to newComment +InvalidArgument - newComment was NULL +InvalidObject - this action is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_extrap_type_post(self: alias_api.AlAction, extrap_type: alias_api.AlActionExtrapType) int
+

This method sets the out-of-range, or extrapolation to infinite +type of the action after its defined range to the given extrapolation +type.

+
+
Parameters
+

extrap_type (AlActionExtrapType) – extrapolation type to set for action after defined range

+
+
Returns
+

The status code result of the operation: +Success - the extrapolation type was successfully determined +InvalidObject - the action was not valid +InvalidArgument - the given extrapolation type was not valid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_extrap_type_pre(self: alias_api.AlAction, extrap_type: alias_api.AlActionExtrapType) int
+

This method sets the out-of-range, or extrapolation to infinite +type of the action before its defined range to the given extrapolation +type.

+
+
Parameters
+

extrap_type (AlActionExtrapType) – extrapolation type to set for action before defined range

+
+
Returns
+

The status code result of the operation: +Success - the extrapolation type was successfully determined +InvalidObject - the action was not valid +InvalidArgument - the given extrapolation type was not valid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+type(self: alias_api.AlAction) alias_api.AlObjectType
+

Returns the class identifier ‘ActionType’.

+
+ +
+ +
+
+class alias_api.AlActionExtrapType
+
+

Pre- and Post- extrapolation (infinite) types for actions +(These types define the behaviour of the action before and after +its defined range).

+
+

Members:

+
+

Invalid

+

Constant

+

Cycle

+

Oscillate

+

Linear

+

Identity

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlAngleLocator
+

Displays the included angle between three locators.

+

An angle locator is used to find the included angle between any three point +locators (AlPointLocator). If any of the three point locators on which +this locator depends is deleted, this locator is automatically deleted. +This class contains methods to create the locator, query the +distance, and set the display attributes of the locator in the Alias +windows.

+
+
+angle(self: alias_api.AlAngleLocator) Tuple[int, float]
+

Find the angle of the locator.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the angle was found +InvalidObject - the locator is not valid

+
+
    +
  1. The angle of the locator.

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlAngleLocator) alias_api.AlObject
+

Return an exact duplicate of this AlAngleLocator wrapper.

+
+ +
+
+create(self: alias_api.AlAngleLocator, start_point: AlPoint, mid_point: AlPoint, end_point: AlPoint, true_display: int = True) int
+

Creates an Angle locator to measure the included angle between three +point locators. The measured angle is between the lines formed by +start_point and mid_point, and mid_point and end_point.

+
+
Parameters
+
    +
  • start_point (AlPoint) – The starting point.

  • +
  • mid_point (AlPoint) – The middle point.

  • +
  • end_point (AlPoint) – The ending point.

  • +
  • display_type (bool) – Whether the true value or projection of the true +value in the Alias window should be shown. The default is +true display.

  • +
+
+
Returns
+

The status code result of the operation: +sSuccess - the angle locator was successfully created +sAlreadyCreated - object has already been created +sFailure - the angle locator could not be created +sInvalidArgument - either one or all the given points are not valid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+end_point(self: alias_api.AlAngleLocator) AlPoint
+

Returns the ending Point of this Angle locator. +However, if the angle locator is not valid, None is returned.

+
+ +
+
+mid_point(self: alias_api.AlAngleLocator) AlPoint
+

Returns the middle Point of this Angle locator. +However, if the angle locator is not valid, None is returned.

+
+ +
+
+offset(self: alias_api.AlAngleLocator) Tuple[int, float]
+

Get the offset of the locator display.

+
+
Parameters
+

value (float) – The display offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was found +InvalidObject - the object is not valid

+
+
+
+ +
+
+set_offset(self: alias_api.AlAngleLocator, offset: float) int
+

Set the offset in the locator display.

+
+
Parameters
+

offset (float) – The value of the offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was set +InvalidObject - the object is not valid

+
+
+
+ +
+
+set_true_display(self: alias_api.AlAngleLocator, value: int) int
+

Set the display type of this Angle locator. +If the angle locator is not valid, None is returned.

+
+ +
+
+set_world_space_offset(self: alias_api.AlAngleLocator, offset: float) int
+

Set the offset of the locator in worldspace.

+
+
Parameters
+

offset (float) – The value of the offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was set +InvalidObject - the object is not valid

+
+
+
+ +
+
+start_point(self: alias_api.AlAngleLocator) AlPoint
+

Returns the starting Point of this Angle locator. +However, if the angle locator is not valid, None is returned.

+
+ +
+
+true_display(self: alias_api.AlAngleLocator) Tuple[int, int]
+

Returns 1 if true display is set, else 0.

+
+ +
+
+type(self: alias_api.AlAngleLocator) alias_api.AlObjectType
+

Return the AlAngleLocator type identifier.

+
+ +
+
+world_space_offset(self: alias_api.AlAngleLocator) Tuple[int, float]
+

Find the offset in the locator in worldspace.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the offset was found +InvalidObject - the object is not valid

+
+
    +
  1. the offset of the locator in worldspace.

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+ +
+
+class alias_api.AlAnimatable
+

Basic Interface to Alias objects which support animation.

+

This class encapsulates the functionality of Alias objects +which have the capacity to be animated. It provides access +to channels.

+
+
+apply_iterator_to_channels(self: alias_api.AlAnimatable, iter: AlIterator) Tuple[int, int]
+

Apply the given iterator to each of the channels in this +object. See the documentation for AlIterator.

+
+
Parameters
+

iter (AlIterator) – The iterator to apply to each channel

+
+
Returns
+

The status code resulting from the operation. +Success - the iterator was successfully applied. +InvalidObject - the object was not valid +Failure - the application of the iterator failed or the object had no channels. +InvalidArgument - the iterator was NULL.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+delete_animation(self: alias_api.AlAnimatable) int
+

This method deletes all the channels that currently animate this +object.

+
+
Returns
+

The status code resulting from the operation. +Success - the animation was successfully deleted. +InvalidObject - the object was not valid.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+find_channel(self: alias_api.AlAnimatable, parameter: int) AlChannel
+

This is a fast way to obtain a particular AlChannel on an object +from the parameter of that channel. This method returns +the AlChannel which animates the passed in parameter of the given +AlAnimatable. If the object is not valid, or the parameter +is not currently animated, NULL is returned.

+
+
Parameters
+

parameter (int) – The parameter of the AlAnimatable corresponding to the desired channel.

+
+
Returns
+

The channel animating the parameter.

+
+
Return type
+

AlChannel

+
+
+
+ +
+
+first_channel(self: alias_api.AlAnimatable) AlChannel
+

Get the first channel animating this object. If this object +is not animated, this method will return NULL.

+
+ +
+
+global_param(self: alias_api.AlAnimatable, param_name: str) Tuple[int, int]
+

This method returns the parameter control.

+
+
Parameters
+

param_name (str) – The name of the parameter in question

+
+
Returns
+

A tuple containg: +(1) The status code resulting from the operation

+
+

Success - the parameter was read +ObjectNotFound - the paramName could not be found +InvalidArgument - paramName was NULL +InvalidObject - the object was not valid.

+
+
    +
  1. The returned state of the parameter

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+global_param_list(self: alias_api.AlAnimatable) AlList
+

This method returns a list of the parameter controls.

+
+
Returns
+

A list of the parameter control names.

+
+
Return type
+

AlList

+
+
+
+ +
+
+local_param(self: alias_api.AlAnimatable, param_name: str) Tuple[int, int]
+

This method returns the parameter control. +If there are no local params set, then the default local params are +returned.

+
+
Parameters
+

param_name (str) – The name of the parameter in question

+
+
Returns
+

A tuple containing: +(1) The status code resulting from the operation

+
+

Success - the parameter was read +ObjectNotFound - the paramName could not be found +InvalidArgument - paramName was NULL +InvalidObject - the object was not valid.

+
+
    +
  1. The returned state of the parameter

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+local_param_list(self: alias_api.AlAnimatable) AlList
+

This method returns a list of the parameter control names. +The list contains a list of ‘AlParamItem’s.

+
+
Returns
+

A list of the parameter control names.

+
+
Return type
+

AlList

+
+
+
+ +
+
+next_channel(self: alias_api.AlAnimatable, channel: AlChannel) AlChannel
+

This method gets the next channel in this object’s list of +channels following the given ‘channel’. If ‘channel’ is not part +of the object’s channel list, or it is the last channel in the +list, then NULL is returned.

+
+
Parameters
+

channel (AlChannel) – One of this object’s channels for which we want +to find the next channel.

+
+
Returns
+

The next channel in the list of channels for this object.

+
+
Return type
+

AlChannel

+
+
+
+ +
+
+prev_channel(self: alias_api.AlAnimatable, channel: AlChannel) AlChannel
+

This method gets the previous channel in this object’s list of +channels following the given ‘channel’. If ‘channel’ is not part +of the object’s channel list, or it is the last channel in the +list, then NULL is returned.

+
+
Parameters
+

channel (AlChannel) – One of this object’s channels for which we want +to find the next channel.

+
+
Returns
+

The previous channel in the list of channels for this object.

+
+
Return type
+

AlChannel

+
+
+
+ +
+
+sample_channel(self: alias_api.AlAnimatable, parameter: int) float
+

This method samples the parameter of the AlAnimatable without +actually evaluating it. It reads the current value of the parameter +and returns it as a double. Note that the parameter does not +need to currently be animated to sample it.

+

If this method succeeds, it returns the value of the parameter at +the current frame. If it fails, 0.0 is returned.

+
+
Parameters
+

parameter (int) – The parameter of the AlAnimatable to be sampled.

+
+
Returns
+

The value of the parameter at the current frame.

+
+
Return type
+

double

+
+
+
+ +
+
+set_global_param(self: alias_api.AlAnimatable, param_name: str) Tuple[int, int]
+

This method sets the parameter control for objects of this type.

+
+
Parameters
+

param_name (str) – The name of the parameter in question

+
+
Returns
+

The status code resulting from the operation +Success - the parameter was read +ObjectNotFound - the paramName could not be found +InvalidArgument - paramName was NULL +InvalidObject - the object was not valid.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_local_param(self: alias_api.AlAnimatable, param_name: str) Tuple[int, int]
+

This method sets the parameter control.

+
+
Parameters
+

param_name (str) – The name of the parameter in question

+
+
Returns
+

A tuple containing: +(1) The status code resulting from the operation

+
+

Success - the parameter was read +ObjectNotFound - the paramName could not be found +Failure - there were no local params set +InvalidArgument - paramName was NULL +InvalidObject - the object was not valid.

+
+
    +
  1. The state of the parameter

  2. +
+

+
+
+
+ +
+ +
+
+class alias_api.AlAnnotationLocator
+

Displays a text string for existing locators

+

This class creates an annotation to the existing point locators such as a +space locator, curve locator, curve on surface locator, and surface locator. +An annotation is a line of text and a leader (line with arrow) that is drawn +relative to another locator (point type).

+

To use this locator, create any point locator and attach the annotation string +through this locator using the create method. There are also methods to +manipulate the position and starting point of the leader line for the annotation.

+
+
+copy_wrapper(self: alias_api.AlAnnotationLocator) alias_api.AlObject
+

Return an exact duplicate of this AlAnnotationLocator wrapper.

+
+ +
+
+create(self: alias_api.AlAnnotationLocator, start_x: float, start_y: float, start_z: float, string: str, end_x: float, end_y: float, end_z: float) int
+

Create a new AlAnnotationLocator in the Alias Universe.

+
+ +
+
+left_justify(self: alias_api.AlAnnotationLocator) Tuple[int, int]
+

Return the left justify for the annotation locator.

+
+ +
+
+length(self: alias_api.AlAnnotationLocator) Tuple[int, float]
+

Return the length for the annotation locator.

+
+ +
+
+local_leader_position(self: alias_api.AlAnnotationLocator) Tuple[int, float, float, float]
+

Return the local leader position for the annotation locator.

+
+ +
+
+offset(self: alias_api.AlAnnotationLocator) Tuple[int, float, float, float]
+

Return the offset for the annotation locator.

+
+ +
+
+point(self: alias_api.AlAnnotationLocator) Tuple[int, float, float, float]
+

Return the point for the annotation locator.

+
+ +
+
+set_left_justify(self: alias_api.AlAnnotationLocator, left_justify: int) int
+

Set the left justify for the annotation locator.

+
+ +
+
+set_length(self: alias_api.AlAnnotationLocator, length: float) int
+

Set the length for the annotation locator.

+
+ +
+
+set_local_leader_position(self: alias_api.AlAnnotationLocator, x: float = 0.0, y: float = 0.0, z: float = 0.0) int
+

Set the local leader position for the annotation locator.

+
+ +
+
+set_offset(self: alias_api.AlAnnotationLocator, x: float, y: float, z: float) int
+

Set the offset for the annotation locator.

+
+ +
+
+set_show_arrow(self: alias_api.AlAnnotationLocator, show: int) int
+

Set the show arrow for the annotation locator.

+
+ +
+
+set_world_leader_position(self: alias_api.AlAnnotationLocator, x: float = 0.0, y: float = 0.0, z: float = 0.0) int
+

Set the world leader position for the annotation locator.

+
+ +
+
+show_arrow(self: alias_api.AlAnnotationLocator) Tuple[int, int]
+

Return the show arrow for the annotation locator.

+
+ +
+
+property string
+

Return the AlAnnotationLocator type identifier.

+
+ +
+
+type(self: alias_api.AlAnnotationLocator) alias_api.AlObjectType
+

Return the AlAnnotationLocator type identifier.

+
+ +
+
+world_leader_position(self: alias_api.AlAnnotationLocator) Tuple[int, float, float, float]
+

Return the world leader position for the annotation locator.

+
+ +
+ +
+
+class alias_api.AlArcAttributes
+

Interface to Alias arc curve attributes.

+

AlArcAttributes is a class derived from the AlAttributes class. +This class allows access to the attributes for an arc.

+

The attributes which define an arc are its radius, sweep +angle, center point, start point, and end point. +Coordinates are given in object space, and not world space.

+
+
+calculate_start_and_end_andles(self: alias_api.AlArcAttributes, x_axis: std::array<double, 3>, y_axis: std::array<double, 3>, z_axis: std::array<double, 3>) Tuple[int, float, float]
+

This function will convert the attribute information to +start and end angle format. The start and end angles +are rotated by the axis into their correct position.

+
+
Parameters
+
    +
  • x_axis (List[float[3]]) – the x axis

  • +
  • y_axis (List[float[3]]) – the y axis

  • +
  • z_axis (List[float[3]]) – the z axis

  • +
+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - Converting the data succeded +InvalidObject - the attribute was invalid +Failure - Conversion failed

+
+
    +
  1. the start angle

  2. +
  3. the end angle

  4. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float]

+
+
+
+ +
+
+center_point(self: alias_api.AlArcAttributes) Tuple[int, float, float, float]
+

Returns the center point for the arc. Note that there is +for the arc. Note that there is no “set” method for the +center point. The center point is moved by changing the +arc’s radius.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the center point was successfully returned. +InvalidObject - the attr

+
+
    +
  1. the center point x coordinate

  2. +
  3. the center point y coordinate

  4. +
  5. the center point z coordinate

  6. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlArcAttributes) alias_api.AlObject
+

Return an exact duplicate of this AlArcAttributes wrapper.

+
+ +
+
+end_point(self: alias_api.AlArcAttributes) Tuple[int, float, float, float]
+

Returns the point where the arc ends.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid.

+
+
    +
  1. the end point x coordinate

  2. +
  3. the end point y coordinate

  4. +
  5. the end point z coordinate

  6. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+radius(self: alias_api.AlArcAttributes) float
+

Returns the radius of the arc. Zero is returned +if the attribute is not valid.

+
+ +
+
+set_end_point(self: alias_api.AlArcAttributes, x: float, y: float, z: float) int
+

This method moves the end point of the arc. Changing the +end point changes the size of the sweep, and if the new end +point is not on the circle about the arc’s center point, the +center point will be moved.

+
+
Parameters
+
    +
  • x (float) – end point x coordinate

  • +
  • y (float) – end point y coordinate

  • +
  • z (float) – end point z coordinate

  • +
+
+
Returns
+

the status code result of the operation: +Success - Setting the end point succeeded. +InvalidObject - the attribute was invalid +Failure - Setting the end point failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_radius(self: alias_api.AlArcAttributes, arg0: float) int
+

Change the radius for the arc. This operation will move the +center point for the arc.

+
+
Parameters
+

radius (float) – the radius of the arc

+
+
Returns
+

the status code result of the operation: +Success - Setting the sweep succeeded. +InvalidObject - the attribute was invalid +Failure - Setting the sweep failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_start_point(self: alias_api.AlArcAttributes, x: float, y: float, z: float) int
+

This method moves the start point of the arc. Changing the +start point changes the size of the sweep, and if the new start +point is not on the circle about the arc’s center point, the +center point will be moved.

+
+
Parameters
+
    +
  • x (float) – start point x coordinate

  • +
  • y (float) – start point y coordinate

  • +
  • z (float) – start point z coordinate

  • +
+
+
Returns
+

the status code result of the operation: +Success - Setting the start point succeeded. +InvalidObject - the attribute was not valid +Failure - Setting the start point failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_sweep_from_end_point(self: alias_api.AlArcAttributes, arg0: float) int
+

Change the sweep of the arc from the end point. This +operation will move the start point. The sweep is given in +degrees.

+
+
Parameters
+

sweep (float) – the sweep from the end point (in degrees)

+
+
Returns
+

the status code result of the operation: +Success - Setting the sweep succeeded. +InvalidObject - the attribute was invalid +Failure - Setting the sweep failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_sweep_from_start_point(self: alias_api.AlArcAttributes, arg0: float) int
+

Change the sweep of the arc from the start point. This +operation will move the end point. The sweep is given in +degrees.

+
+
Parameters
+

sweep (float) – the sweep from the start point (in degrees)

+
+
Returns
+

the status code result of the operation: +Success - Setting the sweep succeeded. +InvalidObject - the attribute was invalid +Failure - Setting the sweep failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+start_point(self: alias_api.AlArcAttributes) Tuple[int, float, float, float]
+

Returns the point where the arc starts.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid.

+
+
    +
  1. the start point x coordinate

  2. +
  3. the start point y coordinate

  4. +
  5. the start point z coordinate

  6. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+sweep(self: alias_api.AlArcAttributes) float
+

Returns the number of degrees in the arc. Zero is returned +if the attribute is not valid.

+
+ +
+
+type(self: alias_api.AlArcAttributes) alias_api.AlObjectType
+

Return the AlArcAttributes type identifier.

+
+ +
+ +
+
+class alias_api.AlAttributes
+

Interface to Alias curve and surface attributes.

+

AlAttributes is the base class for a set of classes which +allow access to curve and surface attributes. It is not +possible to create AlAttributes directly, instead they are +created when you use the AlCurve::create*() methods.

+

An attribute is an alternate way to specify an +object. For example, in Alias normally a circle would be +represented by a NURBS curve which approximates a circle. +With attributes instead, a circle is represented by an +origin, a radius, etc. Several types of attributes are +derived from this class which are used for particular +types of objects.

+
+
+copy_wrapper(self: alias_api.AlAttributes) alias_api.AlObject
+

Return an exact duplicate of this AlAttributes wrapper.

+
+ +
+
+next_attribute(self: alias_api.AlAttributes) alias_api.AlAttributes
+

Return the next AlAttributes object.

+
+ +
+
+type(self: alias_api.AlAttributes) alias_api.AlObjectType
+

Return the AlAttributes type identifier.

+
+ +
+ +
+
+class alias_api.AlCamera
+

A base class that encapsulates behavior of perspective and orthographic cameras.

+

This class used to represent all the functionality of Alias perspective +cameras. When the AlWindow class was born and it became possible to +get and set the window associated with a camera, it became necessary +not only to provide an interface to orthographic cameras as well, but +also to separate the differences in functionality into two child +classes. The AlCamera class remains as a base class, providing access +to the behavior that all cameras share. In places where AlCameras +were formerly used, it is possible to easily convert old code simply +by substituting AlPerspectiveCamera for AlCamera almost everywhere. +(A few other small modifications may be necessary).

+

Any camera can have image planes attached to it. To create an image +plane on a camera, use the addImagePlane command.

+

If a window is associated with this camera (which will always be the +case for orthographic cameras, but not so for perspective cameras) +the first_window() function will return it.

+
+
+copy_wrapper(self: alias_api.AlCamera) alias_api.AlObject
+

Return an exact duplicate of this AlCamera wrapper.

+
+ +
+
+delete_object(self: alias_api.AlCamera) int
+

Delete the AlCamera from the Alias Universe and return the status of the performed operation.

+
+ +
+
+property name
+

Get or set the AlCamera name.

+
+ +
+
+type(self: alias_api.AlCamera) alias_api.AlObjectType
+

Return the AlCamera type identifier.

+
+ +
+ +
+
+class alias_api.AlCameraNode
+

Dag node class for cameras.

+

This class is a dag node class used specifically for cameras. +Each AlCamera object has three camera nodes. One for each of eye, +view and up positions. (For more information on how AlCamera’s and +AlCameraNode’s work together, see the Class Description for +the AlCamera object.)

+

To create a camera node, the user must create a camera, +which will automatically create the necessary camera nodes. +The user cannot directly instantiate an AlCameraNode.

+

To figure out which position a camera node represents, the +user can use:

+
+
    +
  1. the is_eye_node(), is_view_node(), is_up_node() methods, or

  2. +
+

2) the type() method to compare types with CameraEyeType, +CameraUpType, or CameraViewType.

+
+

A camera node can be deleted in two ways. When a camera node +is deleted, its associated camera (and other camera nodes) +are deleted. When a camera is deleted, its camera nodes +are also deleted.

+
+
+camera(*args, **kwargs)
+

Overloaded function.

+
    +
  1. camera(self: alias_api.AlCameraNode) -> alias_api.AlCamera

    +
    +

    Return the attached AlCamera object.

    +
    +
    return
    +

    The attached AlCamera object.

    +
    +
    rtype
    +

    AlCamera

    +
    +
    +
    +
  2. +
  3. camera(self: alias_api.AlCameraNode, arg0: alias_api.AlTM) -> alias_api.AlCamera

    +
    +

    Return the attached AlCamera object.

    +

    The AlTM will be updated with the camera node’s transformation amtrix, if a camera exists.

    +
    +
    param tm
    +

    The transform matrix.

    +
    +
    type tm
    +

    AlTM

    +
    +
    return
    +

    The attached AlCamera object.

    +
    +
    rtype
    +

    AlCamera

    +
    +
    +
    +
  4. +
+
+ +
+
+copy_wrapper(self: alias_api.AlCameraNode) alias_api.AlObject
+

Return an exact duplicate of this AlCameraNode wrapper.

+
+ +
+
+delete_object(self: alias_api.AlCameraNode) int
+

Delete the AlCameraNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+is_eye_node(self: alias_api.AlCameraNode) int
+

Return True if this camera node represents the eye position of a camera.

+
+ +
+
+is_instanceable(self: alias_api.AlCameraNode) int
+

Return False. An AlCameraNode is not an instanceable dag node.

+
+ +
+
+is_up_node(self: alias_api.AlCameraNode) int
+

Return True if this camera node represents the up position of a camera.

+
+ +
+
+is_view_node(self: alias_api.AlCameraNode) int
+

Return True if this camera node represents the view position of a camera.

+
+ +
+
+type(self: alias_api.AlCameraNode) alias_api.AlObjectType
+

Return the AlCameraNode type identifier.

+
+ +
+ +
+
+class alias_api.AlChannel
+

Basic interface to Alias channels

+

A channel controls how a field of an animatable item should change +over time. It contains one or more actions which are evaluated at a +given time and combined to produce an overall value of the channel at +that time.

+

A channel belongs solely to one field or parameter, of an +animatable item. A parameter of an item is animated +by at most one channel. Thus, the create() methods will fail if +an attempt is made to create a channel of a field that already has +a channel (i.e. is already animated). Under similar conditions, the copy() +method will fail.

+

Currently a channel must contain at least one action (the base +action of the channel), and thus the create() method requires you to +supply this base action. You can modify this base action using the +link() method. The apply_warp() and remove_warp() methods modify the +timewarp actions applied to the base action of the channel. They +cannot affect the base action of the channel.

+

The num_applied_actions() method will tell you how many actions +are currently used by channel. This number will always be at +least 1, since a channel must be animated by at least a base action. +The applied_actions() will tell you which actions animate the channel. +applied_actions(1) is the base action, and applied_actions(2 to n) are +the timewarp actions, where n is num_applied_actions().

+
+
+animated_item(self: alias_api.AlChannel) alias_api.AlObject
+

This method returns the item that is being animated by this +AlChannel. The item can be any of the possible animatable items, +namely: AlDagNode, AlCurveCV, AlSurfaceCV, AlCamera, AlLight, +AlShader, AlTexture or AlEnvironment.

+
+ +
+
+applied_action(self: alias_api.AlChannel, n: int) AlAction
+

This method returns the ‘n’th action that is applied to this +channel. For example, if this channel is animated by action A as a +base action, and then three timewarps, T, A and T (note the reuse of +the same actions), then appliedAction(1) and appliedAction(3) will return +action A, and appliedAction(2) and appliedAction(4) will return action T.

+

If ‘n’ is less than 1, or greater than the number of actions +used by this channel (as returned by AlChannel::numAppliedActions()), +then NULL will be returned.

+
+
Parameters
+

n (int) – which action of the channel to return, where 1 refers to the +base action of the channel, and 2 to numAppliedActions() +refers to the channel’s timewarp actions.

+
+
Returns
+

The ‘n’th action of the channel.

+
+
Return type
+

AlAction

+
+
+
+ +
+
+applied_action_component(self: alias_api.AlChannel, n: int) alias_api.AlTripleComponent
+

This method returns the extract component that the channel +applies to the ‘n’th action. This method only makes sense +if the n’th action of the channel is an AlMotionAction. +If the action is an AlParamAction, or the channel does not have +a ‘n’ action, then kINVALID_COMPONENT is returned.

+

For example, if the channel is animated by the following actions,

+
+

AlMotionAction: A, kY_COMPONENT +AlParamAction: T1 +AlParamAction: T2

+
+

then this method will return kY_COMPONENT if ‘n’ is 1, +kINVALID_COMPONENT if ‘n’ is 2 or 3 (since these actions are AlParamActions, +and this method doesn’t make sense for those values of ‘n’), and +kINVALID_COMPONENT if ‘n’ is less than 1, or greater than numAppliedActions().

+
+
Parameters
+

n (int) – which action of the channel the extract component +should be determined for.

+
+
Returns
+

The extract component of the ‘n’th action of the channel.

+
+
Return type
+

AlTripleComponent

+
+
+
+ +
+
+apply_warp(self: alias_api.AlChannel) int
+

This method creates a new action and applies it as a timewarp +to this channel. The new action will be an AlParamAction, and will +have two keyframes, one at each of the min and max time of the range +of animation of the channel. The timewarp will be initially created +to have no effect on the channel (i.e. y = x, with kEXTRAP_IDENTITY +extrapolation types).

+
+
Returns
+

The status code result of the operation +Success - the application of the warp was successful. +InvalidObject - the channel was not valid +Failure - applying the warp failed. +InsufficientMemory - the new warp was not created.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+apply_warp_o(self: alias_api.AlChannel) AlParamAction
+

This method creates a new action and applies it as a timewarp +to this channel. The new action will be an AlParamAction, and will +have two keyframes, one at each of the min and max time of the range +of animation of the channel. The timewarp will be initially created +to have no effect on the channel (i.e. y = x, with kEXTRAP_IDENTITY +extrapolation types). The newly created action will be returned.

+
+ +
+
+channel_type(self: alias_api.AlChannel) alias_api.AlChannelDataType
+

This method returns a the type of channel (kAnimChannel or kExprChannel). +kUnknownChannel is returned if there is an error.

+
+ +
+
+copy(self: alias_api.AlChannel, anima: alias_api.AlAnimatable, field: int) alias_api.AlChannel
+

This method copies this channel, and applies the copied channel +to animating the given field of the given object. If the given object +is already animated by that field, this method will fail.

+

When the channel is copied, each action in the original channel will +be reused by the copy of the channel. This means that each of the actions +will now be referenced by at least two channels.

+

The new copy of the channel will be returned. If any error occurred +(for example object is already animated by the given field, or animating +this object would animate a motion path) then NULL will be returned.

+
+
Parameters
+
    +
  • anima (AlAnimatable) – the item to receive the new copy of the channel

  • +
  • field (int) – the field of the dag node that will be animated by the +new copy of the channel

  • +
+
+
Returns
+

The copied channel

+
+
Return type
+

AlChannel

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlChannel) alias_api.AlObject
+

This method makes a copy of the AlChannel. The returned +AlChannel will reference the same data as the original.

+
+
Returns
+

The copied AlChannel

+
+
Return type
+

AlObject

+
+
+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlChannel, arg0: alias_api.AlAnimatable, arg1: int, arg2: AlAction, arg3: alias_api.AlTripleComponent) -> int

    +
    +

    This method creates a new channel that will animate the given field +of the given object. The channel will be animated using the given +action as a base action. If the field of the object is already +animated (i.e. already has a channel), then this method will fail, and +a new channel will not be created. The channel will also not be created +if there is a motion path curve somewhere below this dag node.

    +
    +
    param anima
    +

    object that will be animated

    +
    +
    type anima
    +

    AlAnimatable

    +
    +
    param field
    +

    Field of animtable object to animate

    +
    +
    type field
    +

    int

    +
    +
    param action
    +

    Base action which the channel should use

    +
    +
    type action
    +

    AlAction

    +
    +
    param component
    +

    If the action is an AlMotionAction, this specifies +which component of the evaluation of the curve should be +used when evaluating the channel; if the action is not an +AlMotionAction, this argument is ignored.

    +
    +
    type component
    +

    AlTripleComponent

    +
    +
    return
    +

    The status code result of the operation +Success - channel was successfully created +InvalidArgument - either ‘dag_node’ or ‘action’ was NULL. +InvalidObject - channel was not created +AlreadyCreated - channel is already created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlChannel, anima: alias_api.AlAnimatable, field: int, sz_expr_text: str) -> int

    +
    +

    This method creates a new channel that will attach an expression +to the given field of the given object. If the field of the object +is already animated or has an expression attached to it (i.e. already +has a channel), then this method will fail, and a new channel will not +be created.

    +

    Note: +This method sends out an update message in order to have the +expression evaluated properly. As a result, creating a lot of +expressions could be a slow process.

    +
    +
    param anima
    +

    object that will be animated

    +
    +
    type anima
    +

    AlAnimatable

    +
    +
    param field
    +

    field of dag node to attach the expression

    +
    +
    type field
    +

    AlAction

    +
    +
    parm sz_expr_text
    +

    expression to be attached to the field

    +
    +
    type sz_expr_text
    +

    AlTripleComponent

    +
    +
    return
    +

    The status code result of the operation: +Success - channel was successfully created +sInvalidArgument - either ‘szExprText’ or ‘anima’ was NULL. +InvalidObject - channel was not created +AlreadyCreated - channel is already created +Expr{Errors} - errors from parsing the expression (see statusCodes.h)

    +
    +
    rype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
+
+ +
+
+delete_object(self: alias_api.AlChannel) int
+

This method deletes a channel. The actions that are used by +the channel will not be deleted.

+
+
Returns
+

The status code result of the operation +Success - the data for the AlChannel was successfully deleted +InvalidObject - the channel was not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+eval(self: alias_api.AlChannel, time: float) float
+

This method evaluates this channel at the given time, and returns +the value of the channel at that time. If the call can not be completed, +0.0 is returned.

+
+
Parameters
+

time (float) – the time at which to evaluate the channel

+
+
+
+ +
+
+expression_string(self: alias_api.AlChannel) str
+

If this channel is represented by an expression, this +method returns a string representing the expression.

+
+ +
+ +

This method replaces the base action of this channel with the +given action.

+

For example, if this channel is currently animated by action A, +then this method will remove action A from the channel, and replace it +by the given action ‘action’. This channel will now only be animated +by ‘action’.

+

If this channel is currently animated by three actions, a base +action A, and two timewarp actions T1 and T2, then this method will +replace the base action A with the given ‘action’ so that the channel +will now be animated by the base action ‘action’ and the two +timewarp actions T1 and T2.

+
+
Parameters
+
    +
  • action (AlAction) – the action with which the channel should replace its current base action

  • +
  • component (AlTripleComponent) – if the action is an AlMotionAction, this specifies +which component of the evaluation of the motion action curve +should be used when evaluating the channel; if the action is +not an AlMotionAction, this argument is ignored.

  • +
+
+
Returns
+

The status code result of the operation +Success - the link was successfully completed. +InvalidObject - the channel was not valid +Failure - an error occurred +InvalidArgument - the action was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+num_applied_actions(self: alias_api.AlChannel) int
+

This method returns the number of actions that this channel references +and uses for its evaluation. The return value will always be >= 1 +(except in the case of failure in which the return value is 0), +since the channel must be animated by at least one base action.

+

For example, if this channel is animated using base action A, and +two timewarp actions, T1 and T2, then this method will return 3.

+
+ +
+
+parameter(self: alias_api.AlChannel) int
+

This method returns the field of the item that is being animated +by this channel. The return value is cast from whatever enum type +corresponds to the animatable item, to an integer.

+

For example: If this channel is animating an AlDagNode, then this +method will return an AlDagNodeFields cast to an integer. +If this channel is animating an AlCamera, then this method will return +an AlCameraFields cast to an integer. If this channel is animating +an AlShader, AlTexture or an AlEnvironment, then this method will return +an AlShadingFields cast to an integer.

+

If the call could not be completed, -1 is returned.

+
+ +
+
+parameter_name(self: alias_api.AlChannel) str
+

This method returns a string that is a lexical name for the +parameter/field which this channel animates.

+
+ +
+
+remove_warp(self: alias_api.AlChannel, action: AlAction) int
+

This method removes the given ‘action’ from the channel as a timewarp. +For example, if the channel is currently animated by action A, followed +by ‘action’ as a first timewarp, and action T as a second timewarp, +then after this method has been invoked, the channel will be animated +by action A followed by action T.

+

If this channel is currently animated by action ‘action’ as a base +action, followed by four timewarps in the following order: T1, ‘action’, +‘action’, T2.

+

After this method has been invoked, the channel will be animated +by action ‘action’ as a base action, and three timewarps as follows: T1, +‘action’, T2.

+

Note that the base action cannot be removed from the channel by using this +method. Removing the base action (for example, by deleting the action), +will also cause the channel to be deleted. +:param action: the action to be removed from the channel’s list of timewarps. +:type action: AlAction

+
+
Returns
+

The status code result of the operation: +Success - the ‘action’ was successfully removed from the channel’s timewarp actions. +InvalidArgument - ‘action’ was invalid +InvalidObject - the channel was not valid +Failure - the ‘action’ was not being used as a timewarp by this channel

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+sample(self: alias_api.AlChannel) float
+

This method samples the channel without actually evaluating it. +The value of the current parameter is read without any updates +being done. The channel is sampled at the current time. This +method is faster than eval(), and is useful in cases where eval() +has already been called, either explicitly or through a viewFrame +operation.

+

If this method succeeds, it returns the value of the channel at +the current frame. If it fails, 0.0 is returned.

+
+ +
+
+type(self: alias_api.AlChannel) alias_api.AlObjectType
+

Returns the class identifier ‘ChannelType’.

+
+ +
+ +
+
+class alias_api.AlChannelDataType
+

The type of channel.

+

Members:

+
+

UnknownChannel

+

AnimChannel

+

ExprChannel

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlCloud
+

Interface to Alias clouds.

+

AlCloud is the interface to clouds and their data in Alias. +This class allows a developer to perform operations +such as creating, naming, controlling visibility, +setting transformations, picking, merging, tesselating and subsetting +a cloud of points. In addition, points can be added to +a cloud that was created with the API. Data access methods +to most of the settings are also provided. For example +you can find the current translation, scale or pick state etc.

+

The number of points in a cloud and the actual points can +be retrieved with the class. Please see the points() routine +for a description of the data structure used to retrieve points. +The same data structure is used in the add_points() method.

+

Importing a cloud of points is performed by the method +AlUniverse::importCloudFile(). Walking the cloud list +is performed with AlUniverse.first_cloud() in conjunction +with AlCloud:next_cloud(). Also apply_iterator_to_clouds() +can be used to walk all cloud elements.

+

Notes:

+
+

1. Tesselation of clouds will only work with CyberWare files. As +a result, clouds created with the API cannot be tesselated.

+
    +
  1. Clouds are not in the Alias dag tree.

  2. +
+

3. A cloud will not be an item on the Alias pick list. Therefore, +AlCloud pick methods must be used instead of AlPickList methods.

+

4. To add arbitrary points to a cloud, you must create a cloud +with the new points and merge it into the existing cloud that you +wish to grow. The cloud that is merged in will be +delete automatically in the merge process. The new extended cloud will +have the outer bounding box of the two clouds.

+

5. import_cloud_file() has a parameter which controls +the sampling factor when the cloud file is imported.

+
+
+
+copy_wrapper(self: alias_api.AlCloud) alias_api.AlObject
+

Return an exact duplicate of this AlCloud wrapper.

+
+ +
+
+delete_object(self: alias_api.AlCloud) int
+

Delete the AlCloud from the Alias Universe and return the status of the performed operation.

+
+ +
+
+property name
+

Get or set the AlCloud name.

+
+ +
+
+type(self: alias_api.AlCloud) alias_api.AlObjectType
+

Return the AlCloud type identifier.

+
+ +
+ +
+
+class alias_api.AlCluster
+

Encapsulates creation, deletion and manipulation of clusters.

+

This class encapsulates the functionality for creating, +manipulating and deleting a cluster. A cluster is a group of +dag nodes and/or curve and surface control points, which +are grouped as such for deformation purposes. Every cluster +has a cluster dag node which is in the universe’s dag. Adding and +removing nodes and control points to and from a cluster +does not affect the topology of the universe’s dag. +Transforming the cluster dag node affects the transformations +of the objects in the cluster.

+

Empty clusters are allowed. An object can be in more +than one cluster at a time, provided that those clusters are +of type kMultiCluster. When an object is added to +a cluster, it is given a weight that indicates how much +of the cluster’s leaf transformation is applied to the object. +The default weight is 100%. If a dag node is added to a +cluster the percentages of each individual CV may be manipulated +separately without actually adding the CVs themselves to the cluster.

+

To create a cluster, the user must instantiate and call +create on an AlCluster object. This also creates an AlClusterNode +which gets attached to the AlCluster and which is inserted +into the universe’s dag. The user may not instantiate an +AlClusterNode or an AlClusterMember directly.

+

There are two ways to delete a cluster object. When a cluster +is deleted, its attached cluster node is deleted. Alternatively, +when AlClusterNode.delete_object() is used, its cluster is deleted. +The dag nodes and control points in a cluster are not deleted, +however the AlClusterMember objects that represented the “in a +cluster” relation are invalidated.

+

Clusters don’t have names. Any attempts to query for a name +will return None.

+
+
+apply_iterator_to_members(self: alias_api.AlCluster, iterator: AlIterator, return_code: int) int
+

Apply the given iterator to each member o this cluster.

+
+ +
+
+cluster_node(self: alias_api.AlCluster) AlClusterNode
+

Return a pointer to the attached (parent) cluster node. The cluster node must exist.

+
+ +
+
+copy_wrapper(self: alias_api.AlCluster) alias_api.AlObject
+

Return an exact duplicate of this AlCluster wrapper.

+
+ +
+
+create(self: alias_api.AlCluster) int
+

Create a cluster and a cluster dag node. The cluster dag node is automatically added to the current universe.

+
+ +
+
+delete_object(self: alias_api.AlCluster) int
+

Delete the AlCluster from the Alias Universe and return the status of the performed operation.

+
+ +
+
+is_empty(self: alias_api.AlCluster) int
+

Return True if this cluster is empty (does not have any memebrs).

+
+ +
+
+next_cluster(self: alias_api.AlCluster) alias_api.AlCluster
+

Return a pointer to the cluster following this onei n the global cluster list.

+
+ +
+
+number_of_members(self: alias_api.AlCluster) int
+

Return the number of members in this cluster.

+
+ +
+
+prev_cluster(self: alias_api.AlCluster) alias_api.AlCluster
+

Return a pointer to the cluster preceding this onei n the global cluster list.

+
+ +
+
+type(self: alias_api.AlCluster) alias_api.AlObjectType
+

Return the AlCluster type identifier.

+
+ +
+ +
+
+class alias_api.AlClusterMember
+

Basic Interface to the object representing the relationship between an item and a cluster that it belongs to.

+

This class encapsulates the relationship that is cluster membership. +Whenever an object is placed into a cluster an AlClusterMember object +is created to represent the relationship.

+

Each AlClusterMember object knows the associated cluster object as well +as the geometry object which represents the item in the cluster. +Presently, this object can be an AlDagNode, AlSurfaceCV, AlCurveCV, or +AlPolysetVertex.

+

If an AlDagNode is a member of an AlCluster then every AlSurfaceCV, +AlCurveCV, or AlPolysetVertex that appears in the DAG hierarchy +underneath the AlDagNode is affected by the AlCluster.

+

For example, if you wanted to set the percentage effects of all CVs +that were affected by an AlCluster, you would use the first_member() +method from the AlCluster object, then walk along the AlClusterMember +list using the method next_cluster_member() in the AlClusterMember object. +Whenever you encountered an AlDagNode member (as determined by the code +fragment above) you would recursively walk down the dag node to find +all AlSurfaceCVs and AlCurveCVs below it in the dag.

+

The AlClusterMember object may not be created or destroyed directly. +The AlCluster object creates or destroys the AlClusterMember object +when the memberships of the AlCluster object change.

+

The print() method is an aid to debugging code. It prints the +current contents of the cluster member object.

+
+
+cluster(self: alias_api.AlClusterMember) alias_api.AlCluster
+

This method returns the cluster that this cluster member +belongs to.

+
+ +
+
+copy_wrapper(self: alias_api.AlClusterMember) alias_api.AlObject
+

Return an exact duplicate of this AlClusterMember wrapper.

+
+ +
+
+next_cluster_member(self: alias_api.AlClusterMember) alias_api.AlClusterMember
+

This function returns a pointer to the cluster member following +this one in the cluster. If this is the last one then NULL is returned.

+
+ +
+
+next_cluster_member_d(self: alias_api.AlClusterMember) int
+

Destructively points the current wrapper to the cluster member following +this one in the cluster.

+
+
Returns
+

The status code result of the operation +Success - the wrapper now points to the next cluster member +InvalidObject - the cluster member was invalid +Failure - there was no next cluster member

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+object(self: alias_api.AlClusterMember) alias_api.AlObject
+

This method returns the object that this cluster member references.

+
+ +
+
+prev_cluster_member(self: alias_api.AlClusterMember) alias_api.AlClusterMember
+

This function returns a pointer to the cluster member preceding +this one in the cluster. If this is the first one then NULL is +returned.

+
+ +
+
+prev_cluster_member_d(self: alias_api.AlClusterMember) int
+

Destructively points the current wrapper to the cluster member preceding +this one in the cluster.

+
+
Returns
+

The status code result of the operation +Success - the wrapper now points to the preceding cluster member +InvalidObject - the cluster member was invalid +Failure - there was no preceding cluster member

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+remove_from_cluster(self: alias_api.AlClusterMember, cluster: alias_api.AlCluster) int
+

Removes this cluster member from the cluster.

+
+
Parameters
+

cluster (AlCluster) – Is the cluster to be removed from

+
+
Returns
+

The status code result of the operation +Success - if everything successful +InvalidObject - if cluster is not valid +InvalidArgument - clusterMember was not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+type(self: alias_api.AlClusterMember) alias_api.AlObjectType
+

Return the AlClusterMember type identifier.

+
+ +
+ +
+
+class alias_api.AlClusterNode
+
+

The dag node class for clusters.

+

This class is a dag node class used specifically for clusters. +Every AlClusterNode object has an AlCluster attached to it. +(For more information on how AlCluster’s and AlClusterNode’s +work together, see the Class Description for the AlCluster object.)

+

To create a cluster node, the user must instantiate and call +the create method on an AlCluster object, which will automatically +create an AlClusterNode. The user cannot directly instantiate +an AlClusterNode.

+

A cluster node can be deleted in two ways. When a cluster node +is deleted, its associated cluster is deleted. When a

+
+

cluster is deleted, its cluster node is also deleted.

+
+
+cluster(*args, **kwargs)
+

Overloaded function.

+
    +
  1. cluster(self: alias_api.AlClusterNode) -> alias_api.AlCluster

  2. +
+

Return a pointer to the attached AlCluster object.

+
    +
  1. cluster(self: alias_api.AlClusterNode, arg0: alias_api.AlTM) -> alias_api.AlCluster

    +
    +

    Return the attached AlCluster object.

    +

    The AlTM will be updated with the cluster node’s transformation amtrix, if a cluster exists.

    +
    +
    param tm
    +

    The transform matrix.

    +
    +
    type tm
    +

    AlTM

    +
    +
    return
    +

    The attached AlCluster object.

    +
    +
    rtype
    +

    AlCluster

    +
    +
    +
    +
  2. +
+
+ +
+
+copy_wrapper(self: alias_api.AlClusterNode) alias_api.AlObject
+

Return an exact duplicate of this AlClusterNode wrapper.

+
+ +
+
+is_instanceable(self: alias_api.AlClusterNode) int
+

Return False. An AlClusterNode is not instanceable.

+
+ +
+
+type(self: alias_api.AlClusterNode) alias_api.AlObjectType
+

Return the AlClusterNode type identifier.

+
+ +
+ +
+
+class alias_api.AlClusterable
+

Encapsulates methods common to Alias objects which can belong to clusters.

+

This class is a base class for all objects which can be +contained in a cluster. It provides the methods necessary +to access the cluster methods of these objects.

+
+
+add_to_cluster(self: alias_api.AlClusterable, cluster: AlCluster, percentage: float) int
+

Adds this clusterable object to a cluster. This means +that all CV’s under this dag are affected by the cluster. +The percentage defines how much of the cluster’s +transformation is applied to the CVs under the dag node. +A value of 1.0 means that the object’s CVs are affected 100% +by the cluster leaf transformations.

+

The method may fail if unable to create a cluster member object, +or if the addition of the object would create a cycle of +clusters, or if the object to be added is already +in the cluster, or if the object to be added already has +an ancestor in the same target cluster.

+
+
Parameters
+
    +
  • cluster (AlCluster) – is the cluster to add this object to

  • +
  • percentage (float) – The extent of the effect of the cluster on the object’s CVs. +A value of 1.0 means 100%.

  • +
+
+
Returns
+

The status code result of the operation +Success - if everything was successful +InvalidArgument - cluster was None. +Failure - failed for one of the reasons outlined above +InvalidObject - the cluster was invalid +InsufficientMemory - if not enough memory

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+apply_iterator_to_clusters(self: alias_api.AlClusterable, iter: AlIterator) Tuple[int, int]
+

Apply the given iterator to all the clusters in this object. +See the documentation for AlIterator.

+

Warning: be careful when using this iterator. If you modify +the actual cluster during an iteration, it is possible that +this routine will end up pointing to invalid data and send you +garbage. This should not happen when simply applying transformations +to a cluster. But deleting a cluster using this method is considered +unsafe. If you do it, return immediately.

+
+
Parameters
+

iter (AlIterator) – the iterator to apply to each cluster

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation

+
+

Success - the application of the iterator terminated normally +Failure - the application of the iterator terminated abnormally +InvalidArgument - the iterator was None.

+
+
    +
  1. The return code of the last application of the iterator.

  2. +
+

+
+
Rype
+

AlStatusCode

+
+
+
+ +
+
+first_cluster(self: alias_api.AlClusterable) AlCluster
+

Finds and returns the first cluster of which this object is a member. +If no such cluster can be found, None is returned.

+
+ +
+
+is_cluster_member(self: alias_api.AlClusterable, cluster: AlCluster) AlClusterMember
+

Finds the AlClusterMember that corresponds to the relationship between +this object and the cluster object. None is returned if the +object is not a member of the cluster or the cluster is not valid.

+
+
Parameters
+

cluster (AlCluster) – Is the cluster object to be checked.

+
+
Returns
+

The cluster member object that corresponds to the relationship +between this object and the cluster object.

+
+
Return type
+

AlClusterMember

+
+
+
+ +
+
+next_cluster(self: alias_api.AlClusterable, last_custer: AlCluster) AlCluster
+

Finds and returns the cluster following the given one of which this +object is a member. If no such cluster can be found, None is returned.

+
+
Parameters
+

last_cluster (AlCluster) – Cluster to walk forward from

+
+
Returns
+

Next cluster of which this object is a member

+
+
Return type
+

AlCluster

+
+
+
+ +
+
+next_cluster_d(self: alias_api.AlClusterable, last_custer: AlCluster) int
+

Destructively sets the passed in cluster to the next cluster +for the given object. If this can not be accomplished, the passed +in cluster is unaffected.

+
+
Parameters
+

last_cluster (AlCluster) – Cluster to walk forward from

+
+
Returns
+

The status code result of the operation +Success - the cluster now points to the next cluster +InvalidArgument - ‘lastCluster’ was invalid or None +Failure - there was no next cluster

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+percent_effect(self: alias_api.AlClusterable, cluster: AlCluster) float
+

Returns the percentage effect the given cluster has on this object. +If the call fails, 0.0 is returned.

+
+
Parameters
+

cluster (AlCluster) – Is the cluster whose percentage effect is to be found

+
+
Returns
+

The percentage effect of the cluster on this object

+
+
Return type
+

float

+
+
+
+ +
+
+prev_cluster(self: alias_api.AlClusterable, last_custer: AlCluster) AlCluster
+

Finds and returns the cluster preceding the given one of which this +object is a member. If no such cluster can be found, None is returned.

+
+
Parameters
+

last_cluster (AlCluster) – Cluster to walk forward from

+
+
Returns
+

Previous cluster of which this object is a member

+
+
Return type
+

AlCluster

+
+
+
+ +
+
+prev_cluster_d(self: alias_api.AlClusterable, last_custer: AlCluster) int
+

Finds and returns the cluster preceeding the given one of which this +object is a member. If no such cluster can be found, None is returned.

+
+
Parameters
+

last_cluster (AlCluster) – Cluster to walk forward from

+
+
Returns
+

The status code result of the operation +Success - the cluster now points to the previous cluster +InvalidArgument - ‘lastCluster’ was invalid or None +Failure - there was no previous cluster

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+remove_from_all_clusters(self: alias_api.AlClusterable) int
+

Removes this object from all clusters in the universe that it +may be in.

+
+
Returns
+

The status code result of the operation +Success - the object was successfully removed from all clusters. +InvalidArgument - the object was not valid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+remove_from_cluster(self: alias_api.AlClusterable, cluster: AlCluster) int
+

Removes this object from the cluster.

+
+
Parameters
+

cluster (AlCluster) – The cluster to remove this object from.

+
+
Returns
+

The status code result of the operation +Success - if everything successful +InvalidObject - if the cluster is not valid +InvalidArgument - clustobj was not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_percent_effect(self: alias_api.AlClusterable, cluster: AlCluster, percentage: float) int
+

Sets the percentage effect the given cluster has on all things +below this object.

+
+
Parameters
+
    +
  • cluster (AlCluster) – is the cluster whose percentage effect is to be set

  • +
  • percentage (float) – the extent of the effect of the cluster

  • +
+
+
Returns
+

The status code result of the operation +Success - if everything successful +InvalidArgument - ‘clustobj’ was None. +Failure - if the percentage effect setting failed +InvalidObject - the cluster was not valid

+
+
+
+ +
+ +
+
+class alias_api.AlConicAttributes
+

Interface to Alias conic curve attributes.

+

AlConicAttributes is a class derived from the AlAttributes class. +This class allows access to the attributes for a conic section.

+

Conics may not be created. They may be brought into Alias +through the IGES interface though.

+

A conic is one of ellipse, hyperbola, parabola, circle, or +line. Conics exist in the XY plane and are defined by the +equation: A * X^2 + B * X * Y + C * Y^2 + D * X + E * Y + F = 0.

+
+
+center_point(self: alias_api.AlConicAttributes) Tuple[int, float, float]
+

Returns the center point for a conic.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the center point was successfully returned. +InvalidObject - the attr

+
+
    +
  1. the center point x coordinate

  2. +
  3. the center point y coordinate

  4. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float]

+
+
+
+ +
+
+coefficients(self: alias_api.AlConicAttributes) Tuple[int, float, float, float, float, float, float]
+

Determine the coefficients for the Conic, where the Conic +is defined by the equation

+

A * X^2 + B * X * Y + C * Y^2 + D * X + E * Y + F = 0

+
+
Returns
+

A tuple containg: +(1) the status code result:

+
+

Success - coefficients were successfully returned. +InvalidObject - the attribute was invalid +Failure - an error occurred

+
+
    +
  1. c_a - the coefficient A

  2. +
  3. c_b - the coefficient B

  4. +
  5. c_c - the coefficient C

  6. +
  7. c_d - the coefficient D

  8. +
  9. c_e - the coefficient E

  10. +
  11. c_f - the coefficient F

  12. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float, float, float, float]

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlConicAttributes) alias_api.AlObject
+

This method makes a copy of the AlConicAttributes. The returned +AlConicAttributes will reference the same data as the original.

+
+ +
+
+end_point(self: alias_api.AlConicAttributes) Tuple[int, float, float]
+

This method determines the end point for a conic. Note +that for an ellipse the direction of the desired elliptical +arc is counterclockwise.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid. +Failure - an eror occured

+
+
    +
  1. the end point x coordinate

  2. +
  3. the end point y coordinate

  4. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float]

+
+
+
+ +
+
+form(self: alias_api.AlConicAttributes) alias_api.AlConicType
+

Returns the type of the conic (AlConicType).

+

One of Ellipse, Hyperbola, Parabola, Circle, or Line may be +returned. NoConic may be returned if the attribute is no +longer active or there is an error.

+
+ +
+
+start_point(self: alias_api.AlConicAttributes) Tuple[int, float, float]
+

This method determines the start point for a conic. Note +that for an ellipse the direction of the desired elliptical +arc is counterclockwise.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid. +Failure - an eror occured

+
+
    +
  1. the start point x coordinate

  2. +
  3. the start point y coordinate

  4. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float]

+
+
+
+ +
+
+transform(self: alias_api.AlConicAttributes) Tuple[int, alias_api.AlTM]
+

This method returns the transformation matrix which +transforms the 2D conic into 3D.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the transform was successfully returned. +InvalidObject - the attribute was invalid. +Failure - an eror occured

+
+
    +
  1. the resulting transformation matrix

  2. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), AlTM]

+
+
+
+ +
+
+type(self: alias_api.AlConicAttributes) alias_api.AlObjectType
+

Returns the class identifier ‘ConicAttributeType’.

+
+ +
+
+z_displacement(self: alias_api.AlConicAttributes) float
+

This method returns the displacement for the +conic along the Z axis.

+
+ +
+ +
+
+class alias_api.AlConicType
+

The type of conic curve.

+

Members:

+
+

NoConic

+

Ellipse

+

Hyperbola

+

Parabola

+

Circle

+

Line

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlConstructionEntity
+

Base class for Alias construction entities.

+

This base class encapsulates methods common to Alias construction entities. These +entities include space points, curve points, surface points, curve on surface points, +construction planes and construction vectors. +Construction points have similiarities to locator objects. A major difference +between construction points and locators is that construction points will be on +the Alias pick list. The AlPickList class can be used to retrieve picked +construction entity objects. As you will see below, the AlConstructionEntity +class multiply inherits from the AlPickable class.

+

This class contains methods for deleting, and naming locators. +In addition, methods are available for working with layers and for changing +invisibility and templated modes.

+

As in the locator objects, if a construction entity is dependent on an object +that is deleted, it will also be removed.

+

The construction entity hierarchy is the following:

+
+
+
+
+
+
+
AlConstructionEntity
+

+
+
+
+
+
+
| |
+
+
+
+
AlPoint AlConstructionVector AlConstructionPlane
+

+
+
+
+
+
+
| | |
+
+
+

Space Curve Surface Curve On Surface

+
+

The AlPoint class cannot be instantiated.

+
+
+copy_wrapper(self: alias_api.AlConstructionEntity) alias_api.AlObject
+

Return an exact duplicate of this AlConstructionEntity wrapper.

+
+ +
+
+delete_object(self: alias_api.AlConstructionEntity) int
+

Delete the AlConstructionEntity from the Alias Universe and return the status of the performed operation.

+
+ +
+
+property invisible
+

Get or set the AlConstructionEntity invisibility.

+
+ +
+
+property layer
+

Get or set the AlConstructionEntity layer.

+
+ +
+
+property name
+

Get or set the AlConstructionEntity name.

+
+ +
+
+templated(self: alias_api.AlConstructionEntity) int
+

On successfully checking the entity, return 1 if the AlConstructionEntity depends on anoather object which is templated, else return 0. On failure to check, return -1.

+
+ +
+
+type(self: alias_api.AlConstructionEntity) alias_api.AlObjectType
+

Return the AlConstructionEntity type identifier.

+
+ +
+ +
+
+class alias_api.AlConstructionPlane
+

Interface to Alias construction planes.

+

This class provides functionality for creating, manipulating and +querying Alias construction planes. Construction planes can be +specified several ways.

+

3 Points - The first 2 points specify the X axis. The first and last points +specifiy a line that is used in the cross product with the x axis to +provide the Z axis. Once the Z is known, the Y axis is calculated +internally.

+

2 points and a normal - The first 2 points specify the X axis. The normal +is the Z axis to the plane.

+

This class provides access to the points used to create the construction +plane( end may be NULL depending on the specification), transformation +and axes information.

+
+
+copy_wrapper(self: alias_api.AlConstructionPlane) alias_api.AlObject
+

Return an exact duplicate of this AlConstructionPlane wrapper.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlConstructionPlane, first: AlPoint, second: AlPoint, third: AlPoint) -> int

    +
    +

    Create a construction plane specified by 3 points. The +first 2 points specific the X axis. The first and last point +specify a line that is used in the cross product with the X +axis to calculate the Z axis.

    +
    +
    return
    +

    The status code result of the operation: +Success - the construction plane was created +Failure - the method failed +InvalidArgument - first, second, or third are either NULL

    +
    +

    or invalid or at least 2 point to the same Alias object

    +
    +

    AlreadyCreated - object is already created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlConstructionPlane, first: AlPoint, second: AlPoint, normal_x: float, normal_y: float, normal_z: float) -> int

    +
    +
    +
    return
    +

    The status code result of the operation: +Success - the construction plane was created +Failure - the method failed +InvalidArgument - first, second, or third are either NULL

    +
    +

    or invalid or at least 2 point to the same Alias object

    +
    +

    AlreadyCreated - object is already created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
  5. create(self: alias_api.AlConstructionPlane, first_x: float, first_y: float, first_z: float, second_x: float, second_y: float, second_z: float, normal_x: float, normal_y: float, normal_z: float) -> int

    +
    +
    +
    return
    +

    The status code result of the operation: +Success - the construction plane was created +Failure - the method failed +InvalidArgument - first, second, or third are either NULL

    +
    +

    or invalid or at least 2 point to the same Alias object

    +
    +

    AlreadyCreated - object is already created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  6. +
+
+ +
+
+first(self: alias_api.AlConstructionPlane) AlPoint
+

Returns the first point of the construction plane.

+

None is returned if the method failed.

+
+ +
+
+second(self: alias_api.AlConstructionPlane) AlPoint
+

Returns the second point of the construction plane.

+

None is returned if the method failed.

+
+ +
+
+third(self: alias_api.AlConstructionPlane) AlPoint
+

Returns the third point of the construction plane.

+

None is returned if the method failed.

+
+ +
+
+type(self: alias_api.AlConstructionPlane) alias_api.AlObjectType
+

Return the AlConstructionPlane type identifier.

+
+ +
+ +
+
+class alias_api.AlCoordinateSystem
+

The coordinate system.

+

Members:

+
+

YUp

+

ZUp

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlCopyOptions
+

Copy options for AlDagNode.

+
+
+copy_animation(self: alias_api.AlCopyOptions) int
+

Return True if copying of an AlDagNode’s animation is enabled.

+
+ +
+
+copy_clusters(self: alias_api.AlCopyOptions) int
+

Return True if the new copies of clusters should be made of clusters which reference geometry below the AlDagNode.

+
+ +
+
+instance_copy(self: alias_api.AlCopyOptions) int
+

Return True if the copies are to be instances of the AlDagNode rather than new objects.

+
+ +
+
+num_copies(self: alias_api.AlCopyOptions) int
+

Return the number of copies to be created. Zero will be returned if the AlCopyOptions object was not properly created.

+
+ +
+
+rotation(self: alias_api.AlCopyOptions) Tuple[int, float, float, float]
+

Return the rotation which will be applied to copies of the AlDagNode.

+
+ +
+
+scale(self: alias_api.AlCopyOptions) Tuple[int, float, float, float]
+

Return the scale which will be applied to copies of the AlDagNode.

+
+ +
+
+set_copy_animation(self: alias_api.AlCopyOptions, animation: int) int
+

If ‘animation’ is True, animation on the AlDagNode will be copied.

+
+ +
+
+set_copy_clusters(self: alias_api.AlCopyOptions, clusters: int) int
+

If ‘clusters’ is True, new copies of clusters will be created for clusters which reference geometry below the AlDagNode.

+
+ +
+
+set_instance_copy(self: alias_api.AlCopyOptions, instance: int) int
+

If ‘instance’ is True, instances of the AlDagNode will be created rather than new objects.

+
+ +
+
+set_num_copies(self: alias_api.AlCopyOptions, arg0: int) int
+

Sets the number of copies to create.

+
+ +
+
+set_rotation(self: alias_api.AlCopyOptions, x: float, y: float, z: float) int
+

Set the rotation which will be applied to copies of the AlDagNode.

+
+ +
+
+set_scale(self: alias_api.AlCopyOptions, x: float, y: float, z: float) int
+

Set the scale which will be applied to copies of the AlDagNode.

+
+ +
+
+set_time_offset(self: alias_api.AlCopyOptions, arg0: float) int
+

Sets the time offset for copies when copying animation.

+
+ +
+
+set_translation(self: alias_api.AlCopyOptions, x: float, y: float, z: float) int
+

Set the translation which will be applied to copies of the AlDagNode.

+
+ +
+
+time_offset(self: alias_api.AlCopyOptions) float
+

Return the time offset for the copies if animation is being copied.

+
+ +
+
+translation(self: alias_api.AlCopyOptions) Tuple[int, float, float, float]
+

Return the translation which will be applied to copies of the AlDagNode.

+
+ +
+ +
+
+class alias_api.AlCurve
+

Interface to Alias nurbs curves geometry.

+

AlCurve is the interface to the geometric data of Alias’ NURBS +curve objects. To create a curve, first instantiate and create +an AlCurve and then instantiate and create an AlCurveNode. You +can’t do much with an AlCurve that doesn’t have an AlCurveNode.

+

For more information on how to create the curve geometry, see the +description for the create() method.

+

A curve form can be one of three types: periodic, closed or open. +If a curve is “Periodic”, is t itangent continuous at all points +on the curve and its endpoints are coincident. If a curve is +“Closed”, it is not periodic but its +endpoints are coincident. If the curve is neither closed nor +periodic, it is considered to be “Open”.

+

There are two ways to delete an AlCurve. If the AlCurve destructor +is called, the attached AlCurveNode is deleted. If the AlCurveNode +destructor is called, the attached AlCurve is deleted.

+

You should always create a curve node for a curve. If you create +a curve with no curve node, the curve is not added to the +universe. If you should lose the pointer to the curve, it will +become lost memory.

+

There is one limitation to this class: you cannot add or remove +individual curve control points (except by changing multiplicity).

+

Curves are made of curve control points (or CV’s) which you can +traverse as a list by using AlCurve.first_cv() plus the AlCurveCV +methods. You can also pack the curve information into an array +using methods in this class.

+

What is multiplicity?

+

An AlCurveCV object can actually represent multiple CV’s, depending +on the AlCurveCV’s multiplicity and periodicity. Notice that in +this class there are two sets of methods - some “incl_multiples” +and some not (namely “number_of_cvs”, “cvs_world_position”, +“cvs_unaffected_position”, etc). The set of methods without +multiplicity lets you get all curve CV’s where a curve CV can have +multiplicity of 1, 2 or 3. The set of methods “incl_multiples” +lets you get ALL curve CV’s including multiples due to a multiplicity +> 1 and due to periodicity.

+

Example 1:

+

If you create a curve in the interactive Alias package with +4 CV’s and change the multiplicity of the second CV to 2 (using +the “multiplicity” menu item in the Curve Tools menu), then:

+
    +
  1. number_of_cvs() will return 4.

  2. +
  3. cvs_world_position must be passed a 4x4 CVs matrix, and a +multiplicity vector of length 4.

  4. +
  5. cvs_unaffected_position() must be passed the same as item 2.

  6. +
  7. set_cvs_unaffected_position() must be passed the same as item 2.

  8. +
  9. number_of_cvs_incl_multiples() will return 5.

  10. +
  11. cvs_world_position_incl_multiples() must be passed a 5x4 CVs matrix. +You will notice that the 2nd and 3rd points in this matrix are +the same.

  12. +
  13. cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +You will notice that the 2nd and 3rd points in this matrix are +the same.

  14. +
  15. set_cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +The matrix you pass in should have the 2nd and 3rd points the +same. What really happens in this method is that the 3rd +point is given the same value as the 2nd point. +(What you give as the 3rd point is ignored).

  16. +
+

Example 2:

+

If you create a curve in the interactive Alias +package with 4 CV’s and “close” the curve (using the +“close” menu item in the Object Tools menu), you create a periodic +curve. Then:

+
    +
  1. number_of_cvs() will return 4.

  2. +
  3. cvs_world_position must be passed a 4x4 CVs matrix, and a +multiplicity vector of length 4.

  4. +
  5. cvs_unaffected_position() must be passed the same as item 2.

  6. +
  7. set_cvs_unaffected_position() must be passed the same as item 2.

  8. +
  9. number_of_cvs_incl_multiples() will return 7.

  10. +
  11. cvs_world_position_incl_multiples() must be passed a 7x4 CVs matrix. +You will notice that in this matrix the 5th, 6th and 7th points +are the same as the 1st, 2nd and 3rd points respectively.

  12. +
  13. cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +You will notice that in this matrix the 5th, 6th and 7th points +are the same as the 1st, 2nd and 3rd points respectively.

  14. +
  15. set_cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +The matrix you pass in should have the 5th, 6th and 7th points +the same as the 1st, 2nd and 3rd points respectively. +What really happens in this method is that the 5th, 6th and 7th +points are assigned the same values as the 1st, 2nd and 3rd +points respectively. (What you give for the 5th, 6th and 7th +points are ignored).

  16. +
+
+
+adjust_end_span(self: alias_api.AlCurve, new_knot_span: float) int
+

Change the knot spacing of the last span of the curve leaving the +remainder of the curve unchanged. The end point of the last span is +preserved.

+
+
Parameters
+

new_knot_span (float) – The knot spacing for the end span.

+
+
Returns
+

The status code result of the operation: +InvalidObject - the curve is an invalid object +Success - the method worked +Failure - the curve did not have at least one span, failed to adjust

+
+

the end span

+
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+append(self: alias_api.AlCurve, pos: List[float[4]], type: alias_api.AlPointType) int
+

Append a CV or an edit point to the curve.

+
+
Parameters
+
    +
  • pos (List[float] (length 4)) – position in world space of new point

  • +
  • type (AlPointType (CV or EditPoint)) – The type of point to append.

  • +
+
+
Returns
+

The status code result of the operation: +Success - new point was successfully appended +InvalidObject - the given object is not valid +InvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+apply_iterator_to_cvs(self: alias_api.AlCurve, iter: AlIterator) Tuple[int, int]
+

Apply the given iterator to all the CVs in this class. +See the documentation for AlIterator.

+
+
Parameters
+

iter (AlIterator) – the iterator to apply to each CV

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the iterator exited normally +Failure - the iterator exited abnormally +sInvalidArgument - the iterator ‘iter’ was None +InvalidObject - the curve was not valid

+
+
    +
  1. The last return code from the iterator

  2. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlCurve) alias_api.AlObject
+

Return an exact duplicate of this AlCurve object.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlCurve, deg: int, form: alias_api.AlCurveFormType, num_knots: int, knot_vector: List[float], num_control_pts: int, control_point: List[List[float[4]]], multiplicity: List[int]) -> int

    +
    +

    This method is used to create the geometric data that represents +this curve.

    +

    Alias curves are represented by an array of knots and an array +of control points (for a detailed understanding of nurbs curves see +“An Introduction to Splines for use in Computer Graphics and +Geometric Modeling” by Bartels, Beatty and Barsky. aka The Killer B’s.). +The number of spans in a curve is determined by the degree of the +curve and the number of control points, namely there are +‘num_control_pts’ - ‘deg’ spans. Knot values are associated with the +ends of each span. Therefore, ‘num_knots’ must be equal to +‘number of spans + 1’.

    +

    The expert will notice that ‘num_knots’ = ‘number of spans + 1’ +does not give us enough knots to specify all the basis functions +properly. (The correct number of knots required, according to +the Killer B’s are numSpans + 2*degree + 1). However since Alias +piles knots up at the extreme ends of an open nurbs curve (in order +to force the curve to touch each end control point) this method +does not require that the user specify the redundant knot values. +For example, if the knot vector for a three span open curve contained +the knot values [0 1 2 3], the real knot vector would be +[0 0 0 0 1 2 3 3 3 3]. +In the case of a periodic curve the values of the knots can be +determined implicitly from the knots values provided and again don’t +need to be provided explicitly. For example, if the knot vector for a +four span periodic curve contained the knot values [-1 1 2 5 10], the +real knot vector would be [-10 -9 -6 -1 1 2 5 10 12 13 16].

    +

    If this object was previously referencing some other curve, and this call +succeeds, this object will reference the new curve.

    +

    For more information on multiplicity, see the Class Description.

    +

    When you create a curve, you must ensure the following

    +
    +
      +
    • Open and closed curves must have at least one span.

    • +
    • Periodic curves require that there be at least 3 spans.

    • +
    • ‘num_knots’ must be equal to ‘number of spans + 1’

    • +
    • The knot values must be a non-decreasing sequence of values.

    • +
    • +
      The first and last span must not be vacuous. That is

      knot_vector[0] < knot_vector[1] and knot_vector[num_knots-2] < knot_vector[num_knots-1]

      +
      +
      +
    • +
    • Any knot multiplicity must not exceed the degree of the curve.

    • +
    • +
      Periodic curves also require that the number of spans be greater than

      or equal to the degree of the curve.

      +
      +
      +
    • +
    • +
      For open/closed curves the number of control points is

      the number of spans + degree. (ex. one span requires four +control points)

      +
      +
      +
    • +
    • +
      For periodic curves the number of control points is the same as

      the number of spans. It isn’t necessary to specify any of the +overlapping control points.

      +
      +
      +
    • +
    • +
      All multiplictiy values must be 1, 2 or 3. The first and last

      multiplicity values must be 1.

      +
      +
      +
    • +
    +
    +
    +
    param deg
    +

    The degree of the curve.

    +
    +
    type deg
    +

    int

    +
    +
    param form
    +

    Open, Closed or Periodic.

    +
    +
    type form
    +

    curveFormType (Open, Closed or Periodic).

    +
    +
    param num_knots
    +

    The number of knots in the knot_vector.

    +
    +
    type num_knots
    +

    int

    +
    +
    param knot_vector
    +

    The sequence of knot values. Must be of length num_knots.

    +
    +
    type knot_vector
    +

    List

    +
    +
    param num_control_pts
    +

    The number of points in control_point.

    +
    +
    type num_control_pts
    +

    int

    +
    +
    param control_point
    +

    The array of control points. Must have size +of num_control_pts * 4.

    +
    +
    type control_point
    +

    List[List[float]]

    +
    +
    param multiplicity
    +

    The multiplicity values. Must be of length +num_control_pts. Assumed to be an array of 1’s if None.

    +
    +
    type multiplicity
    +

    int

    +
    +
    return
    +

    The status code result of the operation: +Success - All ok. +InsufficientMemory - Ran out of memory. +InvalidArgument - a None argument was supplied. +Failure - did not work.

    +
    +
    rtype
    +

    int

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlCurve, deg: int, form: alias_api.AlCurveFormType, knot_vector: List[float], num_control_pts: int, control_points: List[List[float[4]]]) -> int

    +
    +

    This method is used to create the geometric data that represents +this curve according to the standard Killer B’re representation.

    +

    This method shall be documented by noting its differences from the other +create method.

    +

    This method assumes that the size of the number of knots passed in the +knot vector is always num_control_pts - deg + 1 (or +numSpans + 2*deg + 1, if you prefer, where +numSpans = num_control_pts - deg). That is, the redundant end knots +must be specified.

    +

    This method assumes that: +If this object was previously referencing some other curve, and this call +succeeds, this object will reference the new curve.

    +

    For more information on multiplicity, see the Class Description.

    +
    +
    When you create a curve, you must ensure the following
      +
    • Open and closed curves must have at least one span.

    • +
    • Periodic curves require that there be at least 3 spans.

    • +
    • the number of knot values must be equal to ‘num_control_pts - deg + 1’

    • +
    • The knot values must be a non-decreasing sequence of values.

    • +
    • Any knot multiplicity must not exceed the degree of the curve.

    • +
    • +
      Periodic curves also require that the number of spans be greater than

      or equal to the degree of the curve.

      +
      +
      +
    • +
    • +
      For open/closed/periodic curves the number of control points is

      the number of spans + degree. (ex. one span requires four +control points).

      +
      +
      +
    • +
    • +
      For periodic curves it is necessary to specify the overlapping

      control points.

      +
      +
      +
    • +
    +
    +
    +

    :param deg - The degree of the curve. +:type deg: int +:param form: The curve form type. +:type form: curveFormType (Open, Closed or Periodic) +:param knot_vector: The sequence of knot values. Must be of length

    +
    +

    num_control_pts + deg + 1.

    +
    +
    +
    type knot_vector
    +

    List[float] (len=num_control_pts - deg + 1)

    +
    +
    param num_control_pts
    +

    The number of points in control_point.

    +
    +
    type num_control_pts
    +

    int

    +
    +
    param control_point
    +

    The array of control points. Must have size +of num_control_pts * 4.

    +
    +
    type control_point
    +

    List[List[float]]

    +
    +
    return
    +

    The status code result of the operation: +Success - All ok. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied. +Failure - did not work.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+create_arc(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create_arc(self: alias_api.AlCurve, start: List[float[3]], end: List[float[3]], other: List[float[3]], circle: int) -> int

    +
    +

    This method is used to create a circular arc using attributes.

    +

    This method is simpler than the previous create method, +requiring only to specify three points on the curve and +whether the curve should be closed to form a circle. +To modify the curve you should retrieve its attributes with +the firstAttribute() method and use the appropriate AlAttribute +methods to modify it. Modifying the CVs directly will cause the +attributes to be deleted.

    +
    +
    param start
    +

    the coordinates for the start of the curve.

    +
    +
    type start
    +

    List[float] (len=3)

    +
    +
    param end
    +

    the coordinates for the end of the curve.

    +
    +
    type end
    +

    List[float] (len=3)

    +
    +
    param other
    +

    an additional point defining the arc.

    +
    +
    type other
    +

    List[float] (len=3)

    +
    +
    param circle
    +

    if True then a circle will be generated.

    +
    +
    type circle
    +

    bool

    +
    +
    return
    +

    The status code result of the operation: +Success - All ok. +Failure - Failed to create the curve. +sInsufficientMemory - Ran out of memory. +sAlreadyCreated - the AlCurve has already been created +sInvalidArgument - a None argument was supplied

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. create_arc(self: alias_api.AlCurve, C: List[float[3]], N: List[float[3]], P: List[float[3]], r: float, a0: float, a1: float, dim: int, make_cubic: int) -> int

    +
    +

    Create a circular arc between two angles.

    +

    If dim = 2, N is ignored. +Point P with zero angle must not be at C. +Returns None if arc has no length +3D:

    +
    +

    a0 < a1 and a1-a0 <= 2*PI. +Returns a full circle if a1-a0 > 2*PI. +To build a carc in the other direction, reverse N.

    +
    +
    +
    2D:

    |a1-a0| <= 2*PI. +If a0 < a1 arc is counter clockwise else arc is clockwise. +Returns a full circle if |a1-a0| > 2*PI.

    +
    +
    +
    +
    param C
    +

    center

    +
    +
    type C
    +

    List[float]

    +
    +
    param N
    +

    normal to plane of arc (if 3D)

    +
    +
    type N
    +

    List[float]

    +
    +
    param P
    +

    point with zero angle

    +
    +
    type P
    +

    List[float]

    +
    +
    param r
    +

    radius

    +
    +
    type r
    +

    float

    +
    +
    param a0
    +

    inital angles (in radians)

    +
    +
    type a0
    +

    float

    +
    +
    param a1
    +

    final angles (in radians)

    +
    +
    type a1
    +

    float

    +
    +
    param dim
    +

    dimension 2 or 3

    +
    +
    type dim
    +

    int

    +
    +
    param make_cubic
    +

    if true, raise degree to 3

    +
    +
    type make_cubic
    +

    bool

    +
    +
    return
    +

    The status code result of the operation: +InvalidArgument - a bad argument was supplied +Failure - Failed to create the curve. +Success - All ok.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+create_conic(self: alias_api.AlCurve, c_a: float, c_b: float, c_c: float, c_d: float, c_e: float, c_f: float, start: List[float[3]], end: List[float[3]]) int
+

This method is used to create a conic arc using attributes. +This method is simpler than the previous create method, +requiring users only to specify the coefficients of the conic +and the beginning and end of the curve. The start and +end points must lie on the conic.

+

The conic is described by the equation

+

A * X^2 + B * X * Y + C * Y^2 + D * X + E * Y + F = 0

+

The conic will be created in the XY plane.

+

It is not possible to modify a conic curve through its +attributes.

+
+
Parameters
+
    +
  • c_f (c_a through) – coefficient of the conic.

  • +
  • start (List[float] (len=3)) – the coordinates for the start of the curve.

  • +
  • end (List[float] (len=3)) – the coordinates for the end of the curve.

  • +
+
+
Returns
+

The status code result of the operation: +Success - All ok. +Failure - Failed to create the curve. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied +sAlreadyCreated - the AlCurve has already been created

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+create_ellipse(self: alias_api.AlCurve, center: List[float[3]], major_axis: List[float[3]], minor_axis: List[float[3]], start: List[float[3]], end: List[float[3]]) int
+

This method is used to create an elliptical arc using attributes. +This method is simpler than the previous create method, +requiring users only to specify the center, major axis, and +minor axis of the ellipse and the beginning and end of the curve. +The start and end points must lie on the ellipse and be specified +in a counterclockwise order to indicate the arc. The axes must +be perpendicular to each other.

+

When creating an elliptical arc, the axes MUST be specified in +the XY plane.

+

It is not possible to modify an elliptical curve through its +attributes.

+

It is not possible to create a closed curve with this method, +hence it will always fail for AlFace’s.

+
+
Parameters
+
    +
  • center (List[float] (len=3)) – the center of the ellipse.

  • +
  • major_axis (List[float] (len=3)) – the focus of the ellipse.

  • +
  • minor_axis (List[float] (len=3)) – the focus of the ellipse.

  • +
  • start (List[float] (len=3)) – the coordinates for the start of the curve.

  • +
  • end (List[float] (len=3)) – the coordinates for the end of the curve.

  • +
+
+
Returns
+

The status code result of the operation: +Success - All ok. +Failure - Failed to create the curve. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied. +sAlreadyCreated - the AlCurve has already been created

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+create_hyperbola(self: alias_api.AlCurve, center: List[float[3]], major_axis: List[float[3]], minor_axis: List[float[3]], start: List[float[3]], end: List[float[3]]) int
+

This method is used to create a hyperbolic arc using attributes. +This method is simpler than the previous create method, +requiring users only to specify the center, major axis, and +minor axis of the hyperbola and the beginning and end of the curve. +The start and end points must lie on the ellipse and be specified +in a counterclockwise order to indicate the arc. The axes must +be perpendicular to each other.

+

The hyperbola will be created in the XY plane.

+

It is not possible to modify a hyperbolic curve through its +attributes.

+
+
Parameters
+
    +
  • center (List[float] (len=3)) – the center of the hyperbola.

  • +
  • major_axis (List[float] (len=3)) – the focus of the hyperbola.

  • +
  • minor_axis (List[float] (len=3)) – the focus of the hyperbola.

  • +
  • start (List[float] (len=3)) – the coordinates for the start of the curve.

  • +
  • end (List[float] (len=3)) – the coordinates for the end of the curve.

  • +
+
+
+

Return code: +:return: The status code result of the operation:

+
+

Success - All ok. +Failure - Failed to create the curve. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied. +sAlreadyCreated - the AlCurve has already been created

+
+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+create_line(self: alias_api.AlCurve, start: List[float[3]], end: List[float[3]]) int
+

This method is used to create straight lines using attributes.

+

This method is simpler than the previous create method, +requiring only to specify the beginning and end of the curve. +To modify the curve you should retrieve its attributes with +the firstAttribute() method and use the appropriate AlAttribute +methods to modify it. Modifying the CVs directly will cause the +attributes to be deleted.

+
+
Parameters
+
    +
  • start (List[float] (len=3)) – the coordinates for the start of the curve.

  • +
  • end (List[float] (len=3)) – the coordinates for the end of the curve.

  • +
+
+
Returns
+

The status code result of the operation: +Success - All ok. +Failure - Failed to create the curve. +sInvalidArgument - start or end was None +sInsufficientMemory - Ran out of memory.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+create_parabola(self: alias_api.AlCurve, vertex: List[float[3]], focus: List[float[3]], start: List[float[3]], end: List[float[3]]) int
+

This method is used to create a parabolic arc using attributes. +This method is simpler than the previous create method, +requiring users only to specify the vertex and focus of the parabola +and the beginning and end of the curve. The start and +end points must lie on the parabola.

+

The parabola will be created in the XY plane.

+

It is not possible to modify a parabolic curve through its +attributes.

+
+
Parameters
+
    +
  • vertex (List[float] (len=3)) – the vertex of the parabola.

  • +
  • focus (List[float] (len=3)) – the focus of the parabola.

  • +
  • start (List[float] (len=3)) – the coordinates for the start of the curve.

  • +
  • end (List[float] (len=3)) – the coordinates for the end of the curve.

  • +
+
+
+

Return code: +:return: The status code result of the operation:

+
+

Success - All ok. +Failure - Failed to create the curve. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied +sAlreadyCreated - the AlCurve has already been created

+
+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+create_point(self: alias_api.AlCurve, pt: List[float[3]]) int
+

Create a “degenerate curve” with a single CV. +The coordinates for this CV are provided by the argument pt[]. +The created “curve” will be:

+
+

rational +open +degree 1 +span 0 +dimension 3 +knots {0.0} +cvs {pt[0], pt[1], pt[2], 1.0}

+
+
+
Parameters
+

pt (List[float] (len=3)) – position of the point

+
+
Returns
+

The status code result of the operation: +Success - the method succeeded +Failure - Failed to create the point. +sInvalidArgument - a None argument was supplied. +sAlreadyCreated - the AlCurve has already been created

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+curve_node(self: alias_api.AlCurve) AlCurveNode
+

Returns the curve node associated with this curve.

+

Returns None if there is not attached curve node.

+
+ +
+
+cvs_affected_position(self: alias_api.AlCurve, tm: alias_api.AlTM) Tuple[int, list, List[int]]
+

Returns the CV’s in the given CV array and the multiplicity +of each CV in the multiplicity vector. The first dimension +of the CV array must be number_of_cvs(). The length of the +multiplicity vector must also be number_of_cvs(). The +multiplicity vector returned by this function is the same +as the one returned by CVsUnaffectedPosition().

+
+
Parameters
+

tm (ALTM) – the transformation matrix built by tranversing the dag.

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the curve CVs positions were returned +InvalidObject - the curve was not valid +Failure - an error occurred +sInvalidArgument - a None argument was supplied

+
+
    +
  1. The CV positions

  2. +
  3. The multiplicity of each CV

  4. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+cvs_affected_position_incl_multiples(self: alias_api.AlCurve, cv_list: List[List[float[4]]]) Tuple[int, List[List[float[4]]], alias_api.AlTM]
+

Returns the world positions of all CV’s in this curve, including +multiples. The first dimension of the given CVList must be of +length number_of_cvs_incl_multiples().

+

Note that the positions returned are [ x y z w ] and +not [ w*x w*y w*z w ].

+
+
Parameters
+

cv_list (List[List[float]]) – the world positions of all CV’s

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the CVs positions were returned +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied

+
+
    +
  1. The world positions of all CV’s

  2. +
  3. The AlTM transformation matrix built by traversing the dag

  4. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+cvs_unaffected_position(self: alias_api.AlCurve) Tuple[int, list, List[int]]
+

Returns the CV’s in the given CV array and the multiplicity +of each CV in the multiplicity vector. The first dimension +of the CV array must be number_of_cvs(). The length of the +multiplicity vector must also be number_of_cvs(). The +multiplicity vector returned by this function is the same +as the one returned by CVsWorldPosition().

+
+
Parameters
+

cv_list (List[List[float]]) – returned CV positions

+
+
+

:param multiplicity - the multiplicity of each CV +:type multiplicity: int

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the curve CVs positions were returned +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
    +
  1. The CV positions

  2. +
  3. The multiplicity of each CV

  4. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+cvs_unaffected_position_incl_multiples(self: alias_api.AlCurve, cv_list: List[List[float[4]]]) Tuple[int, List[List[float[4]]]]
+

Returns the unaffected positions of all CVs in this curve, including +multiples. The first dimension of the given CVList must be of +length number_of_cvs_incl_multiples().

+
+
Parameters
+

cv_list (List[List[float]]) – returned unaffected positions of all CVs

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the CVs positions were returned +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
    +
  1. The unaffected positions of all CVs

  2. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+cvs_world_position(self: alias_api.AlCurve) Tuple[int, list, List[int]]
+

Returns the CV’s in the given CV array and the multiplicity +of each CV in the multiplicity vector. The first dimension +of the CV array must be number_of_cvs(). The length of the +multiplicity vector must also be number_of_cvs(). The +multiplicity vector returned by this function is the same +as the one returned by CVsUnaffectedPosition().

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the curve CVs positions were returned +InvalidObject - the curve was not valid +Failure - an error occurred +sInvalidArgument - a None argument was supplied

+
+
    +
  1. The CV positions List[List[float[4]]]

  2. +
  3. The multiplicity of each CV List[int]

  4. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+cvs_world_position_incl_multiples(self: alias_api.AlCurve, cv_list: List[List[float[4]]]) Tuple[int, List[List[float[4]]]]
+

Returns the world positions of all CV’s in this curve, including +multiples. The first dimension of the given CVList must be of +length number_of_cvs_incl_multiples().

+

Note that the positions returned are [ x y z w ] and +not [ w*x w*y w*z w ].

+
+
Parameters
+

cv_list (List[List[float]]) – the world positions of all CV’s

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the CVs positions were returned +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
    +
  1. The world positions of all CV’s

  2. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+degree(self: alias_api.AlCurve) int
+

Returns the degree of the curve.

+

-1 is returned if the curve is not valid.

+
+ +
+
+delete_object(self: alias_api.AlCurve) int
+

Delete the AlCurve from the Alias Universe and return the status of the performed operation.

+
+ +
+
+do_updates(self: alias_api.AlCurve, new_state: int) int
+

The do_upate flag is used to notify the system that you are finished +performing. If this flag is true, then it is equivalent to sending +out a ‘geometry modified’ message to the rest of the system. +When the system receives the update message, then operations such +as construction history etc are performed.

+

This feature is important when using construction history plugins. +Construction history plugins should always set the do_upate flag to +False when performing updates (otherwise an infinite update loop will +result, usually ending in a core dump). +The update can be explicitly forced using the +AlDagNode.send_geometry_modified_message() method.

+

This flag DOES NOT UPDATE THE SCREEN. Use the AlUniverse::redrawScreen +to perform the screen refresh.

+

If the previous state of the flag was False and the new state is True, +then an update will be performed now and on each subsequent dag +modification.

+
+
Returns
+

The status code result of the operation: +Success - the new state was set +InvalidObject - this DagNode is invalid.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+eval(*args, **kwargs)
+

Overloaded function.

+
    +
  1. eval(self: alias_api.AlCurve, t: float, world_coordinates: int) -> Tuple[int, List[float[3]], List[float[3]]]

    +
    +

    Determines the 3D coordinate and the derivative of the parameter +value on the curve.

    +
    +
    param t
    +

    parameter position on the curve

    +
    +
    type t
    +

    float

    +
    +
    param worldCoordinates
    +

    the evaluation is performed in world coordinates

    +
    +
    type worldCoordinates
    +

    bool

    +
    +
    return
    +

    A tuple containing: +(1) The status code result of the operation:

    +
    +

    Success - the coordinate was successfully determined +Failure - the evaluation failed +InvalidObject - the curve was invalid

    +
    +
      +
    1. The 3D coordinate of the point at the given parameter - List[float]

    2. +
    3. The derivative of the parameter value on the curve - float

    4. +
    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. eval(self: alias_api.AlCurve, dist: float, world_coordinates: bool, tolerance: float) -> Tuple[int, List[float[3]], List[float[3]]]

    +
    +

    Determines the 3D coordinate of the point at a given distance +from start of the curve. Error tolerance must be greater than +zero.

    +
    +
    param dist
    +

    arc length position on the curve

    +
    +
    type dist
    +

    float

    +
    +
    +

    :param worldCoordinates - the evaluation is performed in world coordinates +:type worldCoordinates: bool +:param tolerance - the error tolerance +:type tolerance: float

    +
    +
    return
    +

    A tuple containing: +(1) The status code result of the operation:

    +
    +

    Success - the coordinate was successfully determined +Failure - the evaluation failed +InvalidObject - the curve was invalid +sInvalidArgument - tolerance was non-positive

    +
    +
      +
    1. The 3D coordinate of the point at the given distance

    2. +
    3. The parameter value at the given distance

    4. +
    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+extend_curve(self: alias_api.AlCurve, knot: float, new_pos: List[float[4]]) int
+

Extend the curve by one span. The existing spans remain +unchanged. The new span has C(k-1) and interpolates the given point. +This curve must have at least 1 span and at least 4 CVs.

+
+
Parameters
+
    +
  • knot (float) – the knot spacing for the new span.

  • +
  • new_pos (List[float] (length 4)) – the position of the new CV.

  • +
+
+
Returns
+

The status code result of the operation: +InvalidObject - the curve was an invalid object +Success - extending the spline worked +Failure - curve had less than 1 span, curve had less than 4 CVs,

+
+

or could not extend spline because of an internal error

+
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+first_attribute(self: alias_api.AlCurve) alias_api.AlAttributes
+

Returns the first attribute on this curve if any, otherwise +None is returned. Note that if CV positions are modified through +any of the AlCurve, AlCurveCV, AlCluster, AlSet, etc. then the +attributes are removed from the curve.

+
+ +
+
+first_cv(self: alias_api.AlCurve) AlCurveCV
+

Returns a pointer to the first CV in the curve.

+
+ +
+
+form(self: alias_api.AlCurve) alias_api.AlCurveFormType
+

When a curve is periodic it means that its endpoints are +coincident and that the curve is tangent continuous +at the point where its endpoints touch. “Periodic” is +returned in this case. “Closed” is returned if the +curve is not periodic, but if its endpoints are +coincident. If a curve is neither “Periodic” nor +“Closed” then “Open” is returned.

+

(Note: If you use the “close” menu item in the interactive +Alias package, you actually make a curve periodic.)

+
+ +
+
+get_cv(self: alias_api.AlCurve, index: int) AlCurveCV
+

Returns a pointer to the CV of the given index. Returns None +if the CV could not be found or the index was negative. +The index of the first CV is 0.

+
+ +
+
+increment_degree(self: alias_api.AlCurve) int
+

Increment the degree of a curve without changing its shape. The curve must have +at least 1 span.

+
+
Returns
+

The status code result of the operation: +InvalidObject - curve is not a valid object +Success - raising the degree of the curve worked +Failure - number of spans less than 1 or internal failure

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+insert(self: alias_api.AlCurve, param: float) int
+

Insert an edit point into the curve.

+
+
Parameters
+

param (float) – parametric value of the new edit point on the curve

+
+
Returns
+

The status code result of the operation: +Success - edit point was successfully inserted +InvalidObject - the given object is not valid +InvalidArgument - param is out of bounds +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+is_display_mode_set(self: alias_api.AlCurve, mode: alias_api.AlDisplayModeType) int
+

Returns True if the specified display mode is toggled on +for the curve. Returns False otherwise.

+
+
The only valid AlDisplayModeTypes for an AlCurve are

DisplayGeomHull +DisplayGeomEditPoints +DisplayGeomKeyPoints +DisplayGeomCVs

+
+
+
+
Parameters
+

mode (AlDisplayModeType) – display mode of interest.

+
+
Returns
+

False is returned if the curve is not Valid.

+
+
Return type
+

bool

+
+
+
+ +
+
+knot_vector(self: alias_api.AlCurve) List[float]
+

Returns the knot vector in the given vector. +This vector must be of length numberOfKnots(). +For more information as to what these values mean, +see the description for the create() method.

+

:param knot_vector - returned knot vector +:type knot_vector: List

+
+
Returns
+

The status code result of the operation: +Success - the knot vector was returned +InvalidObject - the curve was not valid +InvalidArgument - a None argument was supplied

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+length(self: alias_api.AlCurve, world_coordinates: bool = 1, tolerance: float = 0.001) Tuple[int, float]
+

Determines the length of the curve in either local coordinates or +world space coordinates.

+
+
Parameters
+

worldCoordinates (bool) – if the calculation is to be done in world space

+
+
+

:param tolerance - the error tolerance +:type tolerance: float

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the length was successfully determined +Failure - the evaluation failed +InvalidObject - the curve was invalid +sInvalidArgument - tolerance was zero or negative

+
+
    +
  1. The length of the curve

  2. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+normal(self: alias_api.AlCurve) Tuple[int, List[float[3]]]
+

Test if bspline is planar and return normal. +Find the first three points that are not collinear, construct +a normal and test if the bspline lies in the plane. +If the bspline is planar and closed the normal is returned +with a clockwise orientation looking down on the plane, and +the normal pointing towards you. +If the bspline is a line or all the points are collinear, a +unique normal can not be defined.

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - found normal to curve +Failure - normal could not be found, either

+
+

the spline is a point, linear or not planar

+
+
+
    +
  1. the normal vector

  2. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+number_of_cvs(self: alias_api.AlCurve) int
+

Returns the number of CVs.

+

-1 is returned if the curve is not valid.

+
+ +
+
+number_of_cvs_incl_multiples(self: alias_api.AlCurve) int
+

Returns the number of CV’s including multiples. +For more information as to what this value means, +see the class documentation. +-1 is returned if the curve is not valid.

+
+ +
+
+number_of_knots(self: alias_api.AlCurve) int
+

Returns the number of knots in this curve. +For more information as to what this number means, see the +description for the create() method. +-1 is returned if the curve is not valid.

+
+ +
+
+number_of_spans(self: alias_api.AlCurve) int
+

Returns the number of spans in the curve.

+

-1 is returned if the curve is not valid.

+
+ +
+
+periodic_to_non_periodic(self: alias_api.AlCurve) int
+

If a curve is periodic, convert it to non-periodic curve +(closed curve) by making it have multiple end knots.

+

This method modifies the curve. It will not succeed for an AlCurve +that exists in the AlUniverse; that is, it must not have a parent +AlCurveNode.

+
+
Returns
+

The status code result of the operation: +InvalidObject - the curve was invalid. +Failure - the method didn’t succeed +Success - the curve was converted to non-periodic one.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+real_knot_vector(self: alias_api.AlCurve) List[float]
+

Returns real_number_of_knots() in ‘knot_vector’ for the curve.

+
+
Parameters
+

knot_vector (List) – array to place the knot vector into

+
+
Returns
+

The status code result of the operation: +Success - successfully copied the curve’s knot vector into knot_vector +sInvalidArgument - knot_vector was None +InvalidObject - the curve was invalid +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+real_number_of_knots(self: alias_api.AlCurve) int
+

Returns the actual number of knots on the curve. That is +number_of_spans() + 2*degree() - 1. (Note that two additional +knots are required to define a NURBS curve, but they have no +effect on the curve so are not included in this count.) +This method returns -1 if the curve is not valid.

+
+ +
+
+replace(*args, **kwargs)
+

Overloaded function.

+
    +
  1. replace(self: alias_api.AlCurve, deg: int, form: alias_api.AlCurveFormType, num_knots: int, knot_vector: List[float], num_control_pts: int, control_point: List[List[float[4]]], multiplicity: List[int]) -> int

    +
    +

    This method is used to replace the data that represents the curve.

    +

    It basically duplicates the ::create routine and recreates the +curve and then replaces the current curve with the new one.

    +

    See create() for more details.

    +
    +
    param deg
    +

    The degree of the curve.

    +
    +
    type deg
    +

    int

    +
    +
    param form
    +

    The curve form type.

    +
    +
    type form
    +

    curveFormType (Open, Closed or Periodic)

    +
    +
    param num_knots
    +

    The number of knots in the knot_vector.

    +
    +
    param knot_vector
    +

    The sequence of knot values. Must be of length num_knots.

    +
    +
    type knot_vector
    +

    List

    +
    +
    param num_control_pts
    +

    The number of points in control_point.

    +
    +
    type num_control_pts
    +

    int

    +
    +
    +
    +
    :param control_point - The array of control points. Must have size

    of num_control_pts * 4.

    +
    +
    +
    +
    type control_point
    +

    List[List[float]]

    +
    +
    +
    +
    :param multiplicity - The multiplicity values. Must be of length

    num_control_pts. Assumed to be an array of 1’s if None.

    +
    +
    +
    +
    type multiplicity
    +

    int

    +
    +
    return
    +

    The status code result of the operation:

    +
    +
    +

    Success - All ok. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied. +Failure - did not work.

    +
    +
  2. +
  3. replace(self: alias_api.AlCurve, deg: int, form: alias_api.AlCurveFormType, knot_vector: List[float], num_control_pts: int, control_point: List[List[float[4]]]) -> int

    +
    +

    This method is used to replace the data that represents the curve.

    +

    It basically duplicates the ::create routine and recreates the +curve and then replaces the current curve with the new one.

    +

    See create() for more details.

    +
    +
    param deg
    +

    The degree of the curve.

    +
    +
    type deg
    +

    int

    +
    +
    param form
    +

    The curve form type.

    +
    +
    type form
    +

    curveFormType (Open, Closed or Periodic)

    +
    +
    param knot_vector
    +

    The sequence of knot values. Must be of length +num_control_pts + deg + 1.

    +
    +
    type knot_vector
    +

    List

    +
    +
    param num_control_pts
    +

    The number of points in control_point.

    +
    +
    type num_control_pts
    +

    int

    +
    +
    +
    +
    :param control_point - The array of control points. Must have size

    of num_control_pts * 4.

    +
    +
    +
    +
    type control_point
    +

    List[List[float]]

    +
    +
    return
    +

    The status code result of the operation: +Success - All ok. +sInsufficientMemory - Ran out of memory. +sInvalidArgument - a None argument was supplied. +Failure - did not work.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+reverse_curve(self: alias_api.AlCurve) int
+

Reverses the parameterization of the curve.

+
+
Returns
+

The status code result of the operation: +InvalidObject - curve was not a valid object +Success - the curve reversal worked +Failure - the curve reversal failed for internal reasons

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_cvs_unaffected_position(self: alias_api.AlCurve, cv_list: List[List[float[4]]]) int
+

Sets the CV’s of this curve to the values in the given CV array. +The first dimension of the CV array must be number_of_cvs().

+
+
Parameters
+

cv_list (List[List[float[4]]]) – CV positions

+
+
Returns
+

The status code result of the operation: +Success - the curve CVs positions were set +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_cvs_unaffected_position_incl_multiples(self: alias_api.AlCurve, cv_list: List[List[float[4]]]) int
+

Sets the unaffected positions of all CVs in this curve, including +multiples. The first dimension of the given CVList must be of +length number_of_cvs_incl_multiples().

+

You cannot give multiples different values. For example, +if you have an open curve where numOfCVs() is 6 and +and numOfCVsInclMultiples() is 7 because the 2nd point has a +multiplicity of 2, then the 2nd and 3rd quadruple in your +CVList should be the same. What really happens is that +the 3rd point is given the same value as the 2nd point. +(What you give as the 3rd point is ignored). For more +information see the examples in the class description.

+
+
Parameters
+

cv_list (List[List[float]]) – the unaffected positions of all CVs

+
+
Returns
+

The status code result of the operation: +Success - the CVs positions were set +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_display_mode(self: alias_api.AlCurve, mode: alias_api.AlDisplayModeType, on: int) int
+

For the given display mode, if the flag on_or_off is True then the +display mode for the surface is set, otherwise it is unset.

+
+
The only valid AlDisplayModeTypes for an AlCurve are

DisplayGeomHull +DisplayGeomEditPoints +DisplayGeomKeyPoints +DisplayGeomCVs

+
+
+
+
Parameters
+
    +
  • mode (AlDisplayMode) – display mode of interest.

  • +
  • on_or_off (bool) – True if this surface will have the display mode set, else False.

  • +
+
+
Returns
+

The status code result of the operation: Return values: +Success - if this operation was successful. +InvalidObject - the curve was invalid +sInvalidArgument - invalid display type.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_knot_vector(self: alias_api.AlCurve, knot_vector: List[float]) int
+

Sets the knot vector to be the given vector. +This vector must be of length numberOfKnots(). +For more information as to what these values mean, +see the description for the create() method.

+

:param knot_vector - the knot vector to be the given vector +:type knot_vector: List

+
+
Returns
+

The status code result of the operation: +Success - the knot vector was set +InvalidObject - the curve was not valid +sInvalidArgument - a None argument was supplied or the knots were

+
+

not in increasing order

+
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_real_knot_vector(self: alias_api.AlCurve, knot_vector: List[float]) int
+

Sets the knots for this curve. The +parameter ‘knot_vector’ must be of ‘real_number_of_knots()’.

+
+
Parameters
+

knot_vector (List) – array of knots. The length of the array should +be equal to ‘real_number_of_knots()’

+
+
Returns
+

The status code result of the operation: +Success - the knots were successfully set. +sInvalidArgument - knot_vector was None +InvalidObject - the curve is invalid +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+trim_curve(self: alias_api.AlCurve, min_point: float, max_point: float) int
+

Trim the curve at the parameters specified. param0 and param1 +are the min and max points. This routine fails if param0 and param1 +are the same or if param0 is greater than param1.

+
+
Parameters
+
    +
  • min_point (float) – the minimum position along the curve where the curve +is to be trimmed

  • +
  • max_point (float) – the maxiumum position along the curve where the curve +is to be trimmed

  • +
+
+
Returns
+

The status code result of the operation +InvalidObject - curve was not a valid object +Success - method worked +Failure - failed to trim spline, min_point equals max_point or

+
+

min_point > max_point or other internal failure

+
+

+
+
Return type
+

int

+
+
+
+ +
+
+type(self: alias_api.AlCurve) alias_api.AlObjectType
+

Return the AlCurve type identifier.

+
+ +
+ +
+
+class alias_api.AlCurveAttributes
+

Interface to Alias curve attributes.

+

AlCurveAttributes is a class derived from the AlAttributes class. +This class allows access to a curve.

+

This class provides information similar to that of the AlCurve +class but without the ability to modify the curve or its CVs.

+

NOTE: When an AlCurve has just an AlCurveAttribute attribute +the AlCurveAttribute provides no information that the AlCurve +doesn’t. For this reason, in this case, no information is +provided by the AlCurveAttribute, all methods return null +values.

+
+
+copy_wrapper(self: alias_api.AlCurveAttributes) alias_api.AlObject
+

This method makes a copy of the AlCurveAttributes. The returned +AlCurveAttributes will reference the same data as the original.

+
+ +
+
+cvs_unaffected_position(self: alias_api.AlCurveAttributes) Tuple[int, std::vector<std::array<double,4>,std::allocator<std::array<double,4> > >, std::vector<int,std::allocator<int> >]
+

Returns the CV’s in the given CV array and the multiplicity +of each CV in the multiplicity vector. The first dimension +of the CV array must be number_of_cvs(). The length of the +multiplicity vector must also be number_of_cvs(). The +multiplicity vector returned by this function is the same +as the one returned by cvs_world_position().

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - the CVs positions were returned +InvalidObject - the attribute was not valid +sInvalidArgument - a None argument was supplied +Failure - an error occurred

+
+
    +
  1. The CV positions

  2. +
  3. The multiplicity of each CV

  4. +
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+degree(self: alias_api.AlCurveAttributes) int
+

Returns the degree of the curve. Zero will be returned if the +attribute is not valid.

+
+ +
+
+form(self: alias_api.AlCurveAttributes) alias_api.AlCurveFormType
+

When a curve is periodic it means that its endpoints are +coincident and that the curve is tangent continuous +at the point where its endpoints touch. “Periodic” is +returned in this case. “Closed” is returned if the +curve is not periodic, but if its endpoints are +coincident. If a curve is neither “Periodic” nor +“Closed” then “Open” is returned.

+

(Note: If you use the “close” menu item in the interactive +Alias package, you actually make a curve periodic.)

+
+
Returns
+

The curve form type.

+
+
Return type
+

curveFormType +Open - the curve is open. +Closed - the curve is closed. +Periodic - the curve is periodic. +InvalidCurve - the attribute is not valid.

+
+
+
+ +
+
+knot_vector(self: alias_api.AlCurveAttributes) std::vector<double,std::allocator<double> >
+

Returns the knot vector in the given vector. +This vector must be of length numberOfKnots(). +For more information as to what these values mean, +see the description for the create() method.

+

:param knot_vector - returned knot vector +:type knot_vector: List

+
+
Returns
+

The status code result of the operation: +Success - the knot vector was returned +InvalidObject - the curve was not valid +InvalidArgument - a None argument was supplied +Failure - the knot vector could not be returned

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+number_of_cvs(self: alias_api.AlCurveAttributes) int
+

Returns the number of CVs. -1 is returned if +the attribute is not valid.

+
+ +
+
+number_of_knots(self: alias_api.AlCurveAttributes) int
+

Returns the number of knots in this curve. +For more information as to what this number means, see the +description for the create() method. +-1 is returned if the attribute is not valid.

+
+ +
+
+number_of_spans(self: alias_api.AlCurveAttributes) int
+

Returns the number of spans in the curve. -1 is returned if +the attribute is not valid.

+
+ +
+
+type(self: alias_api.AlCurveAttributes) alias_api.AlObjectType
+

Returns the class identifier ‘ConicAttributeType’.

+
+ +
+ +
+
+class alias_api.AlCurveCV
+

Encapsulates methods common to curve CVs.

+

AlCurveCV is the class used to access and manipulate +curve CV’s (also referred to as Control Points). +There is one AlCurveCV object for each CV of an AlCurve as you see +it in the interactive Alias package. You cannot create or delete +an AlCurveCV. AlCurveCV’s are only created through AlCurve’s.

+

There are methods to query and set the multiplicity of a CV, +and methods to query the world position and the “unaffected” +position of a CV. The “unaffected” position of a CV is its +position BEFORE any transformations (from its parent dag node +or from affecting clusters) have been applied to it. +There is also a method to access the clusters that affect a CV. +Methods setWorldPosition(*) are used for setting either the +unaffected or affected(clusters) position of a CV.

+

Multiplicity:

+

When an AlCurveCV has a multiplicity > 1, CV’s +are internally piled up at that position. In this case, an AlCurveCV +actually represents more than one CV internally. To access ALL CV’s, +use the methods in the AlCurve class to query values “including +multiplicity”, or use the example code below. By representing +AlCurveCV’s this way, then if an AlCurveCV is moved, the corresponding +multiple CV’s at that position are moved as well, acting exactly +like the Alias interactive package.

+

Creation:

+

Note that certain routines require that the given CV be installed +in the Dag (i.e., that the curve belongs to a AlCurveNode). If +any of these are called on a CV that’s not part of the Dag, they +will simply fail.

+
+
Routines that require the CV to be in the Dag:

next +world_position +set_multiplicity +set_unaffected_position +set_world_position

+
+
+
+
+copy_wrapper(self: alias_api.AlCurveCV) alias_api.AlObject
+

Makes an exact copy of this AlCurveCV wrapper.

+
+ +
+
+curve(self: alias_api.AlCurveCV) alias_api.AlCurve
+

Returns a pointer to the AlCurve that this curve CV belongs to.

+
+ +
+
+do_updates(self: alias_api.AlCurveCV, arg0: int) int
+

The doUpdate flag is used to notify the system that you are finished +performing. If this flag is true, then it is equivalent to sending +out a ‘geometry modified’ message to the rest of the system. +When the system receives the update message, then operations such +as construction history etc are performed.

+

This feature is important when using construction history plugins. +Construction history plugins should always set the doUpdate flag to +FALSE when performing updates (otherwise an infinite update loop will +result, usually ending in a core dump). +The update can be explicitly forced using the +AlDagNode.send_geometry_modified_message() method.

+

This flag DOES NOT UPDATE THE SCREEN. Use the AlUniverse::redrawScreen +to perform the screen refresh.

+

If the previous state of the flag was FALSE and the new state is TRUE, +then an update will be performed now and on each subsequent dag +modification.

+
+
Returns
+

The status code result of the operation: +Success - the new state was set +InvalidObject - this DagNode is invalid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+index(self: alias_api.AlCurveCV) int
+

Returns the index of this CV.

+

Returns -1 if the index could not be found. The index of the first CV is 0.

+
+ +
+
+multiplicity(self: alias_api.AlCurveCV) int
+

Returns the multiplicity of this curve CV.

+

The returned value is 1, 2 or 3, unless the call fails, in which case it +is 0.

+
+ +
+
+next(self: alias_api.AlCurveCV) alias_api.AlCurveCV
+

Returns a pointer to the next AlCurveCV.

+

Otherwise, returns None if there is no next curve CV, or if this CV is +not in the Dag.

+

The “not in the dag” restriction cannot be removed since the ‘face’ +identifier lives in the dag, so we cannot differentiate faces from +ordinary curves.

+
+ +
+
+prev(self: alias_api.AlCurveCV) alias_api.AlCurveCV
+

Returns a pointer to the previous AlCurveCV.

+

Otherwise, returns None if there is no previous curve CV.

+
+ +
+
+set_multiplicity(self: alias_api.AlCurveCV, new_multiplicity: int) int
+

Sets the multiplicity of this curve CV to the given +multiplicity. The new multiplicity must be 1, 2, or 3.

+
+
Parameters
+

new_multiplicity (int) – the multiplicity to set this AlCurveCV to.

+
+
Returns
+

The status code result of the operation: +Success - the multiplicity was set +InvalidArgument - the multiplicity was not 1, 2 or 3 +InvalidObject - the CV was invalid +InsufficientMemory - not enough memory to allocate a new block +Failure - the CV is not created or not in the world

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_unaffected_position(self: alias_api.AlCurveCV, x: float, y: float, z: float, w: float) int
+

Sets either the CVs PW directly or the cluster local Pw if the CV +is affected by clusters. If many CVs are to be moved it is more +efficient to use AlCurve.set_cvs_unaffected_position().

+
+
Parameters
+
    +
  • x (float) – the new unaffected position in the x direction

  • +
  • y (float) – the new unaffected position in the y direction

  • +
  • z (float) – the new unaffected position in the z direction

  • +
  • w (float) – homogeneous coordinate

  • +
+
+
Returns
+

The status code result of the operation: +Success - the position of this curve CV was set +InvalidObject - the CV was not valid +sFailure - the CV is not created or not in the world.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_world_position(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_world_position(self: alias_api.AlCurveCV, x: float, y: float, z: float, w: float, include_world: int) -> int

    +
    +

    Set the world position of the CV. The CV may also be in a cluster.

    +
    +
    param x
    +

    the new unaffected position in the x direction

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    the new unaffected position in the y direction

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    the new unaffected position in the z direction

    +
    +
    type z
    +

    float

    +
    +
    param w
    +

    homogeneous coordinate

    +
    +
    type w
    +

    float

    +
    +
    param include_world
    +

    include world transformation in move

    +
    +
    type include_world
    +

    bool

    +
    +
    return
    +

    The status code result of the operation: +Success - the position of this curve CV was set +InvalidObject - the CV was not valid +sFailure - the CV is not created or not in the world. The move could not be performed

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. set_world_position(self: alias_api.AlCurveCV, x: float, y: float, z: float, w: float, tm: alias_api.AlTM) -> int

    +
    +

    Set the world position of the CV. The CV may also be in a cluster.

    +

    Note that this method uses the inverse of the transformation +matrix that is passed in so that the calling routine does +not need to generate it.

    +
    +
    param x
    +

    the new unaffected position in the x direction

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    the new unaffected position in the y direction

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    the new unaffected position in the z direction

    +
    +
    type z
    +

    float

    +
    +
    param w
    +

    homogeneous coordinate

    +
    +
    type w
    +

    float

    +
    +
    param tm
    +

    user’s transformation matrix

    +
    +
    type tm
    +

    AlTM

    +
    +
    return
    +

    The status code result of the operation: +Success - the position of this curve CV was set +InvalidObject - the CV was not valid +sFailure - the CV is not created or not in the world. The move could not be performed

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
+
+ +
+
+type(self: alias_api.AlCurveCV) alias_api.AlObjectType
+

Returns the class identifier ‘CurveCVType’

+
+ +
+
+unaffected_position(self: alias_api.AlCurveCV) Tuple[int, float, float, float, float]
+

Returns the position of this curve CV PRIOR TO ANY +TRANSFORMATIONS (hence “unaffected”).

+

How are the unaffected position and world position related? +The world position is the unaffected position with +the inclusive transformation of all dag nodes above this +curve applied to it AND the transformations of all +affecting clusters applied to it (in appropriate proportions).

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the position of this curve CV was returned +InvalidObject - the CV was invalid +Failure - the CV is not created or not in the world.

+
+
    +
  1. the unaffected position +- the unaffected position in the x direction +- the unaffected position in the y direction +- the unaffected position in the z direction +- homogeneous coordinate

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float, float, float, float>

+
+
+
+ +
+
+world_position(self: alias_api.AlCurveCV) Tuple[int, float, float, float, float]
+

Returns the position of this curve CV in world space. +This position includes the transformations of all dag nodes +above this curve and the effects of all clusters.

+

Note that the positions returned are [ x y z w ] and +not [ w*x w*y w*z w ].

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the position of this curve CV in world space was returned +InvalidObject - the CV was invalid +Failure - the CV is not created or not in the world.

+
+
    +
  1. The position of the CV in world space. +- the world position in the x direction +- the world position in the y direction +- the world position in the z direction +- the homogeneous coordinate

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float, float, float, float>

+
+
+
+ +
+ +
+
+class alias_api.AlCurveFormType
+

Curve form types.

+

Members:

+
+

Closed

+

Open

+

Periodic

+

InvalidCurve

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlCurveNode
+

A dag node that refers to a nurbs curve’s geometry.

+

AlCurveNode is the class used to access and manipulate +curves within the dag.

+

This class behaves like other dag nodes (see AlDagNode for a +description of the usage and purpose of dag nodes). +Users access the geometry of the curve +via the ‘curve()’ method which returns a +pointer to an AlCurve object which provides the user with +the methods used to modify the geometry of the curve. +Curves can be created from scratch by instantiating and creating +an AlCurve, and then by instantiating and creating an AlCurveNode +(using the AlCurve as a parameter).

+

There are two ways to delete an AlCurveNode. If the AlCurveNode +delete_object() method is called, then the node’s AlCurve is also +deleted. If the AlCurve.delete_object() method is called, then its +associated AlCurveNode is also deleted.

+
+
+copy_wrapper(self: alias_api.AlCurveNode) alias_api.AlObject
+

Return an exact duplicate of this AlCurveNode wrapper.

+
+ +
+
+create(self: alias_api.AlCurveNode, curve: alias_api.AlCurve) int
+

Allocate the dag node for this object and attach it to the given AlCurve ‘curve’.

+

This method should only be called once for any AlCurve. It is an error to this method +twice or if the object has been read in from a wire file.

+
+
Parameters
+

curve (AlCurve) – The curve to create the curve node from.

+
+
Returns
+

The status code from performing the operation +AlStatusCode.Success - successful +AlStatusCode.InvalidArgument - the new curve was invalid or None +AlStatusCode.AlreadyCreated - the curve was already created elsewhere +AlStatusCode.InsufficientMemory - if not enough memory available

+
+
Return type
+

statusCode

+
+
+
+ +
+
+curve(*args, **kwargs)
+

Overloaded function.

+
    +
  1. curve(self: alias_api.AlCurveNode) -> alias_api.AlCurve

  2. +
+

Return the curve data structure which can be used to acces the geometry of the curve.

+
    +
  1. curve(self: alias_api.AlCurveNode, tm: alias_api.AlTM) -> alias_api.AlCurve

    +
    +

    Return the curve data structure which can be used to acces the geometry of the curve.

    +

    The AlTM ‘tm’ will be updated with the curve node’s transformation matrix, if a curve exists.

    +
    +
  2. +
+
+ +
+
+delete_object(self: alias_api.AlCurveNode) int
+

Delete the AlCurveNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+join(self: alias_api.AlCurveNode, curve_node: alias_api.AlCurveNode) alias_api.AlCurveNodeJoinErrors
+

Join the passed in curve node’s curve to the end of this curve, if the end is coincident with +the beginning of the curve node’s curve.

+

This is most useful when using curves with attributes.

+

Warning: this operator will remove this curve’s CVs from all clusters and sets but not the +curve node that is passed in. This means that all AlClusterMembers’ and AlSetMembers’ of this +curves CVs will no longer be valid after a join. Further all AlCurveCVs and attribteus on +‘this’ AlCurve will have been deleted and regenerated (the passed curve is unchanged).

+

If the return value is etiher AlCurveNodeJoinErrors.Success or AlCurveNodeJoinErrors.Failure +then all pointers to this curve’s AlCurveCVs will be invalid.

+

If the return value is AlCurveNodeJoinErrors.DuplicateCurve, AlCurveNodeJoinErrors.BadData, +AlCurveNodeJoinErrors.NoAttribute, or AlCurveNodeJoinErrors.InvalidKeyPoints the model will +not have been modified.

+

If the return value is AlCurveNodeJoinErrors.BadCluster all AlCurveCVs below this AlCurveNode +will have been removed from all sets and clusters and the cluster effects may have been +applied to some CVs.

+

Finally if the return value is AlCurveNodeJoinErrors.Failure all AlCurveCVs below this +AlCurveNode will have been removed from all sets and clusters, all AlCurveCVs have been +deleted and recreated, existing AlAttributes have been moved to the garbage list and new ones +created and a join was attempted but failed, perhaps because the ends of the two curves did +not overlap.

+
+
Parameters
+

curve_node (AlCurveNode) – A curve that will be added to the end of this curve.

+
+
Returns
+

The status code from performing the operation +AlCurveNodeJoinErrors.Success - all OK, the join successed. +AlCurveNodeJoinErrors.Failure - the join failed, perhaps because the end points didn’t overlap. +AlCurveNodeJoinErrors.BadCluster - failed to remove effect of all clusters. +AlCurveNodeJoinErrors.InvalidKeyPoints - one curve may have been a circle. +AlCurveNodeJoinErrors.NoAttributes - coudln’t find or create attribteus for a curve. +AlCurveNodeJoinErrors.BadData - the model is in an incorrect state. +AlCurveNodeJoinErrors.DuplicateCurve - tried joining a curve to itself.

+
+
Return type
+

AlCurveNodeJoinErrors

+
+
+
+ +
+
+type(self: alias_api.AlCurveNode) alias_api.AlObjectType
+

Return the AlCurveNode type identifier.

+
+ +
+ +
+
+class alias_api.AlCurveNodeJoinErrors
+

Curve node join errors.

+

Members:

+
+

BadData

+

Success

+

DuplicateCurve

+

Failure

+

BadCluster

+

NoAttributes

+

InvalidKeyPoint

+

CurveClosed

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlCurveOnSurface
+

Interface to curves on surfaces geometry.

+

AlCurveOnSurface is the interface to Alias’ curve on surface +data objects. Curves on surfaces are created and added to a surface +by allocating an AlCurveOnSurface, then calling the +create() method, and then calling AlSurfaceNode’s +add_curve_on_surface() method to add it to a surface.

+

Curves on surfaces can also be read in from wire file and modified +with this class. Curves on surfaces will be deleted when the +surface they are attached to is deleted.

+

When constructing a curve on surface, you will notice that you +need to specify a matrix that has dimensions [number_of_control_points][4]. +Each point has 4 values, for u, v, zero and w. The “u” and “v” +specify the point in U-V parametric space. The third component is zero +because this component is not used. The “w” component is the +homogeneous value, which is usually 1.0.

+
+
+control_point(self: alias_api.AlCurveOnSurface, index: int) Tuple[int, std::array<double,4>]
+

Given a valid index, return the value of the control point in ‘point’.

+

A valid index is one in the range 0 to numberOfControlPoints()-1.

+

Note the control point is represented by the quadruple [u v 0.0 w], +where “u” and “v” represent the control point in U-V parameter space, +the “0.0” is unused, and the “w” is the homogeneous coordinate.

+
+
Parameters
+

index (int) – A valid index of the control point to return.

+
+
Returns
+

+
A tuple containing (1) the status code result of the operation:

Success - the control point was returned +InvalidArgument - the index was not valid or ‘point’ was NULL +InvalidObject - the curve was invalid +Failure - an error occurred

+
+
+

and (2) the control point value.

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlCurveOnSurface) alias_api.AlObject
+

Return an exact duplicate of this AlCurveOnSurface wrapper.

+
+ +
+
+degree(self: alias_api.AlCurveOnSurface) int
+

Return the degree of the curve. Return -1 if the curve is not valid.

+
+ +
+
+delete_object(self: alias_api.AlCurveOnSurface) int
+

Delete the AlCurveOnSurface from the Alias Universe and return the status of the performed operation.

+
+ +
+
+form(self: alias_api.AlCurveOnSurface) alias_api.AlCurveFormType
+

Return the form of the curve, which is kOpen, kClosed or kPeriodic.

+

If a curve on surface is periodic, it is tangent continuous at +the point where it is closed. (If you use the “close” menu item +in the interactive Alias pacakge, you actually make a curve +periodic.) If a curve is periodic, it implies that it is closed. +If a curve is kClosed, then it just means that its endpoints are +coincident. Otherwise, the curve is kOpen.”

+
+ +
+
+in_trim(self: alias_api.AlCurveOnSurface) int
+

Returns True if this curve on surface is being used to trim the surface it is on, else False.

+
+ +
+
+insert(self: alias_api.AlCurveOnSurface, parametric_value: float) int
+

Insert an edit point into the curve.

+
+
Parameters
+

parametric_value (float) – The parametric value of the new edit point on the curve.

+
+
Returns
+

The status code result of the operation: +Success - the operation was successful +InvalidObject - the given object is not valid +InvalidArgument - parametric_value is out of bounds +Failre - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+knot_value(self: alias_api.AlCurveOnSurface, index: int) float
+

Given a valid knot index, return the value of the knot in ‘knotValue’.

+

A valid knot index is one in the range of 0 - numberOfKnots()-1.

+
+
Parameters
+

index (int) – A valid index of hte knot value to return.

+
+
Returns
+

The value of the knot for the given index.

+
+
Return type
+

float

+
+
+
+ +
+
+next_curve_on_surface(self: alias_api.AlCurveOnSurface) alias_api.AlCurveOnSurface
+

Return the next curve on surface in the list of curves on surfaces that are attached to a specific surface. Return None if there is no next curve on surface.

+
+ +
+
+number_of_control_points(self: alias_api.AlCurveOnSurface) int
+

Return the number of control points.

+
+ +
+
+number_of_knots(self: alias_api.AlCurveOnSurface) int
+

Return the number of knots (just number of spans + 1). Return -1 if the curve is not valid.

+
+ +
+
+number_of_spans(self: alias_api.AlCurveOnSurface) int
+

Return the number of spans in the curve. Return -1 if the curve is not valid.

+
+ +
+
+prev_curve_on_surface(self: alias_api.AlCurveOnSurface) alias_api.AlCurveOnSurface
+

Return the previous curve on surface in the list of curves on surfaces that are attached to a specific surface. Return None if there is no next curve on surface.

+
+ +
+
+real_number_of_knots(self: alias_api.AlCurveOnSurface) int
+

Return the actual number of knots on the curve. That is number_of_spans + 2*degree -1. Return -1 if the operation failed.

+
+ +
+
+reverse(self: alias_api.AlCurveOnSurface) int
+

Reverse the direction of this curve on surface.

+
+ +
+
+set_control_point(self: alias_api.AlCurveOnSurface, index: int, point: std::array<double, 4>) int
+

Given a valid index, set the value of the control point in ‘point’.

+

A valid index is one in the range 0 to numberOfControlPoints()-1.

+

Note the control point is represented by the quadruple [u v 0.0 w], +where “u” and “v” represent the control point in U-V parameter space, +the “0.0” is unused, and the “w” is the homogeneous coordinate.

+
+
Parameters
+

index (int) – A valid index of the control point to set.

+
+
Returns
+

The status code result of the operation: +Success - the control point was returned +InvalidArgument - the index was not valid or ‘point’ was NULL +InvalidObject - the curve was invalid +Failure - an error occurred

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_knot_value(self: alias_api.AlCurveOnSurface, index: int, knot_value: float) int
+

Given a valid knot index, set the value of hte knot to be ‘knotValue’.

+

A valid knot index is one in the range of 0 - numberOfKnots()-1.

+
+
Parameters
+
    +
  • index (int) – A valid index of hte knot value to set.

  • +
  • knot_value (float) – The knot value to set.

  • +
+
+
Returns
+

The status code result of the operation +Success - the knot value was set +InvalidArgument - the ‘index’ was not in the range 0…#knots-1 +InvalidObject - the curve was invalid +AlreadyCreated - the curve was already in a trim +Failure - an internal error occured

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_visible(self: alias_api.AlCurveOnSurface, visible: int) int
+

Set the visibility of the curve on surface.

+
+ +
+
+surface(self: alias_api.AlCurveOnSurface) AlSurface
+

Return the surface that this curve is on.

+
+ +
+
+type(self: alias_api.AlCurveOnSurface) alias_api.AlObjectType
+

Return the AlCurveOnSurface type identifier.

+
+ +
+
+visible(self: alias_api.AlCurveOnSurface) int
+

Return True if this curve is visible, else False if it is invisible.

+
+ +
+ +
+
+class alias_api.AlCurveOnSurfacePoint
+

Interface to Alias curve on surface points

+

A point can be created in the parametric space of a AlCurveOnSurface. +This point can be queried for the curve normals, tangent, and position +in world coordinate system. This class contains methods for creating, +and moving the point in the parametric space of the curve on surface.

+

If the AlCurveOnSurface or its AlSurface is deleted, the curve on +surface point created on it is automatically deleted.

+
+
+arc_length(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float]
+

Find the length of the curve on surface on which the point is present.

+
+
Returns
+

A tuple (status, arg_len), where +status [AlStatusCode] - the status code result

+
+

Success - the arc length was found +InvalidObject - the point is not valid

+
+

arc_len [float] - the length of the curve

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+attached_to(self: alias_api.AlCurveOnSurfacePoint) alias_api.AlCurveOnSurface
+

Return the AlCurveOnSurface this AlCurveOnSurfacePoint is associated with.

+
+ +
+
+copy_wrapper(self: alias_api.AlCurveOnSurfacePoint) alias_api.AlObject
+

Return an exact duplicate of this AlCurveOnSurfacePoint wrapper.

+
+ +
+
+create(self: alias_api.AlCurveOnSurfacePoint, curve_on_surface: alias_api.AlCurveOnSurface, u: float) int
+

Create an AlCurveOnSurfacePoint on the given AlCurveOnSurface.

+
+
Parameters
+
    +
  • curve_on_surface (AlCurveOnSurface) – The curve on surface on which the point is to be created.

  • +
  • u (float) – The parameter at which point is to be created.

  • +
+
+
Returns
+

The status code +Success - the point was successfully created. +AlreadyCreated - object has already been created. +Failure - the point could not be created on the curve on surface. +InvalidArgument - the curve is not a valid object.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+normal1(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float, float, float]
+

Find the normal vector to the curve on surface at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the normal was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the normal +y [float] - the y coordinate of the normal +z [float] - the z coordinate of the normal

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+normal2(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float, float, float]
+

Find the second normal vector to the curve on surface at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the normal was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the second normal +y [float] - the y coordinate of the second normal +z [float] - the z coordinate of the second normal

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+parameter(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float]
+

Find the parameter value at which the point is present.

+
+
Returns
+

A tuple (status, u), where +status [AlStatusCode] - the status code result

+
+

Success - the parameter was found +InvalidObject - the point is not valid

+
+

u [float] - the curve parameter where point is present

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+set_parameter(self: alias_api.AlCurveOnSurfacePoint, u: float) int
+

Move the position of a point created on a curve on surface.

+
+
Parameters
+

u (float) – The parameter on the curve on surface where the point has to be moved.

+
+
Returns
+

The status code result +Success - the point was moved +InvalidObject - the point is not valid

+
+
Return type
+

AlStatuscode

+
+
+
+ +
+
+tangent(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float, float, float]
+

Find the tangent vector to the curve on surface at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the tangent was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the tangent +y [float] - the y coordinate of the tangent +z [float] - the z coordinate of the tangent

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+type(self: alias_api.AlCurveOnSurfacePoint) alias_api.AlObjectType
+

Return the AlCurveOnSurfacePoint type identifier.

+
+ +
+
+world_position(self: alias_api.AlCurveOnSurfacePoint) Tuple[int, float, float, float]
+

Find the world coordinates of the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the coordinates was found +InvalidObject - the point is not valid

+
+

x [float] - the x world coordinate of the point +y [float] - the y world coordinate of the point +z [float] - the z world coordinate of the point

+

+
+
Return type
+

tuple

+
+
+
+ +
+ +
+
+class alias_api.AlCurvePoint
+

Interface to Alias curve points.

+

A point can be created in the parametric space of any AlCurve. This +point can be queried for the curve normals, tangent, position in +world coordinate system, arc length, and curvature information. This +class contains methods for creating, and moving the curve point.

+

If the AlCurve is deleted, the curve point created on it is +automatically deleted.

+
+
+arc_length(self: alias_api.AlCurvePoint) Tuple[int, float]
+

Find the length of the curve on which the point is present.

+
+
Returns
+

A tuple (status, arg_len), where +status [AlStatusCode] - the status code result

+
+

Success - the arc length was found +InvalidObject - the point is not valid

+
+

arc_len [float] - the length of the curve

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+attached_to(self: alias_api.AlCurvePoint) alias_api.AlCurveNode
+

Return the AlCurveNode this AlCurvePoint is associated with.

+
+ +
+
+copy_wrapper(self: alias_api.AlCurvePoint) alias_api.AlObject
+

Return an exact duplicate of this AlCurvePoint wrapper.

+
+ +
+
+create(self: alias_api.AlCurvePoint, curve: alias_api.AlCurve, u: float) int
+

Create a point on the given curve.

+
+
Parameters
+
    +
  • curve (AlCurve) – The curve on which the point is to be created.

  • +
  • u (float) – The curve parameter at which point is to be created.

  • +
+
+
Returns
+

The status code +Success - the point was successfully created. +AlreadyCreated - object has already been created. +Failure - the point could not be created on the curve. +InvalidArgument - the curve is not a valid object.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+normal1(self: alias_api.AlCurvePoint) Tuple[int, float, float, float]
+

Find the normal vector to the curve at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the normal was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the normal +y [float] - the y coordinate of the normal +z [float] - the z coordinate of the normal

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+normal2(self: alias_api.AlCurvePoint) Tuple[int, float, float, float]
+

Find the second normal vector to the curve at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the normal was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the second normal +y [float] - the y coordinate of the second normal +z [float] - the z coordinate of the second normal

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+parameter(self: alias_api.AlCurvePoint) Tuple[int, float]
+

Find the parameter value at which the point is present.

+
+
Returns
+

A tuple (status, u), where +status [AlStatusCode] - the status code result

+
+

Success - the parameter was found +InvalidObject - the point is not valid

+
+

u [float] - the curve parameter where point is present

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+radius(self: alias_api.AlCurvePoint) Tuple[int, float]
+

Find the radius of the curve at the point.

+
+
Returns
+

A tuple (status, radius), where +status [AlStatusCode] - the status code result

+
+

Success - the radius was found +InvalidObject - the point is not valid

+
+

radius [float] - the radius of the curve at the point

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+set_parameter(self: alias_api.AlCurvePoint, u: float) int
+

Move the position of a point created on a curve.

+
+
Parameters
+

u (float) – The parameter on the curve where the point has to be moved.

+
+
Returns
+

The status code result +Success - the point was moved +InvalidObject - the point is not valid

+
+
Return type
+

AlStatuscode

+
+
+
+ +
+
+tangent(self: alias_api.AlCurvePoint) Tuple[int, float, float, float]
+

Find the tangent vector to the curve at the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the tangent was found +InvalidObject - the point is not valid

+
+

x [float] - the x coordinate of the tangent +y [float] - the y coordinate of the tangent +z [float] - the z coordinate of the tangent

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+type(self: alias_api.AlCurvePoint) alias_api.AlObjectType
+

Return the AlCurvePoint type identifier.

+
+ +
+
+world_position(self: alias_api.AlCurvePoint) Tuple[int, float, float, float]
+

Find the world coordinates of the point.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the coordinates was found +InvalidObject - the point is not valid

+
+

x [float] - the x world coordinate of the point +y [float] - the y world coordinate of the point +z [float] - the z world coordinate of the point

+

+
+
Return type
+

tuple

+
+
+
+ +
+ +
+
+class alias_api.AlDagNode
+
+
// py::class_<AlDagNode, AlObject, AlPickable, std::unique_ptr<AlDagNode>>( m, “AlDagNode”, R”doc(

Basic Interface to Alias Dag Node objects.

+

This class encapsulates the basic functionality for creating, +manipulating and deleting a dag node. +A dag node is part of a tree-like hierarchical structure +known as a directed acyclic graph or DAG. All dag nodes belong +to a single DAG which is contained in the current universe. The +head of the DAG is accessible by calling the AlUniverse::firstDagNode() +static method.

+

Each dag node can be mutually +attached to a previous and next dag node to form a list of dag +nodes. This list can belong to a group (or parent) dag node. +This list of dag nodes that belong to a group node are called +“children” of the group node.

+

The purpose of a dag node is to contain information which +defines particular affine transformations such as scale, +rotation and translation. There is a specific fixed order in +which the transformations are combined. There are methods for +accessing each particular transformation and a method exists for +obtaining the local tranformation matrix built from these +transformations. For more information, see the description for +the method local_transormation_matrix().

+

Classes derived from this class will refer to a particular type +of object. For example, the AlCameraNode class is derived from +AlDagNode and refers to AlCamera objects only. The shape, +position and/or orientation of the object referred to is +defined by combining the transformations for the dag node with +all the transformations inherited from the dag nodes above it +in the DAG. There is a method for +obtaining the global tranformation matrix, which is built from the local +transformations and all inherited transformations. For example, +if dag node A is a parent of dag node B which is a parent of dag +node C, then the global transformation of C is the matrix product +[C]*[B]*[A], where [C], [B], and [A] are local transformations +of each dag node.

+

A dag node can have some user-defined text associated with it +and so there are methods for getting and setting the text.

+

Users cannot instantiate an AlDagNode directly. A derived class of an +AlDagNode must be instantiated and then if required the create method +of the class must be called. +This will automatically insert the dag node into the DAG as a parent-less +node. A dag node can be moved so that it is a sibling of any +dag node in the DAG. Deleting a dag node removes the node from +its list of siblings. For derived classes, deletion of a dag +node will cause the deletion of the object that it refers to.

+

Since an AlDagNode simply contains transformations but does not +refer to any transformable object, this class is of little +practical use on its own. It is primarily an abstract base class +from which other dag node classes are derived. NOTE that NULL +dag nodes created in the Alias Interactive package are retrieved +by this library as group nodes without children.

+

What does a transformation matrix mean? This matrix is the product +of matrices for scale, rotate and translate. One useful piece of +information from this matrix is the POSITION of an object. The first +three values in the bottom row of the matrix (indices (3,0), (3,1), +and (3,2)) represent the translation of the origin (0,0,0) in the x, y, +and z directions. For instance, if you placed a sphere at (20, 30, 16) +in the Alias interactive package, then moved it to (-30, 16, 28), +you would notice that its global transformation matrix would have +(-30, 16, 28) in the bottom row.

+

Additionally AlDagNode includes AlCopyOptions as a nested class. +This class allows for the querying and setting of options for +AlDagNode.copy_object(). When first instantiated an instance +of AlCopyOptions will have it’s values set according to the +values in Edit->Duplicate Object option box. It is not possible +to set the values in this option box through this class.

+
+
+
+
+add_joint(self: alias_api.AlDagNode) int
+

Add an AlJoint to this dag node to maintain IK information.

+
+ +
+
+add_sibling_node(self: alias_api.AlDagNode, sibling: alias_api.AlDagNode) int
+

Insert an AlDagNode as the next sibling of this AlDagNode object.

+
+ +
+
+affected_transformation_matrix(*args, **kwargs)
+

Overloaded function.

+
    +
  1. affected_transformation_matrix(self: alias_api.AlDagNode, tm: alias_api.AlTM, matrix: alias_api.AlTM) -> int

  2. +
+

Compute the transformation matrix for the object which is obtained by multiplying the local transformation matrix with the given AlTM ‘tm’.

+
    +
  1. affected_transformation_matrix(self: alias_api.AlDagNode, tm: alias_api.AlTM) -> Tuple[int, List[List[float[4]][4]]]

  2. +
+

Compute the transformation matrix for the object which is obtained by multiplying the local transformation matrix with the given AlTM ‘tm’.

+
+ +
+
+bounding_box(self: alias_api.AlDagNode) Tuple[int, List[List[float[4]][8]]]
+

Returns the eight corners of the bounding box in world space.

+
+ +
+
+comment(self: alias_api.AlDagNode) Tuple[int, int, str]
+

Obtain the size and address of a block of textual data associated with the object.

+
+ +
+
+copy_object(*args, **kwargs)
+

Overloaded function.

+
    +
  1. copy_object(self: alias_api.AlDagNode, options: AlDagNode::AlCopyOptions = None) -> alias_api.AlDagNode

  2. +
+

Copy this AlDagNode returning a pointer to the new copy.

+
    +
  1. copy_object(self: alias_api.AlDagNode, options: AlDagNode::AlCopyOptions, num_of_blind_data_ids_to_copy: int, blind_data_ids_to_copy: int) -> alias_api.AlDagNode

  2. +
+

Return an exact duplicate of this AlDagNode wrapper.

+
+ +
+
+copy_transform(self: alias_api.AlDagNode, node: alias_api.AlDagNode) int
+

Copy the local transformation from the given node on to this node.

+
+ +
+
+copy_wrapper(self: alias_api.AlDagNode) alias_api.AlObject
+

Return an exact duplicate of this AlDagNode wrapper.

+
+ +
+
+create_symmetric_geometry(self: alias_api.AlDagNode) int
+

Create the symmetric geometry for this node if it is on a symmetric plane.

+
+ +
+
+delete_object(self: alias_api.AlDagNode) int
+

Delete the AlDagNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+do_updates(self: alias_api.AlDagNode, new_state: int = 1) int
+

The doUpdate flag is used to notify the system that you are finished performing. If this flag is True, then it is equivalent to sending out a ‘geometry modified’ message to the rest of the system.

+
+ +
+
+get_surface_orientation(self: alias_api.AlDagNode) Tuple[int, int]
+

Set the ‘opposite’ flag of the surface or mesh in ‘node’.

+
+ +
+
+global_transformation_matrix(*args, **kwargs)
+

Overloaded function.

+
    +
  1. global_transformation_matrix(self: alias_api.AlDagNode, matrix: alias_api.AlTM) -> int

  2. +
+

Compute the global transformation matrix for the object.

+
    +
  1. global_transformation_matrix(self: alias_api.AlDagNode) -> Tuple[int, List[List[float[4]][4]]]

  2. +
+

Compute the global transformation matrix for the object.

+
+ +
+
+inverse_global_transformation_matrix(*args, **kwargs)
+

Overloaded function.

+
    +
  1. inverse_global_transformation_matrix(self: alias_api.AlDagNode, matrix: alias_api.AlTM) -> int

  2. +
+

Compute the inverse global transformation matrix for the object.

+
    +
  1. inverse_global_transformation_matrix(self: alias_api.AlDagNode) -> Tuple[int, List[List[float[4]][4]]]

  2. +
+

Compute the inverse global transformation matrix for the object.

+
+ +
+
+is_a_construction_plane(self: alias_api.AlDagNode) int
+

Return True if the dag node is a construction plane.

+
+ +
+
+is_ancestor_an_instance(self: alias_api.AlDagNode) int
+

Returns True if this AlDagNode or one of its ancestors is an instance node, else False.

+
+ +
+
+is_display_mode_set(self: alias_api.AlDagNode, mode: alias_api.AlDisplayModeType) int
+

Return true if the specified display mode is set (on), else false.

+
+ +
+
+is_instanceable(self: alias_api.AlDagNode) int
+

Return True. An AlDagNode is instanceable by default, unless overridden by derived class.

+
+ +
+
+is_instanced(self: alias_api.AlDagNode) int
+

Return True if this is an instance node.

+
+ +
+
+layer(self: alias_api.AlDagNode) alias_api.AlLayer
+

Returns layer the node is assigned.

+
+ +
+
+local_rotate_by(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Perform a dag node rotation based on the setting of the local axes.

+
+ +
+
+local_rotation_angles(self: alias_api.AlDagNode) Tuple[int, float, float, float]
+

These angles allow you to determine how the local rotation axis have been rotated from their initial position.

+
+ +
+
+local_rotation_axes(self: alias_api.AlDagNode) Tuple[int, List[float[3]], List[float[3]], List[float[3]]]
+

Return the vectors representing the local rotation axes for this node. These axes are the three axes vectors in the world space co-ordinates.

+
+ +
+
+local_transformation_matrix(*args, **kwargs)
+

Overloaded function.

+
    +
  1. local_transformation_matrix(self: alias_api.AlDagNode, matrix: alias_api.AlTM) -> int

  2. +
+

Compute the local transformation matrix for the object.

+
    +
  1. local_transformation_matrix(self: alias_api.AlDagNode) -> Tuple[int, List[List[float[4]][4]]]

  2. +
+

Compute the local transformation matrix for the object.

+
+ +
+
+local_translate_by(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Perform a dag node translation based on the setting of the local axes.

+
+ +
+
+property name
+

Get or set the AlDagNode name.

+
+ +
+
+next_node(self: alias_api.AlDagNode) alias_api.AlDagNode
+

Return a pointer to the object’s next sibling AlDagNode or None if there is no next sibling.

+
+ +
+
+parent_node(self: alias_api.AlDagNode) AlGroupNode
+

Returns the parent group node.

+
+ +
+
+prev_node(self: alias_api.AlDagNode) alias_api.AlDagNode
+

Return a pointer to the object’s previous sibling AlDagNode or None if there is no next sibling.

+
+ +
+
+remove_blind_data(self: alias_api.AlDagNode, user_type: int) int
+

Remove the block of data of the given type from the object.

+
+ +
+
+remove_comment(self: alias_api.AlDagNode) int
+

Remove the block of text associated with this object from the object itself.

+
+ +
+
+remove_joint(self: alias_api.AlDagNode) int
+

Remove the AlJoint to this dag node to maintain IK information.

+
+ +
+
+rotate_pivot(self: alias_api.AlDagNode) Tuple[int, alPyMath::Vec3]
+

Returns a vector that represents the rotation pivot position in world space.

+
+ +
+
+rotation(self: alias_api.AlDagNode) Tuple[int, float, float, float]
+

Return the amount of rotation (in degrees) about the x, y, and z axes.

+
+ +
+
+scale(self: alias_api.AlDagNode) Tuple[int, float, float, float]
+

Return the amount of scale in the x, y, and z direction.

+
+ +
+
+scale_pivot(self: alias_api.AlDagNode) Tuple[int, alPyMath::Vec3]
+

Returns a vector that represents the scale pivot position in world space.

+
+ +
+
+search_across(self: alias_api.AlDagNode, name: str) alias_api.AlDagNode
+

Search across the DAG tree (starting at the current node), for a dag node with a specific ‘name’.

+
+ +
+
+search_below(self: alias_api.AlDagNode, name: str) alias_api.AlDagNode
+

Search the DAG tree (rooted at the child of the current node), for a dag node with a specific ‘name’.

+
+ +
+
+send_geometry_modified_message(self: alias_api.AlDagNode) int
+

Send out an update message notifying that the geometry of this dag node has been modified.

+
+ +
+
+set_blind_data(self: alias_api.AlDagNode, user_type: int, size: int, data: str) int
+

Associates a block of ‘data’ with the object.

+
+ +
+
+set_comment(self: alias_api.AlDagNode, size: int, data: str) int
+

Associates a block of textual ‘data’ with the object.

+
+ +
+
+set_display_mode(self: alias_api.AlDagNode, mode: alias_api.AlDisplayModeType, on: int) int
+

Set the display mode (by name) for this dag node.

+
+ +
+
+set_layer(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_layer(self: alias_api.AlDagNode, layer: alias_api.AlLayer) -> int

    +
    +

    Set the layer on the dag node.

    +

    When a layer is set to an AlDagNode, the following settings are done:

    +
    +
      +
    1. All the child nodes of the current node are automatically assigned +to the layer object.

    2. +
    3. All the parent nodes are automatically assigned to the default layer.

    4. +
    5. All the sibling nodes are unaffected.

    6. +
    +
    +
    +
    param layer
    +

    The layer object to be assigned to the AlDagNode

    +
    +
    type layer
    +

    AlLayer

    +
    +
    return
    +

    The status code result +Success - the layer was assigned successfully +InvalidArgument - the layer is invalid +InvalidObject - the dag node was invalid

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. set_layer(self: alias_api.AlDagNode, layer_number: int) -> int

    +
    +

    Set the layer ID on the dag node.

    +

    When a layer is set to an AlDagNode, the following settings are done:

    +
    +
      +
    1. All the child nodes of the current node are automatically assigned +to the layer object.

    2. +
    3. All the parent nodes are automatically assigned to the default layer.

    4. +
    5. All the sibling nodes are unaffected.

    6. +
    +
    +
    +
    param layer_number
    +

    The layer number to be assigned to the AlDagNode

    +
    +
    type layer_number
    +

    int

    +
    +
    return
    +

    The status code result +Success - the layer was assigned successfully +InvalidArgument - the layer number is invalid +InvalidObject - the dag node was invalid

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+set_local_rotation_angles(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Setting the local rotation angles is the only means by which the local rotations axes can be modified.

+
+ +
+
+set_local_rotation_axes(self: alias_api.AlDagNode, arg0: List[float[3]], arg1: List[float[3]], arg2: List[float[3]]) int
+

Set the local rotation axes of this dag node to the given world space vectors.

+
+ +
+
+set_rotate_pivot(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_rotate_pivot(self: alias_api.AlDagNode, p: alPyMath::Vec3) -> int

    +
    +

    Set the rotate pivot.

    +
    +
    param p
    +

    The rotate pivot position in world space.

    +
    +
    type p
    +

    Vec3

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. set_rotate_pivot(self: alias_api.AlDagNode, x: float, y: float, z: float) -> int

    +
    +

    Set the rotate pivot.

    +
    +
    param x
    +

    The x component of the rotate pivot position in world space.

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    The y component of the rotate pivot position in world space.

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    The z component of the rotate pivot position in world space.

    +
    +
    type z
    +

    float

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+set_rotation(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Set the amount of rotation (in degress) about the x, y, z axes. The rotation will be done after the scale transformation and before the final local translation.

+
+ +
+
+set_scale(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Set the local scale vector. The scale transformation will be done before the local rotations. There is no restriction on the values of the components of the scale vector.

+
+ +
+
+set_scale_pivot(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_scale_pivot(self: alias_api.AlDagNode, p: alPyMath::Vec3) -> int

    +
    +

    Set the scale pivot.

    +
    +
    param p
    +

    The scale pivot position in world space.

    +
    +
    type p
    +

    Vec3

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. set_scale_pivot(self: alias_api.AlDagNode, x: float, y: float, z: float) -> int

    +
    +

    Set the scale pivot.

    +
    +
    param x
    +

    The x component of the scale pivot position in world space.

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    The y component of the scale pivot position in world space.

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    The z component of the scale pivot position in world space.

    +
    +
    type z
    +

    float

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+set_surface_orientation(self: alias_api.AlDagNode, flag: int) int
+

Set the ‘opposite’ flag of the surface or mesh in ‘node’.

+
+ +
+
+set_translation(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Set the final local translation vector. The translation transformation will be done after rotations.

+
+ +
+
+set_world_translation(self: alias_api.AlDagNode, x: float, y: float, z: float) int
+

Set the final world translation vector.

+
+ +
+
+translation(self: alias_api.AlDagNode) Tuple[int, float, float, float]
+

Return the final local translation vector.

+
+ +
+
+type(self: alias_api.AlDagNode) alias_api.AlObjectType
+

Return the AlDagNode type identifier.

+
+ +
+
+update_draw_info(self: alias_api.AlDagNode) int
+

Force the internal draw information to be updated to match the dag node’s geometry.

+
+ +
+
+version(self: alias_api.AlDagNode) int
+

Return the version of the dag node.

+
+ +
+ +
+
+class alias_api.AlDeviationLocator
+

Interface to Alias deviation locator.

+

A deviation locator finds and displays the shortest distance between +two curves, from a given point on the first curve to the second curve. +The two curves can be any of the AlCurve or AlCurveOnSurface. This +class contains methods to create the locator, query the minimum distance, +and set the display attributes in the Alias windows. If any two curves on +which this locator depends is deleted, this locator is automatically deleted.

+
+
+attached_to(self: alias_api.AlDeviationLocator) Tuple[int, alias_api.AlObject, alias_api.AlObject]
+

Returns the two objects that are used to create the deviation +locator. This locator can be attached to curves on surfaces +or curve nodes.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the attached to objects were found +InvalidObject - the object is not valid +Failure - the method failed

+
+
    +
  1. the first object

  2. +
  3. the second object

  4. +
+

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlDeviationLocator) alias_api.AlObject
+

Return an exact duplicate of this AlDeviationLocator wrapper.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlDeviationLocator, base_curve: alias_api.AlCurve, target_curve: alias_api.AlCurve, base_param: float = 0.0) -> int

    +
    +

    Create a Deviation locator between two curves.

    +
    +
    param base_curve
    +

    The curve from which the deviation is calculated

    +
    +
    type base_curve
    +

    AlCurve

    +
    +
    param target_curve
    +

    The curve to which the minimum deviation is calculated

    +
    +
    type target_curve
    +

    AlCurve

    +
    +
    param base_param
    +

    The parameter on baseCurve from which the minimum +deviation to the target curve is calculated.

    +
    +
    type base_paramu
    +

    float

    +
    +
    return
    +

    The status code result of the operation: +Success - the deviation locator was successfully created. +Failure - the locator was not created +AlreadyCreated - object has already been created +InvalidArgument - the baseCurve or targetCurve is not valid.

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlDeviationLocator, base_curve: alias_api.AlCurveOnSurface, target_curve: alias_api.AlCurve, base_param: float = 0.0) -> int

    +
    +

    Create a Deviation locator between a curve on surface an a curve.

    +
    +
    param base_curve
    +

    The curve on surface from which the deviation is calculated

    +
    +
    type base_curve
    +

    AlCurveOnSurface

    +
    +
    param target_curve
    +

    The curve to which the minimum deviation is calculated

    +
    +
    type target_curve
    +

    AlCurve

    +
    +
    param base_param
    +

    The parameter on baseCurve from which the minimum +deviation to the target curve is calculated.

    +
    +
    type base_paramu
    +

    float

    +
    +
    return
    +

    The status code result of the operation: +Success - the deviation locator was successfully created. +Failure - the locator was not created +AlreadyCreated - object has already been created +InvalidArgument - the baseCurve or targetCurve is not valid.

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
  5. create(self: alias_api.AlDeviationLocator, base_curve: alias_api.AlCurveOnSurface, target_curve: alias_api.AlCurveOnSurface, base_param: float = 0.0) -> int

    +
    +

    Create a Deviation locator between two curves on surface.

    +
    +
    param base_curve
    +

    The curve on surface from which the deviation is calculated

    +
    +
    type base_curve
    +

    AlCurveOnSurface

    +
    +
    param target_curve
    +

    The curve on surfaceto which the minimum deviation is calculated

    +
    +
    type target_curve
    +

    AlCurveOnSurface

    +
    +
    param base_param
    +

    The parameter on baseCurve from which the minimum +deviation to the target curve is calculated.

    +
    +
    type base_paramu
    +

    float

    +
    +
    return
    +

    The status code result of the operation: +Success - the deviation locator was successfully created. +Failure - the locator was not created +AlreadyCreated - object has already been created +InvalidArgument - the baseCurve or targetCurve is not valid.

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  6. +
+
+ +
+
+deviation(self: alias_api.AlDeviationLocator) Tuple[int, float]
+

Finds the minimum deviation as calculated by the deviation locator

+
+
Returns
+

The status code result of the operation: +Success - the deviation was found +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+deviation_components(self: alias_api.AlDeviationLocator) Tuple[int, float, float, float]
+

Finds the components of minimum deviation as calculated by the +deviation locator

+
+
Returns
+

The status code result of the operation: +Success - the deviation components were found +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+left_justify(self: alias_api.AlDeviationLocator) Tuple[int, int]
+

Find whether the text of deviation locator is left justified or right justified.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the justification was found +InvalidObject - the object is not valid

+
+
    +
  1. a boolean value indicating whether the text is left justified

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+length(self: alias_api.AlDeviationLocator) Tuple[int, float]
+

Find the length of the leader line in the deviation locator.

+
+
Returns
+

The status code result of the operation: +Success - the length was found successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+offset(self: alias_api.AlDeviationLocator) Tuple[int, float, float, float]
+

Find the components of display offset in the deviation locator

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the offset was found successfully +InvalidObject - the object is not valid

+
+
    +
  1. the offset x z value

  2. +
  3. the offset y value

  4. +
  5. the offset z value

  6. +
+

+
+
+
+ +
+
+parameter(self: alias_api.AlDeviationLocator) Tuple[int, float]
+

Get the curve parameter where deviation locator is located.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the parameter was found

+
+
    +
  1. the curve parameter at the locator

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+parameter_target_curve(self: alias_api.AlDeviationLocator) Tuple[int, float]
+

Finds the parameter on the targetCurve which is at the minimum deviation. +to the baseCurve

+
+
+
param
+

value: The value of the parameter on targetCurve.

+
+
+
+
+
Returns
+

The status code result of the operation: +Success - the parameter was found +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_left_justify(self: alias_api.AlDeviationLocator, left_justify: int) int
+

Set the justification of the text for the Deviation locator.

+

The text can be right justified or left justified.

+
+
Parameters
+

left_justify (bool) – A value of true makes the text left +justified and a value false makes it right justified.

+
+
Returns
+

The status code result of the operation: +Success - setting was successful +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_length(self: alias_api.AlDeviationLocator, len: float) int
+

Set the length of the leader line in the deviation display +in the modeling windows

+
+
Parameters
+

len (float) – The length of the leader line

+
+
Returns
+

The status code result of the operation: +Success - the length was set successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_offset(self: alias_api.AlDeviationLocator, x: float, y: float, z: float) int
+
+

Set the components of display offset in the deviation locator.

+
+

The display offset is the relative vector between the deviation +locator and start of the leader line which displays the deviation +value

+
+
Parameters
+
    +
  • x (float) – The offset x component

  • +
  • y (float) – The offset y component

  • +
  • z – The offset z component

  • +
+
+
+
+ +
+
+set_parameter(self: alias_api.AlDeviationLocator, u: float) int
+

Set the curve parameter at which the deviation locator is located.

+
+
Parameters
+

u (float) – The curve parameter

+
+
Returns
+

The status code result of the operation: +Success - the parameter was set +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+type(self: alias_api.AlDeviationLocator) alias_api.AlObjectType
+

Return the AlDeviationLocator type identifier.

+
+ +
+ +
+
+class alias_api.AlDisplayModeType
+

Display mode types.

+

Members:

+
+

GeomEditPoints

+

BoundingBox

+

Invisible

+

GeomKeyPoints

+

Template

+

Dashed

+

ConstructionPlane

+

GeomHull

+

GeomCVs

+

CompressedSbd

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlDistanceLocator
+

Displays the distance between two locators.

+

This locator is used to display and find the distance between any +two point locators (AlPointLocator). If any of the two point locators +on which this locator depends is deleted, this locator is automatically +deleted. This class contains methods to create the locator, query the +distance, and set the display attributes of the locator.

+
+
+copy_wrapper(self: alias_api.AlDistanceLocator) alias_api.AlObject
+

Return an exact duplicate of this AlDistanceLocator wrapper.

+
+ +
+
+create(self: alias_api.AlDistanceLocator, start_point: AlPoint, end_point: AlPoint, true_display: int = True) int
+

Create a new AlDistanceLocator in the Alias Universe.

+
+ +
+
+distance(self: alias_api.AlDistanceLocator) Tuple[int, float, float, float]
+
+ +
+
+end_point(self: alias_api.AlDistanceLocator) AlPoint
+

Returns the ending Point of this Distance locator. +However, if the distance locator is not valid, None is returned.

+
+ +
+
+length(self: alias_api.AlDistanceLocator) Tuple[int, float]
+

Calculate the length (in centimeters) of the distance vector.

+
+ +
+
+offset(self: alias_api.AlDistanceLocator) Tuple[int, float]
+

Get the offset of the locator display.

+
+
Parameters
+

value (float) – The display offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was found +InvalidObject - the object is not valid

+
+
+
+ +
+
+set_offset(self: alias_api.AlDistanceLocator, offset: float) int
+

Set the offset in the locator display.

+
+
Parameters
+

offset (float) – The value of the offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was set +InvalidObject - the object is not valid

+
+
+
+ +
+
+set_true_display(self: alias_api.AlDistanceLocator, value: int) int
+

Set the display type of this Distance locator. +If the distance locator is not valid, None is returned.

+
+ +
+
+start_point(self: alias_api.AlDistanceLocator) AlPoint
+

Returns the starting Point of this Distance locator. +However, if the distance locator is not valid, None is returned.

+
+ +
+
+true_display(self: alias_api.AlDistanceLocator) Tuple[int, int]
+

Returns 1 if true display is set, else 0.

+
+ +
+
+type(self: alias_api.AlDistanceLocator) alias_api.AlObjectType
+

Return the AlDistanceLocator type identifier.

+
+ +
+ +
+
+class alias_api.AlEnvironment
+

Base object for representing shader environment data

+

This class encapsulates the basic functionality for checking and +setting the name of an environment. It also encapsulates accessing the +textures that a particular environment refers to, and the animation +on the environment. When the wire file is read, the environment +contained therein are created as an AlEnvironment class object. +This environment object is accessible through the AlUniverse class.

+

An environment object may reference textures. The first_texture and +next_texture methods are used to access these textures.

+

first_texture() returns the first texture that the environment object +references. next_texture() moves from a given referenced texture +to the next texture in order, as related to the environment object. +(See the similar methods for the AlTexture/AlShader classes.)

+

The animation on the environment can be accessed through the +first_channel() and next_channel() methods. All the channels on the +environment can be deleted by calling deleteAnimation().

+

The environment parameters can be accessed through the parameter() and +setParameter() methods. Each shader has a specific set of parameters +that are valid for it that depend on its type. The full list of +environment parameters can be seen in the file AlAnim.h. For example, +all parameters specific to the Blinn shader have names of the form +kFLD_SHADING_BLINN_*. Parameters common to all shaders have the form +kFLD_SHADING_COMMON_*. All parameters are treated as doubles even +though this may not necessarily be what they are. This is done to +make the interface as simple and consistent as possible.

+

The user can neither create nor destroy an AlEnvironment class object +at this time.

+
+
+add_texture(self: alias_api.AlEnvironment, field_name: str, texture_type: str) Tuple[int, alias_api.AlTexture]
+

Add a texture to the field of the AlEnvironment.

+
+ +
+
+apply_iterator_to_textures(self: alias_api.AlEnvironment, iter: AlIterator, retcode: int) int
+

Applies the given AlIterator to all textures of this environment. The second argument will be set to the return value of the last application of the iterator’s function.

+
+ +
+
+copy_wrapper(self: alias_api.AlEnvironment) alias_api.AlObject
+

Return an exact duplicate of this AlEnvironment wrapper.

+
+ +
+
+delete_object(self: alias_api.AlEnvironment) int
+

Delete the Alias shader object and return the status code of the delete operation.

+
+ +
+
+fields(self: alias_api.AlEnvironment) List[alias_api.AlShadingFields]
+

Returns a list of ShadingFieldItems, each of which contains an ShadingFields value valid for this environment.

+
+ +
+
+first_texture(self: alias_api.AlEnvironment) alias_api.AlTexture
+

Return the first texture.

+
+ +
+
+mapped_fields(self: alias_api.AlEnvironment) List[str]
+

Return a list of all the mapped fields used by the environment.

+
+ +
+
+property name
+

Get or set the AlEnvironment name.

+
+ +
+
+next_texture(self: alias_api.AlEnvironment, cur_texture: alias_api.AlTexture) alias_api.AlTexture
+

Return the next texture. WARNING: this function may be broken and only returns the first texture.

+
+ +
+
+parameter(self: alias_api.AlEnvironment, parameter_name: alias_api.AlShadingFields) Tuple[int, float]
+

Finds the value of a given texture field.

+
+ +
+
+remove_texture(self: alias_api.AlEnvironment, field_name: str) int
+

Remove the texture from the field of the AlEnvironment.

+
+ +
+
+set_parameter(self: alias_api.AlEnvironment, parameter_name: alias_api.AlShadingFields, value: float) int
+

Changes the value of the texture field.

+
+ +
+
+type(self: alias_api.AlEnvironment) alias_api.AlObjectType
+

Return the AlEnvironment type identifier.

+
+ +
+ +
+
+class alias_api.AlFace
+

Interface to Alias face curves.

+

An AlFace is derived from AlCurve and inherits AlCurve’s public methods.

+

AlFace objects are created independently from the AlFaceNode, and +then added to the AlFaceNode afterwards. An AlFaceNode requires +one valid AlFace object in order for it to be created. Other +faces can be added to the list of faces under the AlFaceNode +afterwards using AlFaceNode.add_face().

+

Deleting a face can cause one of two things to happen. If the AlFace +is not under an AlFaceNode, or it is one of several faces under an +AlFaceNode, then only the face will be deleted. If the AlFace is +the only face under the AlFaceNode, then the AlFaceNode will also +be deleted.

+

Each face curve must be planar and each face curve must lie in the same +plane as all the others. In addition to the parent class (AlCurve) +methods this class allows you to walk through the list of the face +curves that make up the face.

+

All AlFace objects will have at least one shader attached to them. +These can be accessed through the firstShader and nextShader methods.

+
+
+copy_wrapper(self: alias_api.AlFace) alias_api.AlObject
+

Return an exact duplicate of this AlFace wrapper.

+
+ +
+
+delete_object(self: alias_api.AlFace) int
+

Delete the AlFace from the Alias Universe and return the status of the performed operation.

+
+ +
+
+face_node(self: alias_api.AlFace) AlFaceNode
+

Return the face node associated with this face.

+
+ +
+
+first_shader(self: alias_api.AlFace) AlShader
+

Return the first shader that this face object references.

+
+ +
+
+get_layered_shader(self: alias_api.AlFace) AlLayeredShader
+

Return the layered shader that this face object references.

+
+ +
+
+get_switch_shader(self: alias_api.AlFace) AlSwitchShader
+

Return the switch shader that this face object references.

+
+ +
+
+next_face(self: alias_api.AlFace) alias_api.AlFace
+

Return a pointer to the next face in the list of faces.

+
+ +
+
+next_shader(self: alias_api.AlFace, shader: AlShader) AlShader
+

Return the shader after the given shader in the shader list. Specify None as the shader parameter will return the first shader.

+
+ +
+
+prev_face(self: alias_api.AlFace) alias_api.AlFace
+

Return a pointer to the previous face in the list of faces.

+
+ +
+
+type(self: alias_api.AlFace) alias_api.AlObjectType
+

Return the AlFace type identifier.

+
+ +
+ +
+
+class alias_api.AlFaceNode
+

Interface to the dag node that gives access to faces.

+

AlFaceNode is the class used to access faces in the dag. Faces +can be created from scratch or read in from a wire file and +accessed via the first_face() method. Faces are a collection of +curves that all lie in the same plane. An AlFaceNode points to +an AlFace, which points to the next face in the collection etc…

+

Add faces to the collection with the add_face() method and +remove them with the removeFace() method. In order to access the +list of faces, you walk through the face list with AlFace +methods next_face() and prev_face().

+

There are two ways to delete an AlFaceNode. If the +AlFaceNode.delete_object() method is called, then this node’s AlFace +objects are all deleted. If this node only has one face and its +delete_object() method is called, then this node is deleted as well.

+
+
+add_face(self: alias_api.AlFaceNode, face: alias_api.AlFace) int
+

Add a face to the end of the list of faces. The face must not already belong to another face node.

+
+ +
+
+convert_to_trimmed_surface(self: alias_api.AlFaceNode, world_space: int = False) alias_api.AlSurface
+

Return an AlSurface that represents the AlFace geometry converted to a trimmed surface. Return None if the AlFace geometry is invalid for any reason. A trimmed surface will not be created if the AlFace curves are non-planar or intersecting.

+
+ +
+
+copy_wrapper(self: alias_api.AlFaceNode) alias_api.AlObject
+

Return an exact duplicate of this AlFaceNode wrapper.

+
+ +
+
+create(self: alias_api.AlFaceNode, face: alias_api.AlFace) int
+

This method allocates teh dag node for the AlFaceNode. It adds the given face as the first face of the face node.

+
+ +
+
+first_face(*args, **kwargs)
+

Overloaded function.

+
    +
  1. first_face(self: alias_api.AlFaceNode) -> alias_api.AlFace

  2. +
+

Return the first face in the list of faces.

+
    +
  1. first_face(self: alias_api.AlFaceNode, tm: alias_api.AlTM) -> alias_api.AlFace

  2. +
+

Return the first face in the list of faces and update the ‘tm’ with the face node’s transformation matrix.

+
+ +
+
+normal(self: alias_api.AlFaceNode) Tuple[int, float, float, float]
+

Attempts to calculate the overall normal of all teh face curves in this face.

+
+ +
+
+remove_face(self: alias_api.AlFaceNode, face: alias_api.AlFace) int
+

Remove a face from the list of faces. This must not be the last face under the face node. When the face is removed from under the face node, it is no longer part of the universe taht would be stored.

+
+ +
+
+type(self: alias_api.AlFaceNode) alias_api.AlObjectType
+

Return the AlFaceNode type identifier.

+
+ +
+ +
+
+class alias_api.AlFileType
+

File types

+

Members:

+
+

Dwg

+

Unknown

+

ProRender

+

Wire

+

Dxf

+

Vdafs

+

Iges

+

Edf

+

Tri

+

C4x

+

Vdais

+

Jamais

+

Quad

+

Inventor

+

Stl

+

Obj

+

Fbx

+

Unused

+

Epsf

+

Illustrator

+

JT

+

Slc

+

Acis

+

CatiaV5

+

Nx

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlGroupNode
+

A dag node which can contain a list of dag nodes.

+

This class encapsulates the functionality for creating, +manipulating and deleting a group node. A group node is a dag +node which refers to a list of child dag nodes. It is this type +of dag node which allows the hierarchical grouping of dag nodes.

+

The transformations which can be defined for a group node are +inherited by each child dag node. This means that a +group node’s transformations are combined with a child node’s +transformations to define a global transformation for the object +that the child node refers to.

+

A group node’s list of child dag nodes can be shared by more +than one group node. If a group node’s list of child nodes is +shared by another group node, both group nodes are considered +“instanced”. This can be achieved by using the createInstance() +method to create an instanced group node from another group +node. The instanced group node is created as a sibling of the +group node. There are methods for finding the next and previous +instanced group node among its siblings and for determining +whether a group node is an instanced node.

+

To create a group node, the user must call the constructor and +then the create method for an AlGroupNode object. If a group +node is not an instanced group node, deleting it will cause the +deletion of all the child dag nodes and the deletion of any +objects the child dag nodes refer to. Deleting an instanced +group node will not cause all of its child nodes to be deleted +since the list of child nodes is shared by another instanced +group node.

+

Note on AlGroupNode.delete_object():

+

If a group node is an instanced group node, then only the group +node is removed from its list of siblings and is deleted. +The list of child dag nodes an instanced dag node refers to is +not deleted. If this group node +is not an instanced group node (i.e. none of its siblings share +its list of child dag nodes), then the group node is removed +from list of siblings it belongs to and the group node and +every child node of the group node is deleted.

+
+
+add_child_node(self: alias_api.AlGroupNode, child_node: alias_api.AlDagNode) int
+

Adds an AlDagNode to the end of the list of child AlDagNodes. If +the AlDagNode is already a child of this object, then nothing is +done. Otherwise, the AlDagNode is removed from the list of +siblings it belongs to and added to the end of this object’s +list of children. If the AlDagNode is an AlGroupNode and it has +siblings which are instanced AlGroupNodes, those instanced +siblings are also made children of this object. It is illegal +for the AlDagNode argument to be NULL or for it to not have had +its create() method called.

+
+
Parameters
+

child (AlDagNode) – the AlDagNode to be made a child of this object

+
+
Returns
+

The status code result +sSuccess - the argument is now a child of this object +sInvalidArgument - ‘child’ was not valid +sFailure - the AlDagNode could not be made a child of this object +sInvalidObject - the groupnode was invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+add_children(self: alias_api.AlGroupNode, children: List[alias_api.AlDagNode]) int
+

Adds an AlDagNode to the end of the list of child AlDagNodes. If +the AlDagNode is already a child of this object, then nothing is +done. Otherwise, the AlDagNode is removed from the list of +siblings it belongs to and added to the end of this object’s +list of children. If the AlDagNode is an AlGroupNode and it has +siblings which are instanced AlGroupNodes, those instanced +siblings are also made children of this object. It is illegal +for the AlDagNode argument to be NULL or for it to not have had +its create() method called.

+
+
Parameters
+

children (List[AlDagNode]) – the children to add to this object.

+
+
Returns
+

The status code result +sSuccess - the argument is now a child of this object +sInvalidArgument - ‘child’ was not valid +sFailure - the AlDagNode could not be made a child of this object +sInvalidObject - the groupnode was invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+apply_iterator_to_children(self: alias_api.AlGroupNode, arg0: AlIterator, arg1: int) int
+

Apply the iterator to each of the children in this AlGroupNode.

+
+ +
+
+child_node(*args, **kwargs)
+

Overloaded function.

+
    +
  1. child_node(self: alias_api.AlGroupNode) -> alias_api.AlDagNode

  2. +
+

Return the first AlDagNode in the list of child AlDagNodes.

+
    +
  1. child_node(self: alias_api.AlGroupNode, arg0: alias_api.AlTM) -> alias_api.AlDagNode

  2. +
+

Return the first AlDagNode in the list of child AlDagNodes. The AlTM will be updated with the group node’s transform matrix.

+
+ +
+
+copy_wrapper(self: alias_api.AlGroupNode) alias_api.AlObject
+

Return an exact duplicate of this AlGroupNode wrapper.

+
+ +
+
+create(self: alias_api.AlGroupNode) int
+

Initialize the AlGroupNode in the Alias Universe.

+
+ +
+
+is_instance_node(self: alias_api.AlGroupNode) int
+

Return True if this object shares its list of children with another sibling AlGroupNode.

+
+ +
+
+is_instanceable(self: alias_api.AlGroupNode) int
+

Return False if this group node contains a non-instanceable dag node, else True.

+
+ +
+
+next_instance(self: alias_api.AlGroupNode) alias_api.AlGroupNode
+

Return a pointer to the object’s next sibling node in the list which is an instanced group node.

+
+ +
+
+prev_instance(self: alias_api.AlGroupNode) alias_api.AlGroupNode
+

Return a pointer to the object’s previous sibling node in the list which is an instanced group node.

+
+ +
+
+type(self: alias_api.AlGroupNode) alias_api.AlObjectType
+

Return the AlGroupNode type identifier.

+
+ +
+ +
+
+class alias_api.AlHashable
+

Base class for objects which can be inserted into an AlDictionary.

+

AlHashable provides a contract for any class which wishes to be +stored in an AlDictionary, namely the necessity of providing a hash +key and the ability to be stored in a list.

+
+ +
+
+class alias_api.AlIKHandle
+

Interface to Inverse Kinematics Handles.

+

A skeleton is just a collection of joint dag nodes that have no +particular special behaviour until IK handles are applied to them. +In order to use inverse kinematics in Alias, you have to create +IK handles that define paths along skeletons to be constrained by IK.

+

An IK handle is defined by two joints. The end effector is +the point on the skeleton that is free to move, and the root +is the anchor point on the skeleton. When the end effector is +moved, the rotations on all joints leading up to the root are +constrained to provide an appropriate IK solution.

+

The IK handle also specifies the solver that will be used. +There are two kinds of IK solvers in Alias. The single-chain +solver is analytic and always produces a unique solution. The +multi-chain solver is iterative, and the solution depends on +the starting state.

+

Furthermore, single-chain handles are never allowed to overlap other +IK handles, except for the root of one handle meeting the end +effector of another. Multi-chain handles, on the other hand, +are allowed to interfere with one another, the result being a +best-possible IK solution.

+

Single-chain IK handles are always position handles - the rotations +of the joints above the end-effector, and below or at the root, are +transformed to meet the position of the end-effector.

+

Multi-solver IK handles can be position or orientation goals or both. +An orientation goal will try to match the orientation of the bone +immediately above the end-effector to the orientation of the IK handle.

+

Also, multi-solver IK handles have weights. When several multi-solver +IK handles overlap, the weights on these handles are used to determine +the relative effect each solution has on the overall rotation of the +joints in the affected skeleton.

+
+
+copy_wrapper(self: alias_api.AlIKHandle) alias_api.AlObject
+

Return an exact duplicate of this AlIKHandle wrapper.

+
+ +
+
+type(self: alias_api.AlIKHandle) alias_api.AlObjectType
+

Return the AlIKHandle type identifier.

+
+ +
+ +
+
+class alias_api.AlIKHandleNode
+

Interface to dag nodes of IK handles.

+

All AlIKHandles have an associated AlDagNode which define their +position and orientation. This class provides an interface to +the AlDagNode above an AlIKHandle.

+

The position of this AlDagNode defines the goal position for +solving the inverse kinematics. +The rotation of this AlDagNode has a special function +depending on the solver type of the IK handle below.

+

Single-chain: the three rotational axes get mapped to a single plane +rotation and two pole rotations, depending on the rotation order +defined for this IK handle. In particular, the first axis in +the handle’s rotation order controls the rotation of the plane +passing through the root and end-effector nodes, which is used to +orient the single-chain solution. The second and third axes in +the rotation order reorient the up vector of the IK handle. +The IK handle up vector defines the axis around which the +single-chain IK solution will flip when the end-effector crosses +over the line passing through the root and the end-effector. +The IK handle rotation order can be accessed through the +AlIKHandle class.

+

Multi-solver: if the IK handle has an orientation goal, +rotating the IK handle controls the orientation of the bone +directly above the end-effector. A solution will be found such that +the local axes of the end-effector joint attempt to match the +local axes of the IK handle.

+
+
+copy_wrapper(self: alias_api.AlIKHandleNode) alias_api.AlObject
+

Return an exact duplicate of this AlIKHandleNode wrapper.

+
+ +
+
+ik_handle(*args, **kwargs)
+

Overloaded function.

+
    +
  1. ik_handle(self: alias_api.AlIKHandleNode) -> alias_api.AlIKHandle

  2. +
  3. ik_handle(self: alias_api.AlIKHandleNode, arg0: alias_api.AlTM) -> alias_api.AlIKHandle

  4. +
+
+ +
+
+type(self: alias_api.AlIKHandleNode) alias_api.AlObjectType
+

Return the AlIKHandleNode type identifier.

+
+ +
+ +
+
+class alias_api.AlIterator
+

A base class used to derive iterators for performing tasks on elements of a list.

+

Many classes return the first element of a list, which is then +traversed with some operation performed on each element of the +list. This class encapsulates this functionality making it very +easy to write code which performs operations on members of a list.

+

To use this class the method “func” should be overloaded. On +success func() should return zero which will cause the iteration +to continue with the next element in the list. A non-zero return +value will cause the iteration to stop. The returned value will +be returned through the second reference argument in the +applyIterator() method. In general the applyIterator() methods +return sSuccess even when func() returns non-zero. A return +other than sSuccess indicates that the applyIterator() method +failed to function properly.

+

Two types of iterators are defined. The first passes in an +AlObject* to the func(). The second iterator AlIteratorWithParent +passes in the AlObject* and the AlDagNode* parent of the object. +Note that if an AlIteratorWithParent is used and the AlObject +is a shader then the AlDagNode pointer will be null.

+

Iterators should be used to examine or set data in the visited +objects, but should not be used to delete the objects.

+
+
+func(self: alias_api.AlIterator, obj: alias_api.AlObject) int
+

Pure virtual function that subclass must override to provide functionality to apply to iterator.

+
+ +
+ +
+
+class alias_api.AlKeyframe
+

Basic interface to Alias keyframes on parameter curve actions.

+

AlKeyframe represents a keyframe belonging to an AlParamAction. +The keyframe class does not have a create method. New keyframes are +created using the AlParamAction.add_key_frame() methods. +(this is faster than creating the keyframes, then adding them to the +paramaction).

+

A keyframe cannot belong to more than one action. Thus attempting +to add a keyframe that has already been added to an AlParamAction +will fail.

+

If an AlKeyframe is deleted and if the AlKeyframe belongs to an +AlParamAction and it is the last keyframe of that parameter curve +action, then the AlParamAction will also be deleted. This ensures that +no AlParamAction parameter curves will exist with no keyframes.

+

If a keyframe is added to an AlParamAction, and another keyframe +already exists in that AlParamAction with the same location as the +keyframe to be added, then the existing keyframe in the AlParamAction +will be deleted.

+

The method that applies tangent types to a keyframe (i.e. +setTangentTypes()) does not make much sense if the keyframe is not part +of an AlParamAction. It is best to add all the desired keyframes +to an AlParamAction, and then walk the list of keyframes, and calling +the tangent methods.

+

You can lock a keyframe by calling the method AlKeyframe::setLock(TRUE). +If an AlKeyframe is locked, then none of the AlKeyframe +methods that change its location, value or tangents will succeed. +The keyframe is non-modifiable. You can unlock the keyframe again by +calling AlKeyframe::setLock(FALSE).

+
+
+copy_wrapper(self: alias_api.AlKeyframe) alias_api.AlObject
+

Return an exact duplicate of this AlKeyframe wrapper.

+
+ +
+
+delete_object(self: alias_api.AlKeyframe) int
+

This method deletes a keyframe. +If the keyframe is part of an action, then the keyframe will be +removed from the action’s list of keyframes. If the keyframe is +the last keyframe in an action, the action will also be deleted.

+
+
Returns
+

The status code result of the operation: +Success - the object was deleted +Failure - the object could not be deleted +InvalidObject - the object was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+in_tangent(self: alias_api.AlKeyframe) float
+

This method returns the value of the in-tangent of the keyframe. +The value will be between 90.0 and -90.0, where 0.0 represents a flat +(horizontal) tangent pointing to the left, 90.0 means the tangent points +straight up, and -90.0 means the tangent points straight down. +0.0 is returned in the case of an error.

+
+ +
+
+is_locked(self: alias_api.AlKeyframe) int
+

This method returns TRUE if the keyframe is locked, FALSE if +it is not. A locked keyframe means that you cannot change its +time, value or tangents. +FALSE is returned in the case of an error.

+
+ +
+
+location(self: alias_api.AlKeyframe) float
+

This method returns the time value for this keyframe, or 0.0 if +the keyframe is invalid.

+
+ +
+
+next(self: alias_api.AlKeyframe) alias_api.AlKeyframe
+

If this keyframe belongs to a parameter curve action (AlParamAction), +then this method will return the next AlKeyframe in the action (or +NULL if this keyframe is the last keyframe in the action). +If this keyframe does not belong to an action, NULL is returned.

+
+ +
+
+out_tangent(self: alias_api.AlKeyframe) float
+

This method returns the value of the out-tangent of the keyframe. +The value will be between 90.0 and -90.0, where 0.0 represents a flat +(horizontal) tangent pointing to the right, 90.0 means the tangent points +straight up, and -90.0 means the tangent points straight down. +This method returns 0.0 if the keyframe is invalid.

+
+ +
+
+prev(self: alias_api.AlKeyframe) alias_api.AlKeyframe
+

If this keyframe belongs to a parameter curve action (AlParamAction), +then this method will return the previous AlKeyframe in the action (or +NULL if this keyframe is the first keyframe in the action). +If this keyframe does not belong to an action, NULL is returned.

+
+ +
+
+set_in_tangent(self: alias_api.AlKeyframe, in_tangent: float) int
+

This method sets the in-tangent of the keyframe to the given +value. The tangent value must be in the range -90.0 < inTangent < 90.0 +If the given tangent value is outside this range, it is clamped to +within this range.

+

This method requires the AlKeyframe to have been attached to +an AlParamAction, otherwise an assertion will fail.

+
+
Parameters
+

in_tangent (float) – the angle in degrees to which the keyframe’s in tangent should be set.

+
+
Returns
+

The status code result of the operation: +Success - keyframe’s inTangent was successfully changed +Failure - keyframe is locked, thus cannot be changed or failed to make tangent FIXED +InvalidObject - the keyframe was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_location(self: alias_api.AlKeyframe, new_time: float, recompute: int = True) int
+

This method sets the time of the keyframe to be the value +given by newTime.

+

If this keyframe is part of a parameter curve action, the list +of keyframes may be reordered to reflect the new position of the keyframe. +If the given newTime has the same value as the time of an existing +keyframe, then this keyframe will not be moved.

+
+
Parameters
+
    +
  • new_time (float) – the new value for the time of the keyframe

  • +
  • recompute (bool) – whether or not to remcompute tangents now

  • +
+
+
Returns
+

The status code result of the operation: +Success - keyframe’s time was successfully changed +Failure - keyframe is locked, thus cannot be changed +InvalidObject - the keyframe was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_lock(self: alias_api.AlKeyframe, flag: int) int
+

This method sets the lock flag of a keyframe. If the keyframe is +locked, its time, value and tangents will not be modifiable.

+
+
Parameters
+

flag (bool) – TRUE (if the keyframe should be locked) or FALSE (if not)

+
+
Returns
+

The status code result of the operation: +Success - normal completion. +InvalidObject - object is invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_out_tangent(self: alias_api.AlKeyframe, arg0: float) int
+

This method sets the out-tangent of the keyframe to the given +value. The tangent value must be in the range -90.0 < outTangent < 90.0 +If the given tangent value is outside this range, it is clamped to +within this range.

+

This method requires the AlKeyframe to have been attached to +an AlParamAction, otherwise an assertion will fail.

+
+
Parameters
+

out_tangent (float) – the angle in degrees to which the keyframe’s out +tangent should be set.

+
+
Returns
+

The status code result of the operation: +Success - keyframe’s outTangent was successfully changed +Failure - keyframe is locked, thus cannot be changed or failed to make tangent FIXED +InvalidObject - the keyframe was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_tangent_types(self: alias_api.AlKeyframe, in_tangent_type: alias_api.AlTangentType, out_tangent_type: alias_api.AlTangentType, recompute: int = True) int
+

This method sets the in and out tangents of this keyframe to a +specific type. Use kTangentUnchanged if you want either to remain +unchanged.

+

This method requires the AlKeyframe to have been attached to +an AlParamAction, otherwise an assertion will fail.

+

Note that this function sets the tangents on a segment. So +depending on your choice of tangents, the tangents of the +keyframe’s neighbors may be changed.

+
+
Parameters
+
    +
  • in_tangent_type (AlTangentType) – the type of the in tangent

  • +
  • out_tangent_type (AlTangentType) – the type of the out tangent

  • +
  • recompute (bool) – recompute the spline

  • +
+
+
Returns
+

The status code result of the operation: +Success - keyframe’s tangents were successfully changed +Failure - keyframe is locked, thus cannot be changed +InvalidObject - the keyframe was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_value(self: alias_api.AlKeyframe, new_val: float, recompute: int = True) int
+

This method sets the value of the keyframe to be the value +given by newVal.

+
+
Parameters
+
    +
  • new_val (float) – the new value for the value of the keyframe

  • +
  • recompute (bool) – whether to recompute the tangents or not.

  • +
+
+
Returns
+

The status code result of the operation: +Success - keyframe’s value was successfully changed +Failure - keyframe is locked, thus cannot be changed +InvalidObject - the keyframe was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+tangent_types(self: alias_api.AlKeyframe) Tuple[int, alias_api.AlTangentType, alias_api.AlTangentType]
+

This method gets the in and out tangent types of this keyframe. +If this method fails to determine the type of either the in or +out tangent, sFailure is returned, and either or both of the +arguments are set to kTangentUnchanged.

+
+
Returns
+

A tuple containing: +(1) The status code result of the operation:

+
+

Success - successfully determined keyframe’s tangents. +Failure - failed to determine one of the keyframe’s tangents. +InvalidObject - the keyframe was invalid

+
+
    +
  1. The in tangent type of the keyframe

  2. +
  3. The out tangent type of the keyframe

  4. +
+

+
+
Return type
+

tuple<AlStatusCode, AlTangentType, AlTangentType>

+
+
+
+ +
+
+type(self: alias_api.AlKeyframe) alias_api.AlObjectType
+

Returns the class identifier ‘KeyframeType’.

+
+ +
+
+value(self: alias_api.AlKeyframe) float
+

This method returns the value of this keyframe, or 0.0 if the keyframe +is not valid.

+
+ +
+ +
+
+class alias_api.AlLayer
+

Interface to Alias layer objects.

+

Layers provide a way of organizing the models to improve the workflow. +The layers have attributes such as visibility, pickability etc, which +apply to all the dag nodes which refer to them. The AlDagNode has +methods to get AlLayer and set to a new AlLayer.

+

Each AlLayer has a unique identifying number and a name. By default, +the layer gets a unique name based on its number, however, the user +is free to change it any name. The user given layer names do not have +to be unique.

+

Default Layer:

+

There is always a default layer in the AlUniverse with a number 0. +The attributes of this default layer can never be changed. Any object +of a class derived from AlDagNode class can be assigned to an AlLayer.

+

Creation Layer:

+

Any new AlDagNode is automatically assigned to the layer +which is made a creation layer. Any existing layer can be made a creation layer, +including the default layer, to put the new nodes in that layer +automatically. When a layer is made a creation layer, its attributes such +as invisibility, temporarily become ineffective and it gets the +same attributes as the default layer. These attributes become effective +again, as soon as some another layer is made a creation layer.

+

An AlDagNode can be transferred from one layer to another. An AlDagNode +can exist on only one layer at a time. When an AlDagNode is assigned to a +non-default layer, all its children are automatically assigned to that layer +and all the parents are automatically assigned to the default layer. In addition, +all the instances of the AlDagNode are also assigned to the same layer. However, +the siblings of that AlDagNode remain uneffected.

+

All the attributes in an AlLayer can be obtained and set with the +methods in this class. By default, all the layers have a corresponding menu +in the Alias interface and are visible in the layer bar in the Alias interface. +However, through visible_in_layer_bar() methods, a partial list of layers with +which one chooses to work can be made visible. The change in visibility in the layer +bar does not change the other attributes of the Allayer.

+

All the existing layers in an AlUniverse can be accessed through methods in +AlUniverse. The layer functionality can be temporarily disabled through the static +method set_layers_enabled() in the AlUniverse class. When the layer functionality +is disabled or turned off, all the layers attributes temporarily become similar +to the default layer. However, the layer references of the AlDagNode are not changed.

+

Symmetric layers are also supported in the API. Methods available allow the developer +to turn symmetric layers on, find out if a layer is symmetric, set/query the +origin and normal parameters of the symmetric plane and create the symmetric +geometry. Symmetric layers are specified by a normal and a point(origin). +Note: creation of symmetric geometry is performed by the AlDagNode class.

+

The complete layers interface is available in Open Model as well.

+
+
+assign_child(*args, **kwargs)
+

Overloaded function.

+
    +
  1. assign_child(self: alias_api.AlLayer, child_layer_number: int) -> int

    +
    +

    Assign an Alias layer as child of the current layer.

    +

    If this layer is not a folder layer, the operation will fail to +assign the child layer.

    +
    +
    param child_layer_number
    +

    the ID of the child layer which is to be assigned to the layer

    +
    +
    type child_layer_number
    +

    int

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. assign_child(self: alias_api.AlLayer, child_layer: alias_api.AlLayer) -> int

    +
    +

    Assign an Alias layer as child of the current layer.

    +

    If this layer is not a folder layer, the operation will fail to +assign the child layer.

    +
    +
    param child_layer
    +

    the child layer to assign to the layer

    +
    +
    type child_layer
    +

    AlLayer

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+assign_parent(self: alias_api.AlLayer, layer_id: int) int
+

Assign an Alias layer as the parent of the current layer.

+
+
Parameters
+

layer_id (int) – the parent layer id to assign to the layer

+
+
Returns
+

The status code result of the operation.

+
+
Rype
+

int(AlStatusCode)

+
+
+
+ +
+
+assign_selection(self: alias_api.AlLayer, assign_top_nodes: bool = False) int
+

Assign the current selection to the Alias layer.

+
+
Parameters
+

assign_top_nodes (bool) – True will get the top-level parent node of each +of the selected nodes and set the layer of the top-level node to +cascade down to all child nodes.

+
+
Returns
+

The status code result of the operation.

+
+
Rype
+

int(AlStatusCode)

+
+
+
+ +
+
+assign_sibling_on_left(self: alias_api.AlLayer, layer_id: int) int
+

Assign an Alias layer as the sibling on the left of the current layer.

+
+
Parameters
+

layer_id (int) – the sibling layer id to assign to the layer

+
+
Returns
+

The status code result of the operation.

+
+
Rype
+

int(AlStatusCode)

+
+
+
+ +
+
+assign_sibling_on_right(self: alias_api.AlLayer, layer_id: int) int
+

Assign an Alias layer as the sibling on the right of the current layer.

+
+
Parameters
+

layer_id (int) – the sibling layer id to assign to the layer

+
+
Returns
+

The status code result of the operation.

+
+
Rype
+

int(AlStatusCode)

+
+
+
+ +
+
+child_layer(self: alias_api.AlLayer) alias_api.AlLayer
+

Return the child layer below this layer in the graph of Alias AlLayer objects.

+
+ +
+
+copy_wrapper(self: alias_api.AlLayer) alias_api.AlObject
+

Return an exact duplicate of this AlLayer wrapper.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlLayer, name: str) -> int

    +
    +

    Create a new layer.

    +
    +
    param name
    +

    The name of the new layer.

    +
    +
    type name
    +

    str

    +
    +
    return
    +

    The status code result +Success - the layer was created +Failure - the layer was not created because either the maximum number of layers were already created

    +
    +

    or the layer functionality is turned off.

    +
    +

    AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlLayer, number: int) -> int

    +
    +

    Create a new layer with the given number.

    +
    +
    param number
    +

    The number of the new layer.

    +
    +
    type number
    +

    int

    +
    +
    return
    +

    A tuple (status, number) where +status - the status code result of the operation

    +
    +

    Success - the layer was created +Failure - the layer was not created because either the maximum number of layers were already created

    +
    +

    or the layer functionality is turned off.

    +
    +

    AlreadyCreated - object has already been created

    +
    +

    number - the Id of the created layer

    +
    +
    rtype
    +

    tuple

    +
    +
    +
    +
  4. +
+
+ +
+
+create_folder(self: alias_api.AlLayer, name: str) int
+

Create a new layer folder.

+
+
Parameters
+

name (str) – The name of the new layer folder.

+
+
Returns
+

The status code result +Success - the layer folder was created +Failure - the layer folder was not created because either the maximum number of layers were already created

+
+

or the layer functionality is turned off.

+
+

AlreadyCreated - object has already been created

+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+delete_object(self: alias_api.AlLayer) int
+

Delete the layer in the Alias Universe.

+
+ +
+
+property draw_instances
+

Get or set the draw instances flag on the layer.

+
+ +
+
+export_content_to_file(self: alias_api.AlLayer, path: str) int
+

Export the content of the layer to the given file path.

+
+ +
+
+get_assigned_nodes(self: alias_api.AlLayer) List[AlDagNode]
+

Return the list of AlDagNodes that are assigned to this AlLayer.

+
+
Returns
+

The list of dag nodes

+
+
Return type
+

list<AlDagNode>

+
+
+
+ +
+
+property invisible
+

Get or set the AlLayer visibility.

+
+ +
+
+is_assigned(self: alias_api.AlLayer, node: AlDagNode) bool
+

Return True if the node is assigned to the layer, else False.

+
+ +
+
+is_empty(self: alias_api.AlLayer) bool
+

Return True if the Alias layer doesn’t contain any geometry, False otherwise.

+
+ +
+
+is_folder(self: alias_api.AlLayer) int
+

Return True if the AlLayer is a layer folder, False otherwise.

+
+ +
+
+is_picked(self: alias_api.AlLayer) int
+

Return True if the layer is picked. False is returned if the layer is not picked or if the object is invalid.

+
+ +
+
+property name
+

Get or set the AlLayer name.

+
+ +
+
+next_layer(self: alias_api.AlLayer) alias_api.AlLayer
+

Return the layer following this layer in the graph of Alias AlLayer objects.

+
+ +
+
+property number
+

Get the AlLayer number.

+
+ +
+
+parent_layer(self: alias_api.AlLayer) alias_api.AlLayer
+

Return the parent layer above this layer in the graph of Alias AlLayer objects, None if there is no parent layer.

+
+ +
+
+pick(self: alias_api.AlLayer) int
+

Picks the layer.

+
+
Returns
+

The status code result +Success - the pick was successfully +Failure - the pick operation failed because layers have been disabled +InvalidObject - the object is not valid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+pick_nodes(self: alias_api.AlLayer, leaf_nodes_only: bool = True) int
+
+
)

Pick all the nodes assigned to the Alias layer.

+
+
param leaf_nodes_only
+

True will pick only the leaf nodes, +False will pick the top-most level nodes assigned to the +layer (not including their children).

+
+
type leaf_nodes_only
+

bool

+
+
return
+

The status code result of the operation.

+
+
rtype
+

int(AlStatusCode)

+
+
+
+
+
+ +
+
+prev_layer(self: alias_api.AlLayer) alias_api.AlLayer
+

Return the layer previous to this layer in the graph of Alias AlLayer objects.

+
+ +
+
+set_symmetric_normal(self: alias_api.AlLayer, x: float, y: float, z: float) int
+

Sets the normal of the symmetric plane.

+
+
Parameters
+
    +
  • x (float) – the x coordinate of the normal of the symmetric plane

  • +
  • y (float) – the y coordinate of the normal of the symmetric plane

  • +
  • z (float) – the z coordinate of the normal of the symmetric plane

  • +
+
+
Returns
+

the status code result of the operation +Success - the method succeeded +Failure - the method failed +InvalidObject - the layer is invalid or is not symmetric

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_symmetric_origin(self: alias_api.AlLayer, x: float, y: float, z: float) int
+

Set the location of the origin of the symmetric layer.

+
+
Parameters
+
    +
  • x (float) – the x coordinate of the symmetric layer’s origin

  • +
  • y (float) – the y coordinate of the symmetric layer’s origin

  • +
  • z (float) – the z coordinate of the symmetric layer’s origin

  • +
+
+
Returns
+

the status code result of the operation +Success - the method succeeded +Failure - the method failed +InvalidObject - the layer is invalid or is not symmetric

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+property symmetric
+

Get or set the symmetric flag on the layer.

+
+ +
+
+symmetric_normal(self: alias_api.AlLayer) Tuple[int, float, float, float]
+

Return the symmetric normal of the layer.

+
+
Returns
+

A tuple (status, x, y, z) where +status - the status code result of the operation

+
+

Success - the method succeeded +Failure - the method failed +InvalidObject - the layer is invalid or is not symmetric

+
+

x - the x coordinate of the normal +y - the y coordinate of the normal +z - the z coordinate of the normal

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+symmetric_origin(self: alias_api.AlLayer) Tuple[int, float, float, float]
+

Return the location of the origin of the symmetric layer.

+
+
Returns
+

A tuple (status, x, y, z) where +status - the status code result of the operation

+
+

Success - the method succeeded +Failure - the method failed +InvalidObject - the layer is invalid or is not symmetric

+
+

x - the x coordinate of the layer’s origin +y - the y coordinate of the layer’s origin +z - the z coordinate of the layer’s origin

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+type(self: alias_api.AlLayer) alias_api.AlObjectType
+

Return the AlLayer type identifier.

+
+ +
+
+unpick(self: alias_api.AlLayer) int
+

Unpicks the layer.

+
+
Returns
+

The status code result +Success - the unpick was successfully +Failure - the unpick operation failed because layers have been disabled +InvalidObject - the object is not valid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+ +
+
+class alias_api.AlLayeredShader
+

Base object for representing shader data

+

This class encapsulates the basic functionality for checking and +setting the name of a shader as well as accessing the textures that +a particular shader refers to, and the animation on the shader. +Shader objects are accessible through both the AlUniverse class and +the objects that reference them (AlSurface and AlFace classes).

+

A layered shader object may reference shaders. The first_shader() and +next_shader() methods are used to access these textures.

+

first_shader() returns the first shader that the shader object +references. next_shader() moves from a given referenced shader +to the next shader in order, as related to the layered shader object.

+
+
+add_shader(self: alias_api.AlLayeredShader, shader: alias_api.AlShader) bool
+

Add a shader to the layer shader.

+
+ +
+
+copy_wrapper(self: alias_api.AlLayeredShader) alias_api.AlObject
+

Return an exact duplicate of this AlLayeredShader wrapper.

+
+ +
+
+create(self: alias_api.AlLayeredShader) int
+

Initialize and allocate space for the AlLayeredShader and add it to the global list of shaders in the Alias Universe.

+
+ +
+
+delete_object(self: alias_api.AlLayeredShader) int
+

Delete the Alias shader object and return the status code of the delete operation.

+
+ +
+
+get_first_shader(self: alias_api.AlLayeredShader) alias_api.AlShader
+

Returns the first shader.

+
+ +
+
+get_next_shader(self: alias_api.AlLayeredShader, cur_shader: alias_api.AlShader) alias_api.AlShader
+

get the next shader.

+
+ +
+
+is_used(self: alias_api.AlLayeredShader) int
+

Returns True if the AlLayeredShader object is assigned to a gemoetry node, else False.

+
+ +
+
+property name
+

Get or set the AlLayeredShader name.

+
+ +
+
+remove_shader(self: alias_api.AlLayeredShader, shader: alias_api.AlShader) bool
+

Remove a shader to the layer shader.

+
+ +
+
+type(self: alias_api.AlLayeredShader) alias_api.AlObjectType
+

Return the AlLayeredShader type identifier.

+
+ +
+ +
+
+class alias_api.AlLight
+

Encapsulates methods common to all lights.

+

This virtual class contains methods which are common to +all types of lights. This includes color, linkage to +objects and exclusivity.

+

To create a light, the user must instantiate and call +the create method of a specific type of light (eg. a +point light or a spot light). When a light is created, +three light nodes are created, grouped under a group node, +which is inserted into the universe’s dag. These light +nodes represent the position, “look at” and “up” points +of the light.

+

Even though three light nodes are created for all lights, +only the spot light class uses the information in the +“look at” and “up” nodes. All other classes either +don’t have a direction or store direction in a different +manner. The direction vector of a spot light is the +vector between its position point and its “look at” +point. The “up” direction vector of a spot light is +the vector between its position point and its “up” point.

+

There are two ways to delete a light object. When an +AlLight object is deleted, its three light nodes are +deleted. Alternatively, when a light node is deleted, its +associated light (and other light nodes) are deleted. +The group node that originally grouped the position, “look at” +and “up” nodes is not deleted.

+

The light classes are derived as follows, where a class +inherits the functionality defined in the class above it. +The user can only instantiate ambient, point, direction, +spot, linear and area lights.

+
+
+
+
+
Light
+

+
+
+
+
+
+ +
+
+
+
Ambient Non-ambient
+
+
+

+
+
+
+ +
+
+
+
Point Directional
+
+
+

+
+
+
+
| |
+
+
+

Spot Linear Area

+
+
+
+
+
+

For directional lights, the light positions are (in Z-up coordinate +system) position at (0,0,0), view at (0,0,-1), and up at (0,1,-1). +For linear lights, the axis by default starts at the position +point and extends (2,0,0). For area lights, the short axis starts +at the position point and extends (0,1,0); the long axis starts +at the position point and extends (2,0,0).

+

All lights have an “exclusive” flag. If this flag is TRUE, +then the light will only illuminate objects to which it is +linked. If the flag is False, the light will illuminate +objects that have no light links. The default for new +lights is False.

+
+
+delete_object(self: alias_api.AlLight) int
+

Delete the AlLight from the Alias Universe and return the status of the performed operation.

+
+ +
+
+first_linked_object(self: alias_api.AlLight) alias_api.AlObject
+

Return the first object that is linked to this light.

+

If there are no objects linked to this light, then Non is returned. Only objects with +3D geometry can be linked to a light. Cameras, lights, curves and CVs cannot be linked +to a light. Surfaces and faces can be linked to a light.

+
+
Returns
+

The first linked object.

+
+
Return type
+

AlObject

+
+
+
+ +
+
+has_linked_objects(self: alias_api.AlLight) int
+

Return True if this light has any objects linked to it, else False.

+
+ +
+
+light_node(self: alias_api.AlLight) AlLightNode
+

Return the dag node that represents the light’s position.

+
+ +
+
+look_at_node(self: alias_api.AlLight) AlLightNode
+

Return the ‘look at’ node attached to this light.

+
+ +
+
+property name
+

Get or set the AlLight name.

+
+ +
+
+next_linked_object(self: alias_api.AlLight, obj: alias_api.AlObject) alias_api.AlObject
+

Return the object following the given object that is linked to this linked.

+

None is returned if there is no following object or if the given object was not +found in the light list. Only objects with 3D geometry can be linked to a light. +Cameras, lights, curves and CVs cannot be linked to a light. Surfaces and faces +can be linked to a light.

+
+
Parameters
+

obj – the object whose following linked object is returned.

+
+
Returns
+

The next linked object t othe given object.

+
+
Return type
+

AlObject

+
+
+
+ +
+
+type(self: alias_api.AlLight) alias_api.AlObjectType
+

Return the AlLight type identifier.

+
+ +
+
+up_node(self: alias_api.AlLight) AlLightNode
+

Return the ‘up’ node attached to this light.

+
+ +
+ +
+
+class alias_api.AlLightNode
+

The dag node class for lights.

+

This class is a dag node class used specifically for lights. +Each AlLight object has three light nodes for position, ‘look at’ +and ‘up’ points. (For more information on how AlLight’s +and AlLightNode’s work together, see the Class Description for +the AlLight object.)

+

To create a light node, the user must create a specific type +of light, which automatically creates the necessary light +nodes. These light nodes are grouped and inserted into +the universe’s dag. The user cannot directly instantiate +a light node.

+

To figure out whether or not a light node represents a position, +a ‘look at’ or an ‘up’ point, the user can use:

+
+
    +
  1. the is_position_node(), is_look_at_node(), is_up_node() methods, or

  2. +
  3. the type() method of the attached AlLight object.

  4. +
+
+

A light node can be deleted in two ways. When a light node +is deleted, its associated light (and other light nodes) +are deleted. Alternatively, when a light is deleted, its light +nodes are also deleted.

+
+
+copy_wrapper(self: alias_api.AlLightNode) alias_api.AlObject
+

Return an exact duplicate of this AlLightNode wrapper.

+
+ +
+
+delete_object(self: alias_api.AlLightNode) int
+

Delete the AlLightNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+is_instanceable(self: alias_api.AlLightNode) int
+

Return False. A light node can not be instanced.

+
+ +
+
+is_look_at_node(self: alias_api.AlLightNode) int
+

Return True if this node is a ‘look at’ node.

+
+ +
+
+is_position_node(self: alias_api.AlLightNode) int
+

Return True if this node is a ‘position’ node.

+
+ +
+
+is_up_node(self: alias_api.AlLightNode) int
+

Return True if this node is a ‘up’ node.

+
+ +
+
+light(*args, **kwargs)
+

Overloaded function.

+
    +
  1. light(self: alias_api.AlLightNode) -> alias_api.AlLight

  2. +
+

Return the attached light object. If the light does not exist or is not the right type, None is returned.

+
    +
  1. light(self: alias_api.AlLightNode, tm: alias_api.AlTM) -> alias_api.AlLight

    +
    +

    Return the attached light object.

    +

    If the light does not exist or is not the right type, None is returned. The AlTM ‘tm’ will be +updated with the light node’s transformation matrix, if a light exists.

    +
    +
    param tm
    +

    The transform matrix to set the light node’s TM to.

    +
    +
    type tm
    +

    AlTM

    +
    +
    return
    +

    The attached light object.

    +
    +
    rtype
    +

    AlLight

    +
    +
    +
    +
  2. +
+
+ +
+
+type(self: alias_api.AlLightNode) alias_api.AlObjectType
+

Return the AlLightNode type identifier.

+
+ +
+ +
+
+class alias_api.AlLineAttributes
+

Interface to Alias line attributes.

+

AlLineAttributes is a class derived from the AlAttributes class. +This class allows access to the attributes for a line.

+

The attributes which define a line are just its start point, and +its end point. Coordinates are given in object space, and not +world space.

+
+
+copy_wrapper(self: alias_api.AlLineAttributes) alias_api.AlObject
+

Return an exact duplicate of this AlLineAttributes wrapper.

+
+ +
+
+end_point(self: alias_api.AlLineAttributes) Tuple[int, float, float, float]
+

Returns the end point for the line.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid. +Failure - an error occured

+
+
    +
  1. the end point x coordinate

  2. +
  3. the end point y coordinate

  4. +
  5. the end point z coordinate

  6. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+set_end_point(self: alias_api.AlLineAttributes, x: float, y: float, z: float) int
+

Sets the end point for the line.

+
+
Parameters
+
    +
  • x (float) – end point x coordinate

  • +
  • y (float) – end point y coordinate

  • +
  • z (float) – end point z coordinate

  • +
+
+
Returns
+

the status code result of the operation: +Success - Setting the end point succeeded. +InvalidObject - the attribute was invalid +Failure - Setting the end point failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set_start_point(self: alias_api.AlLineAttributes, x: float, y: float, z: float) int
+

Sets the start point for the line.

+
+
Parameters
+
    +
  • x (float) – start point x coordinate

  • +
  • y (float) – start point y coordinate

  • +
  • z (float) – start point z coordinate

  • +
+
+
Returns
+

the status code result of the operation: +Success - Setting the start point succeeded. +InvalidObject - the attribute was not valid +Failure - Setting the start point failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+start_point(self: alias_api.AlLineAttributes) Tuple[int, float, float, float]
+

Returns the start point for the line.

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the start point was successfully returned. +InvalidObject - the attribute was invalid. +Failure - an error occured.

+
+
    +
  1. the start point x coordinate

  2. +
  3. the start point y coordinate

  4. +
  5. the start point z coordinate

  6. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+type(self: alias_api.AlLineAttributes) alias_api.AlObjectType
+

Return the AlLineAttributes type identifier.

+
+ +
+ +
+
+class alias_api.AlLinkItem
+

Base class for objects contained in an AlList.

+

This is an abstract base class which classes will derive from +so that the objects can be contained in AlList objects.

+
+ +
+
+class alias_api.AlList
+

Simple List class for AlLinkItem objects.

+

This simple container class provides the ability to create and +access a list of objects derived from the AlLinkItem class.

+
+
+append(self: alias_api.AlList, item: alias_api.AlLinkItem) None
+

Adds an AlLinkItem object to the end of the list.

+
+
Parameters
+

item (AlLinkItem) – The object to be appended.

+
+
+
+ +
+
+clear(self: alias_api.AlList) None
+

Clears the list as an empty list but does not free any of its +members.

+
+ +
+
+first(self: alias_api.AlList) alias_api.AlLinkItem
+

Return the first element of the list.

+
+ +
+
+last(self: alias_api.AlList) alias_api.AlLinkItem
+

Return the last element of the list.

+
+ +
+
+remove(self: alias_api.AlList, item: alias_api.AlLinkItem) int
+

Removes an AlLinkItem object from the AlList. Returns +1 if the item was removed, 0 if it was not (because +it did not belong in this list).

+
+
Parameters
+

item (AlLinkItem) – The object to be appended.

+
+
Returns
+

1 if the item was removed, 0 otherwise.

+
+
Return type
+

int

+
+
+
+ +
+ +
+
+class alias_api.AlLocator
+

Contains functionality common to all the Alias locators

+

This virtual class encapsulates methods common to all the Alias locators, +such as annotationLocator, distanceLocator, angleLocator, radialLocator, +deviationLocator and minmaxLocator.

+

This class contains methods for picking, deleting, and naming locators. +In addition, methods are available for working with layers and for changing +invisibility and templated modes.

+

To create a locator, the user must instantiate and call the create method +of a specific type of locator (eg. an angle locator ).

+

The annotation, distance and angle locators depend on one or more construction entities +point types, such as a curve point. If a construction point is deleted, their +dependent annotation, distance and angle locators are automatically deleted. +Similarly, the radial, deviation and minmax locators are dependent on other +objects. If those objects are deleted, the dependent radial, deviation, +and minmax locators are also deleted.

+

The locator classes are derived as follows, where a class inherits the +functionality defined in the class above it. The user can not instantiate +the locator (AlLocator) class.

+
+
+
Locator
+

+
+
+
+
+
+
| | | | |
+
+

annotation distance angle radial deviation minmax

+
+
+copy_wrapper(self: alias_api.AlLocator) alias_api.AlObject
+

Return an exact duplicate of this AlLocator wrapper.

+
+ +
+
+delete_object(self: alias_api.AlLocator) int
+

Delete the AlLocator from the Alias Universe and return the status of the performed operation.

+
+ +
+
+property invisible
+

Get or set the AlLocator invisibility property.

+
+ +
+
+is_picked(self: alias_api.AlLocator) int
+

On successfully checking the locator, return 1 if the AlLocator is picked, else return 0. On failure to check, return -1.

+
+ +
+
+property layer
+

Get or set the AlLocator layer object property.

+
+ +
+
+property name
+

Get or set the AlLocator name property.

+
+ +
+
+pick(self: alias_api.AlLocator) int
+

Pick the locator. This function has not effect if the locator is already picked.

+
+ +
+
+templated(self: alias_api.AlLocator) int
+

On successfully checking the locator, return 1 if the AlLocator depends on anoather object which is templated, else return 0. On failure to check, return -1.

+
+ +
+
+type(self: alias_api.AlLocator) alias_api.AlObjectType
+

Return the AlLocator type identifier.

+
+ +
+
+unpick(self: alias_api.AlLocator) int
+

Unpick the locator. This function has not effect if the locator is already picked.

+
+ +
+ +
+
+class alias_api.AlMesh
+

Interface to Alias meshes.

+

AlMesh is the interface to meshes and their data in Alias. +This class lets a developer create and manipulate mesh +objects. Data access methods to all properties are provided. +The following properties are used throughout the mesh class.

+
+
vertices - Vertices are passed by this class using

an array of floating point values. A +vertex consists of three values; x,y,z +respectively. Refer to the definition of +triangles for a description of the +relationship between vertices and triangles. +numVertices - The number of vertices is equivalent +to the number of x,y,z triplets stored +in the vertices array. The total number +of floats in the vertices array is +equivalent to three times the number of +vertices.

+
+
triangles - Triangles are passed by this class using

an array of integer values. A triangle +consists of three integer indices. These +indices reference a vertex in the vertices +array such that vertices[3*index] returns +the x coordinate of the vertex. Similarly, +vertices[3*index+1] and vertices[3*index+2] +return the y and z coordinate respectively. +Indices are to be specified in counter +clockwise order relative to the front of +their face.

+
+
num_triangles - The number of triangles is equivalent to

the number of integer triplets stored in the +triangles array. The total number of integers +in the triangles array is equivalent to three +times the number of triangles.

+
+
normals - Normals are passed by this class using

an array of floating point values. They +consist of three values; x,y,z respectively. +Normals are per vertex. They are referenced +by triangles in the same manner that vertices +are referenced.

+
+
uvs - UVs are passed by this class using an array

of float values. They consist of two floating +point values; u,v respectively. UVs are per +vertex. They are referenced by triangles in +the same manner that vertices are referenced.

+
+
+
+
+assign_layered_shader(self: alias_api.AlMesh, shader: AlLayeredShader) int
+

Assigns shader to the mesh.

+
+
Parameters
+

shader (AlShader) – the shader to assign

+
+
Returns
+

The status code result +Success - The shader was successfully assigned to the mesh. +InvalidArgument - shader is invalid. +InvalidObject - The mesh was not created properly. +Failure - Unable to process request.

+
+
+
+ +
+
+assign_shader(self: alias_api.AlMesh, shader: AlShader) int
+

Assigns shader to the mesh.

+
+
Parameters
+

shader (AlShader) – the shader to assign

+
+
Returns
+

The status code result +Success - The shader was successfully assigned to the mesh. +InvalidArgument - shader is invalid. +InvalidObject - The mesh was not created properly. +Failure - Unable to process request.

+
+
+
+ +
+
+assign_switch_shader(self: alias_api.AlMesh, shader: AlSwitchShader) int
+

Assigns shader to the mesh.

+
+
Parameters
+

shader (AlShader) – the shader to assign

+
+
Returns
+

The status code result +Success - The shader was successfully assigned to the mesh. +InvalidArgument - shader is invalid. +InvalidObject - The mesh was not created properly. +Failure - Unable to process request.

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlMesh) alias_api.AlObject
+

Return an exact duplicate of this AlMesh wrapper.

+
+ +
+
+create(self: alias_api.AlMesh, vertices: List[float], triangles: List[int], normals: List[float], uvs: List[float]) int
+

Creates a mesh object with the supplied data. The is expected to allocate memory and seed data for +the various arrays. Passing a uv array is optional. Passing a normal array is optional. Note that normals are recalculated +as the mesh is edited.

+
+
:return the status code

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+
+
+
+ +
+
+delete_object(self: alias_api.AlMesh) int
+

Delete the AlMesh from the Alias Universe and return the status of the performed operation.

+
+ +
+
+first_shader(self: alias_api.AlMesh) AlShader
+

Return the first shader that this mesh object references. The function will return 0 if there are no shaders or the mesh was not created properly.

+
+ +
+
+get_layered_shader(self: alias_api.AlMesh) AlLayeredShader
+

Return the layered shader that this mesh object references. The function will return 0 if there are no shaders or the mesh was not created properly.

+
+ +
+
+get_switch_shader(self: alias_api.AlMesh) AlSwitchShader
+

Return the switch shader that this mesh object references. The function will return 0 if there are no shaders or the mesh was not created properly.

+
+ +
+
+layer_shader(self: alias_api.AlMesh, shader: AlShader) int
+

Layers the shader on the mesh.

+
+
Returns
+

The status code result +Success - the shader was successfully layered on the mesh. +InvalidArgument - shader is invalid. +InvalidObject - The mesh was not created properly. +Failure - Unable to process request.

+
+
+
+ +
+
+mesh_node(self: alias_api.AlMesh) AlMeshNode
+

Return the AlMeshNode for this mesh. Return None if there is not an attached polyset node.

+
+ +
+
+property name
+

Get or set the AlMesh name.

+
+ +
+
+next_shader(self: alias_api.AlMesh, shader: AlShader) AlShader
+

Return the shader after the one specified by shader.

+
+
The function will return 0 if:
    +
  • The end of the shading list has been reached.

  • +
  • The argument, shader, is 0.

  • +
  • the mesh was not created properly.

  • +
  • There are no shaders.

  • +
+
+
+
+
Parameters
+

shader (AlShader) – the shader to get the next one from

+
+
Returns
+

The next shader, or 0 if it could not find a next shader.

+
+
Return type
+

AlShader | int

+
+
+
+ +
+
+normals(self: alias_api.AlMesh) List[float]
+

Returns a list of the mesh’s normal data.

+
+ +
+
+number_of_triangles(self: alias_api.AlMesh) int
+

Return the number of triangles currently stored in the mesh. The function will return -1 if the mesh was not created properly.

+
+ +
+
+number_of_vertices(self: alias_api.AlMesh) int
+

Return the number of vertices currently stored in the mesh. The function will return -1 if the mesh was not created properly.

+
+ +
+
+triangles(self: alias_api.AlMesh) List[int]
+

Returns a list of the mesh’s triangle data.

+
+ +
+
+type(self: alias_api.AlMesh) alias_api.AlObjectType
+

Return the AlMesh type identifier.

+
+ +
+
+uvs(self: alias_api.AlMesh) List[float]
+

Returns a list of the mesh’s uv data.

+
+ +
+
+vertices(self: alias_api.AlMesh) List[float]
+

Returns a list of the mesh’s vertex data.

+
+ +
+ +
+
+class alias_api.AlMeshNode
+

A dag node that refers to a mesh’s geometry.

+

AlCurveNode is the class used to access and manipulate meshes within +the dag. This class behaves like other dag nodes (see AlDagNode for +a description of the usage and purpose of dag nodes). Users access +the geometry of the curve via the ‘mesh()’ method which returns a +pointer to an AlMesh object.

+
+
+copy_wrapper(self: alias_api.AlMeshNode) alias_api.AlObject
+

Return an exact duplicate of this AlMeshNode wrapper.

+
+ +
+
+mesh(self: alias_api.AlMeshNode) alias_api.AlMesh
+

Return a pointer object ot the mesh attached to the node.

+
+ +
+
+type(self: alias_api.AlMeshNode) alias_api.AlObjectType
+

Return the AlMeshNode type identifier.

+
+ +
+ +
+
+class alias_api.AlMessageType
+

The type of message

+

Members:

+
+

DagNodeModifiedGeometry

+

DagNodeColourModified

+

DagNodeModified

+

TrimSurface

+

Invalid

+

FirstMessage

+

DagNodeDeleted

+

DagNodeInstanced

+

DagNodeModifiedShaderAssignment

+

DeleteAll

+

DagNodeModifiedConstraint

+

HierarchyModified

+

StageActive

+

DagNameModified

+

JointModified

+

Refresh

+

DagNodePreReplaceGeometry

+

DagNodeReplaceGeometry

+

DagNodeApplyTransformation

+

DagNodeVisible

+

DagDispModified

+

ReferenceFileDeleted

+

CosDeleted

+

CosModified

+

CosVisible

+

LayerSymmetryModified

+

PostRetrieve

+

AttributesDelete

+

UniverseDeleted

+

PreUpdate

+

PostUpdate

+

PreRetrieve

+

Quit

+

StageMerged

+

AnimPlayback

+

ListModifiedNodes

+

PreRefresh

+

TextureDeleted

+

CommandInstall

+

LayerStateModified

+

CommandFree

+

LayerAssign

+

PickListModified

+

UntrimSurface

+

PlotRefresh

+

UniverseCreated

+

StageCreated

+

StageDeleted

+

UniverseMerged

+

CloudDeleted

+

PreStore

+

UniverseActive

+

PostStore

+

TextureModified

+

ReferenceFileSetModified

+

ClMemberModified

+

DagInserted

+

ShaderDeleted

+

CameraModified

+

ExprModified

+

LayersEnabled

+

CommandUnInstall

+

ShaderAdded

+

CnetDeleted

+

ShaderModified

+

LayerAdded

+

LightModified

+

TextureAdded

+

DagNodeUndeleted

+

LayerDeleted

+

LayerAttributeChanged

+

ReferenceFileSetDeleted

+

LayerVisibilityModified

+

LayersReordered

+

ReferenceFileModified

+

ReferenceFileAdded

+

ReferenceFileSetAdded

+

ReferenceLayerModified

+

CosCreated

+

LocatorAdded

+

LocatorDeleted

+

LocatorModified

+

LastMessage

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlMinmaxLocator
+

Interface to Alias Min Max locators.

+

A min max locator finds and displays the minimum and maximum distance +between any of the two curves, curves on surface, or surfaces. This +class contains methods to create, query the distance and set the display +attributes in the Alias windows.

+
+
+attached_to(self: alias_api.AlMinmaxLocator) Tuple[int, alias_api.AlObject, alias_api.AlObject]
+

Returns the two objects that are used to create the min/max locator.

+

The objects returned can be curves on surfaces, curve node or +surface nodes.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the attached to objects were found +InvalidObject - the object is not valid +Failure - the method failed

+
+
    +
  1. the first object

  2. +
  3. the second object

  4. +
+

+
+
+
+ +
+
+comb_density(self: alias_api.AlMinmaxLocator) Tuple[int, float]
+

Finds the density of the comb display for Minmax locator in the Alias +modeling windows.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the display mode was found +InvalidObject - the object is not valid

+
+
    +
  1. the comb density

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+comb_display(self: alias_api.AlMinmaxLocator) Tuple[int, int]
+

Whether the comb of the Minmax locator is displayed in the Alias +modeling windows.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the display mode was found +InvalidObject - the object is not valid

+
+
    +
  1. the display mode

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+comb_scale(self: alias_api.AlMinmaxLocator) Tuple[int, float]
+

Finds the scale of the comb display for Minmax locator in the Alias +modeling windows.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the display mode was found +InvalidObject - the object is not valid

+
+
    +
  1. the comb scale

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+comb_threshold(self: alias_api.AlMinmaxLocator) Tuple[int, float]
+

Finds the threshold of the comb display for Minmax locator in the Alias +modeling windows.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the display mode was found +InvalidObject - the object is not valid

+
+
    +
  1. the comb threshold

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlMinmaxLocator) alias_api.AlObject
+

Return an exact duplicate of this AlMinmaxLocator wrapper.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlCurve, curve2: alias_api.AlCurve) -> int

    +
    +

    Create a Minmax locator between two curves.

    +
    +
    param curve1
    +

    The first curve

    +
    +
    type curve1
    +

    AlCurve

    +
    +
    param curve2
    +

    The second curve

    +
    +
    type curve2
    +

    AlCurve

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlCurve, curve2: alias_api.AlCurveOnSurface) -> int

    +
    +

    Create a Minmax locator between a curve and curve on surface.

    +
    +
    param curve1
    +

    The first curve

    +
    +
    type curve1
    +

    AlCurve

    +
    +
    param curve2
    +

    The second curve on surface

    +
    +
    type curve2
    +

    AlCurveOnSurface

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
  5. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlCurveOnSurface, curve2: alias_api.AlCurveOnSurface) -> int

    +
    +

    Create a Minmax locator between two curves on surface.

    +
    +
    param curve1
    +

    The first curve on surface

    +
    +
    type curve1
    +

    AlCurveOnSurface

    +
    +
    param curve2
    +

    The second curve on surface

    +
    +
    type curve2
    +

    AlCurveOnSurface

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  6. +
  7. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlSurface, curve2: alias_api.AlSurface) -> int

    +
    +

    Create a Minmax locator between two surfaces.

    +
    +
    param curve1
    +

    The first surface

    +
    +
    type curve1
    +

    AlSurface

    +
    +
    param curve2
    +

    The second surface

    +
    +
    type curve2
    +

    AlSurface

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  8. +
  9. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlCurve, curve2: alias_api.AlSurface) -> int

    +
    +

    Create a Minmax locator between a curve and a surface.

    +
    +
    param curve1
    +

    The first curve

    +
    +
    type curve1
    +

    AlCurve

    +
    +
    param curve2
    +

    The second surface

    +
    +
    type curve2
    +

    AlSurface

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  10. +
  11. create(self: alias_api.AlMinmaxLocator, curve1: alias_api.AlCurveOnSurface, curve2: alias_api.AlSurface) -> int

    +
    +

    Create a Minmax locator between a curve on surface and a surface.

    +
    +
    param curve1
    +

    The first curve on surface

    +
    +
    type curve1
    +

    AlCurveOnSurface

    +
    +
    param curve2
    +

    The second surface

    +
    +
    type curve2
    +

    AlSurface

    +
    +
    return
    +

    The status code result of the operation: +Success - the minmax locator was created +Failure - the minmax locator was not created +InvalidArgument - either one or both curves were invalid +AlreadyCreated - object has already been created

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  12. +
+
+ +
+
+left_justify_max_distance(self: alias_api.AlMinmaxLocator) Tuple[int, int]
+

Find whether the text of maximum distance in minmax locator is left justified or +right justified

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the justification was found +InvalidObject - the object is not valid

+
+
    +
  1. the justification

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+left_justify_min_distance(self: alias_api.AlMinmaxLocator) Tuple[int, int]
+

Find whether the text of minimum distance in minmax locator is left justified or +right justified

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the justification was found +InvalidObject - the object is not valid

+
+
    +
  1. the justification

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+maximum_distance(self: alias_api.AlMinmaxLocator) Tuple[int, float]
+

Finds the maximum distance for the Minmax locator

+
+
Parameters
+

dist (float) – The maximum distance

+
+
Returns
+

The status code result of the operation: +Success - the maximum distance was found +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+minimum_distance(self: alias_api.AlMinmaxLocator) Tuple[int, float]
+

Finds the minimum distance for the Minmax locator

+
+
Parameters
+

dist (float) – The minimum distance

+
+
Returns
+

The status code result of the operation: +Success - the minimum distance was found +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_comb_density(self: alias_api.AlMinmaxLocator, density: float) int
+

Set the density of comb in the Alias modeling window +for the Minmax locator

+
+
Parameters
+

density (float) – The density of the comb display.

+
+
Returns
+

The status code result of the operation: +Success - the density was set successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_comb_display(self: alias_api.AlMinmaxLocator, display: int) int
+

Set the display of comb in the Alias modeling window +for the Minmax locator

+
+
Parameters
+

display (bool) – A value of true sets comb display and false +turns the display off.

+
+
Returns
+

The status code result of the operation: +Success - the display mode was set successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_comb_scale(self: alias_api.AlMinmaxLocator, scale: float) int
+

Set the scale of comb in the Alias modeling window +for the Minmax locator

+
+
Parameters
+

scale (float) – The scale of the comb display.

+
+
Returns
+

The status code result of the operation: +Success - the scale was set successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_comb_threshold(self: alias_api.AlMinmaxLocator, threshold: float) int
+

Set the threshold of comb in the Alias modeling window +for the Minmax locator

+
+
Parameters
+

threshold (float) – The threshold of the comb display.

+
+
Returns
+

The status code result of the operation: +Success - the threshold was set successfully +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_left_justify_max_distance(self: alias_api.AlMinmaxLocator, left_justify: int) int
+

Set the justification of the text for the maximum distance +for minmax locator.

+

The text can be right justified or left justified.

+
+
Parameters
+

left_justify (bool) – A value of true makes the text left justified and a value +false makes it right justified.

+
+
Returns
+

The status code result of the operation: +Success - setting was successful +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_left_justify_min_distance(self: alias_api.AlMinmaxLocator, left_justify: int) int
+

Set the justification of the text for the minimum distance +for minmax locator.

+

The text can be right justified or left justified.

+
+
Parameters
+

left_justify (bool) – A value of true makes the text left justified and a value +false makes it right justified.

+
+
Returns
+

The status code result of the operation: +Success - setting was successful +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+type(self: alias_api.AlMinmaxLocator) alias_api.AlObjectType
+

Return the AlMinmaxLocator type identifier.

+
+ +
+ +
+
+class alias_api.AlObject
+

Base class for all Alias Data types.

+

This is an abstract base class which holds a reference to an +anonymous data structure. Derived classes will initialize the +reference to refer to a particular data structure. This class +provides a mechanism for completely hiding the internal data +structures from the user.

+

This class gives some homogeneity between several different +classes by providing methods which derived classes will redefine +so that the name and type of the object can be obtained and so +that object down casting can be done safely.

+

There are a group of functions (the ‘downcasting’ methods )for casting +an AlObject to one of its derived classes. They have the form

+

Al{DerivedObject} *AlObject::as{DerivedObject}Ptr()

+

where {DerivedObject} is the name of the derived class.

+

All these functions return NULL in the base class, and the derived +class of the appropriate type simply returns a pointer to itself. +In this way, safe typecasting can be maintained.

+
+
+as_action_ptr(self: alias_api.AlObject) AlAction
+

Return a non-null pointer to an AlAction if it is safe to downcast the object to it.

+
+ +
+
+as_angle_locator_ptr(self: alias_api.AlObject) AlAngleLocator
+

Return a non-null pointer to an AlAngleLocator if it is safe to downcast the object to it.

+
+ +
+
+as_animatable_ptr(self: alias_api.AlObject) alias_api.AlAnimatable
+

Return a non-null pointer to an AlAnimatable if it is safe to downcast the object to it.

+
+ +
+
+as_annotation_locator_ptr(*args, **kwargs)
+

Overloaded function.

+
    +
  1. as_annotation_locator_ptr(self: alias_api.AlObject) -> AlAnnotationLocator

  2. +
+

Return a non-null pointer to an AlAnnotationLocator if it is safe to downcast the object to it.

+
    +
  1. as_annotation_locator_ptr(self: alias_api.AlObject) -> AlAnnotationLocator

  2. +
+

Return a non-null pointer to an AlAnnotationLocator if it is safe to downcast the obect to it.

+
+ +
+
+as_arc_attributes_ptr(self: alias_api.AlObject) AlArcAttributes
+

Return a non-null pointer to an AlArcAttribute if it is safe to downcast the object to it.

+
+ +
+
+as_attributes_ptr(self: alias_api.AlObject) AlAttributes
+

Return a non-null pointer to an AlAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_camera_node_ptr(*args, **kwargs)
+

Overloaded function.

+
    +
  1. as_camera_node_ptr(self: alias_api.AlObject) -> AlCameraNode

  2. +
+

Return a non-null pointer to an AlCameraNode if it is safe to downcast the object to it.

+
    +
  1. as_camera_node_ptr(self: alias_api.AlObject) -> AlCameraNode

  2. +
+

Return a non-null pointer to an AlCameraNode if it is safe to downcast the obect to it.

+
+ +
+
+as_camera_ptr(self: alias_api.AlObject) AlCamera
+

Return a non-null pointer to an AlCamera if it is safe to downcast the object to it.

+
+ +
+
+as_channel_ptr(self: alias_api.AlObject) AlChannel
+

Return a non-null pointer to an AlChannel if it is safe to downcast the object to it.

+
+ +
+
+as_cloud_ptr(self: alias_api.AlObject) AlCloud
+

Return a non-null pointer to an AlCLoud if it is safe to downcast the object to it.

+
+ +
+
+as_cluster_member_ptr(self: alias_api.AlObject) AlClusterMember
+

Return a non-null pointer to an AlClusterMember if it is safe to downcast the object to it.

+
+ +
+
+as_cluster_node_ptr(self: alias_api.AlObject) AlClusterNode
+

Return a non-null pointer to an AlClusterNode if it is safe to downcast the object to it.

+
+ +
+
+as_cluster_ptr(self: alias_api.AlObject) AlCluster
+

Return a non-null pointer to an AlCluster if it is safe to downcast the object to it.

+
+ +
+
+as_clusterable_ptr(self: alias_api.AlObject) alias_api.AlClusterable
+

Return a non-null pointer to an AlClusterable if it is safe to downcast the object to it.

+
+ +
+
+as_conic_attributes_ptr(self: alias_api.AlObject) AlConicAttributes
+

Return a non-null pointer to an AlConicAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_construction_entity_ptr(self: alias_api.AlObject) AlConstructionEntity
+

Return a non-null pointer to an AlConstructionEntity if it is safe to downcast the object to it.

+
+ +
+
+as_construction_plane_ptr(self: alias_api.AlObject) AlConstructionPlane
+

Return a non-null pointer to an AlConstructionPlane if it is safe to downcast the object to it.

+
+ +
+
+as_curve_attributes_ptr(self: alias_api.AlObject) AlCurveAttributes
+

Return a non-null pointer to an AlCurveAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_curve_cv_ptr(self: alias_api.AlObject) AlCurveCV
+

Return a non-null pointer to an AlCurveCV if it is safe to downcast the object to it.

+
+ +
+
+as_curve_on_surface_point_ptr(self: alias_api.AlObject) AlCurveOnSurfacePoint
+

Return a non-null pointer to an AlCurveOnSurfacePoint if it is safe to downcast the object to it.

+
+ +
+
+as_curve_on_surface_ptr(self: alias_api.AlObject) AlCurveOnSurface
+

Return a non-null pointer to an AlCurveOnSurface if it is safe to downcast the object to it.

+
+ +
+
+as_curve_point_ptr(self: alias_api.AlObject) AlCurvePoint
+

Return a non-null pointer to an AlCurvePoint if it is safe to downcast the object to it.

+
+ +
+
+as_curve_ptr(self: alias_api.AlObject) AlCurve
+

Return a non-null pointer to an AlCurve if it is safe to downcast the object to it.

+
+ +
+
+as_dag_node_ptr(self: alias_api.AlObject) AlDagNode
+

Return a non-null pointer to an AlDagNode if it is safe to downcast the object to it.

+
+ +
+
+as_deviation_locator_ptr(self: alias_api.AlObject) AlDeviationLocator
+

Return a non-null pointer to an AlDeviationLocator if it is safe to downcast the object to it.

+
+ +
+
+as_distance_locator_ptr(self: alias_api.AlObject) AlDistanceLocator
+

Return a non-null pointer to an AlDistanceLocator if it is safe to downcast the object to it.

+
+ +
+
+as_envronment_ptr(self: alias_api.AlObject) AlEnvironment
+

Return a non-null pointer to an AlEnvironment if it is safe to downcast the object to it.

+
+ +
+
+as_face_node_ptr(self: alias_api.AlObject) AlFaceNode
+

Return a non-null pointer to an AlFaceNode if it is safe to downcast the object to it.

+
+ +
+
+as_face_ptr(self: alias_api.AlObject) AlFace
+

Return a non-null pointer to an AlFace if it is safe to downcast the object to it.

+
+ +
+
+as_group_node_ptr(self: alias_api.AlObject) AlGroupNode
+

Return a non-null pointer to an AlGroupNode if it is safe to downcast the object to it.

+
+ +
+
+as_ik_handle_node_ptr(self: alias_api.AlObject) AlIKHandleNode
+

Return a non-null pointer to an AlIKHandleNode if it is safe to downcast the object to it.

+
+ +
+
+as_ik_handle_ptr(self: alias_api.AlObject) AlIKHandle
+

Return a non-null pointer to an AlIKHandle if it is safe to downcast the object to it.

+
+ +
+
+as_keyframe_ptr(self: alias_api.AlObject) AlKeyframe
+

Return a non-null pointer to an AlKeyframe if it is safe to downcast the object to it.

+
+ +
+
+as_layer_ptr(self: alias_api.AlObject) AlLayer
+

Return a non-null pointer to an AlLayer if it is safe to downcast the object to it.

+
+ +
+
+as_layered_shader_ptr(self: alias_api.AlObject) AlLayeredShader
+

Return a non-null pointer to a AlLayeredShader if it is safe to downcast the object to it.

+
+ +
+
+as_light_node_ptr(self: alias_api.AlObject) AlLightNode
+

Return a non-null pointer to an AlLightNode if it is safe to downcast the object to it.

+
+ +
+
+as_light_ptr(self: alias_api.AlObject) AlLight
+

Return a non-null pointer to an AlLight if it is safe to downcast the object to it.

+
+ +
+
+as_line_attributes_ptr(self: alias_api.AlObject) AlLineAttributes
+

Return a non-null pointer to an AlLineAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_locator_ptr(*args, **kwargs)
+

Overloaded function.

+
    +
  1. as_locator_ptr(self: alias_api.AlObject) -> AlLocator

  2. +
+

Return a non-null pointer to an AlLocator if it is safe to downcast the object to it.

+
    +
  1. as_locator_ptr(self: alias_api.AlObject) -> AlLocator

  2. +
+

Return a non-null pointer to an AlLocator if it is safe to downcast the obect to it.

+
+ +
+
+as_mesh_node_ptr(self: alias_api.AlObject) AlMeshNode
+

Return a non-null pointer to an AlMeshNode if it is safe to downcast the object to it.

+
+ +
+
+as_mesh_ptr(self: alias_api.AlObject) AlMesh
+

Return a non-null pointer to an AlMesh if it is safe to downcast the object to it.

+
+ +
+
+as_minmax_locator_ptr(self: alias_api.AlObject) AlMinmaxLocator
+

Return a non-null pointer to an AlMinmaxLocator if it is safe to downcast the object to it.

+
+ +
+
+as_orthographic_camera_ptr(self: alias_api.AlObject) AlOrthographicCamera
+

Return a non-null pointer to an AlOrthographicCameraPtr if it is safe to downcast the object to it.

+
+ +
+
+as_param_action_ptr(self: alias_api.AlObject) AlParamAction
+

Return a non-null pointer to an AlParamAction if it is safe to downcast the object to it.

+
+ +
+
+as_perspective_camera_ptr(self: alias_api.AlObject) AlPerspectiveCamera
+

Return a non-null pointer to an AlPerspectiveCameraPtr if it is safe to downcast the object to it.

+
+ +
+
+as_plane_attributes_ptr(self: alias_api.AlObject) AlPlaneAttributes
+

Return a non-null pointer to an AlPlaneAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_point_ptr(self: alias_api.AlObject) AlPoint
+

Return a non-null pointer to an AlPoint if it is safe to downcast the object to it.

+
+ +
+
+as_radial_locator_ptr(self: alias_api.AlObject) AlRadialLocator
+

Return a non-null pointer to an AlRadialLocator if it is safe to downcast the object to it.

+
+ +
+
+as_rev_surf_attributes_ptr(self: alias_api.AlObject) AlRevSurfAttributes
+

Return a non-null pointer to an AlRevSurfAttributes if it is safe to downcast the object to it.

+
+ +
+
+as_set_member_ptr(self: alias_api.AlObject) AlSetMember
+

Return a non-null pointer to an AlSetMember if it is safe to downcast the object to it.

+
+ +
+
+as_set_ptr(self: alias_api.AlObject) AlSet
+

Return a non-null pointer to an AlSet if it is safe to downcast the object to it.

+
+ +
+
+as_settable_ptr(self: alias_api.AlObject) alias_api.AlSettable
+

Return a non-null pointer to an AlSettable if it is safe to downcast the object to it.

+
+ +
+
+as_shader_ptr(self: alias_api.AlObject) AlShader
+

Return a non-null pointer to an AlShader if it is safe to downcast the object to it.

+
+ +
+
+as_shell_node_ptr(self: alias_api.AlObject) AlShellNode
+

Return a non-null pointer to an AlShellNode if it is safe to downcast the object to it.

+
+ +
+
+as_shell_ptr(self: alias_api.AlObject) AlShell
+

Return a non-null pointer to an AlShell if it is safe to downcast the object to it.

+
+ +
+
+as_space_point_ptr(self: alias_api.AlObject) AlSpacePoint
+

Return a non-null pointer to an AlSpacePoint if it is safe to downcast the object to it.

+
+ +
+
+as_surface_node_ptr(self: alias_api.AlObject) AlSurfaceNode
+

Return a non-null pointer to an AlSurfaceNode if it is safe to downcast the object to it.

+
+ +
+
+as_surface_point_ptr(self: alias_api.AlObject) AlSurfacePoint
+

Return a non-null pointer to an AlSurfacePoint if it is safe to downcast the object to it.

+
+ +
+
+as_surface_ptr(self: alias_api.AlObject) AlSurface
+

Return a non-null pointer to an AlSurface if it is safe to downcast the object to it.

+
+ +
+
+as_switch_shader_ptr(self: alias_api.AlObject) AlSwitchShader
+

Return a non-null pointer to a AlSwitchShader if it is safe to downcast the object to it.

+
+ +
+
+as_texture_node_ptr(self: alias_api.AlObject) AlTextureNode
+

Return a non-null pointer to an AlTextureNode if it is safe to downcast the object to it.

+
+ +
+
+as_texture_ptr(self: alias_api.AlObject) AlTexture
+

Return a non-null pointer to an AlTexture if it is safe to downcast the object to it.

+
+ +
+
+copy_wrapper(self: alias_api.AlObject) alias_api.AlObject
+

Return an exact duplicate of this AlObject wrapper.

+
+ +
+
+delete_object(self: alias_api.AlObject) int
+

Delete the object from the Alias Universe.

+
+ +
+
+property name
+

Get or set the object name.

+
+ +
+
+type(self: alias_api.AlObject) alias_api.AlObjectType
+

Return the AlObject type identifier.

+
+ +
+ +
+
+class alias_api.AlObjectType
+

Alias object types.

+

Members:

+
+

ClusterType

+

ConicAttributeType

+

ClusterNodeType

+

AmbientLightType

+

GroupNodeType

+

NonAmbientLightType

+

AreaLightType

+

PointConstraintType

+

DirectionLightType

+

CameraType

+

LightUpNodeType

+

BoxLightType

+

CameraViewType

+

LightType

+

LightNodeType

+

SpotLightType

+

CameraEyeType

+

SetType

+

CameraUpType

+

TrimBoundaryType

+

ClusterMemberType

+

ConstructionPlaneType

+

ConeLightType

+

CurveNodeType

+

CurveOnSurfaceType

+

CurveType

+

CurveCVType

+

KeyframeType

+

PolygonType

+

VolumeLightType

+

LightLookAtNodeType

+

CylinderLightType

+

DagNodeType

+

FaceNodeType

+

FaceType

+

PointLightType

+

Unusedtype

+

LinearLightType

+

CurveAttributeType

+

TextureType

+

SurfaceType

+

ReferenceFileType

+

OrthographicCameraType

+

PerspectiveCameraType

+

FuturePointType3

+

ArcAttributeType

+

SetMemberType

+

SphereLightType

+

SurfaceNodeType

+

SurfaceCurveType

+

JointType

+

SurfaceCVType

+

LayerType

+

TorusLightType

+

LineAttributeType

+

PolysetType

+

MotionActionType

+

LocatorType

+

WindowType

+

SwitchShaderType

+

ChannelType

+

ActionType

+

ParamActionType

+

StreamType

+

EnvironmentType

+

ShaderType

+

PolysetNodeType

+

AttributeType

+

PolysetVertexType

+

PlaneAttributeType

+

DeviationLocatorType

+

RevSurfAttributeType

+

ConstraintType

+

OrientationConstraintType

+

AimConstraintType

+

CharacterType

+

TextureNodeType

+

ShellNodeType

+

ShellType

+

TrimRegionType

+

TrimCurveType

+

CommandType

+

CommandRefType

+

ContactType

+

CharacterSpaceType

+

CharSnippetType

+

CharTransitionType

+

IKHandleType

+

IKHandleNodeType

+

AnnotationLocatorType

+

DistanceLocatorType

+

CurvePointType

+

AngleLocatorType

+

RadialLocatorType

+

MinmaxLocatorType

+

ConstructionEntityType

+

ConstructionVectorType

+

ConstructionFutureType1

+

ConstructionFutureType2

+

PointType

+

SpacePointType

+

SurfacePointType

+

CurveOnSurfacePointType

+

FuturePointType1

+

FuturePointType2

+

ReferenceFileSetType

+

FuturePointType4

+

FuturePointType5

+

CloudType

+

BlendCurveType

+

BlendPointType

+

ReferenceObjectType

+

CategoryType

+

MeshType

+

MeshNodeType

+

EvaluateType

+

ReferenceLayerType

+

LayeredShaderType

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlOrthographicCamera
+

Orthographic modeling cameras.

+

This class provides an interface to orthographic cameras, primarily +so that one can manipulate the image planes on those cameras. In +general, little can be done to ortho cameras, as they are more of +a modeling tool than geometry. In that regard, this class contains +little functionality.

+

It is possible to create a new orthographic camera through the +create() call. The valid parameters to that call are defined in +AlWindow.h. Note that creating an orthographic camera automatically +creates the associated modeling window.

+
+
+copy_wrapper(self: alias_api.AlOrthographicCamera) alias_api.AlObject
+

Return an exact duplicate of this AlOrthographicCamera wrapper.

+
+ +
+
+create(self: alias_api.AlOrthographicCamera, view_type: alias_api.AlWindow.AlViewType) int
+

Creates AlOrthographicCamera with the associated window.

+
+ +
+
+delete_object(self: alias_api.AlOrthographicCamera) int
+

Delete the AlOrthographicCamera from the Alias Universe.

+
+ +
+
+property name
+

Get or set the AlOrthographicCamera name.

+
+ +
+
+type(self: alias_api.AlOrthographicCamera) alias_api.AlObjectType
+

Return the AlOrthographicCamera type identifier.

+
+ +
+ +
+
+class alias_api.AlParamAction
+

Basic interface to derived class of actions for parameter curve actions.

+

An AlParamAction is derived from an AlAction. This particular +action has a list of AlKeyframes which are CVs on a Poon-Ross spline. +This spline is basically a Hermite-linear spline. That is, it is +a Hermite in y (the vertical axis) and a linear in x (the horizontal +axis).

+

In order to create an AlParamAction, you must have at least one +valid, created AlKeyframe which will be the first keyframe of the +action. After the AlParamAction is created, you can add other keyframes +to the AlParamAction. Note that two AlKeyframes cannot have the same +location. If you add a keyframe to the action that has the same location +as an existing keyframe of the action, the existing keyframe will be +deleted. Since an AlKeyframe is created at (0, 0), you cannot create +a bunch of AlKeyframes, add them to the AlParamAction, and then modify +their locations later, since the AlParamAction will only have one +keyframe (the others will have been deleted as each successive keyframe +with the same location is added to the AlParamAction). You must set +the location of the AlKeyframe before adding it to the AlParamAction.

+

If you copy an AlParamAction, all the keyframes (and the keyframes’ +streams) will also be copied. If you delete an AlParamAction, all +its Keyframes will be deleted.

+
+
+add_keyframe(self: alias_api.AlParamAction, location: float, value: float, recompute: int = True, intan: alias_api.AlTangentType = <AlTangentType.TangentFlat: 2>, outtan: alias_api.AlTangentType = <AlTangentType.TangentFlat: 2>) int
+

This method adds a keyframe to the parameter curve’s list of +keyframes. If the parameter curve already has another +keyframe at the same location as this keyframe, then the existing keyframe +at this location will be deleted and replaced with this keyframe. +If this object does not yet reference an actual Parameter Curve, a new +curve will be created.

+
+
Parameters
+
    +
  • location (float) – the time value for the keyframe

  • +
  • value (float) – the value of the keyframe

  • +
  • recompute – recompute the tangents of neighboring keyframes

  • +
  • intan (AlTangentType) – the in tangent for the keyframe

  • +
  • outtan (AlTangentType) – the out tangent for the keyframe

  • +
+
+
Returns
+

The status code result of the operation: +Success - operation completed normally. +Failure - operation failed to complete normally. +InsufficientMemory - there wasn’t enough memory to complete the operation.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+add_keyframe_range(self: alias_api.AlParamAction, location: std::vector<double, std::allocator<double> >, value: std::vector<double, std::allocator<double> >, recompute: bool, intan: alias_api.VectorAlTangentType = VectorAlTangentType[], outtan: alias_api.VectorAlTangentType = VectorAlTangentType[]) int
+

This method adds a block of keyframes to the parameter curve’s list +of keyframes. If the parameter curve already has a keyframe at the same +location as one of the added keyframes, then the method will fail.

+

If this object does not yet reference an actual Parameter Curve, a new +curve will be created.

+

If intan and outan are None, TangentFlat is assumed.

+

The size of location, value, intan (if not None), and outtan (if not None) +must all be the same size.

+
+
Parameters
+
    +
  • location (List[float]) – array of keyframe locations (time values)

  • +
  • value (List[float]) – array of keyframe values

  • +
  • recompute (bool) – recompute tangents of neighboring keyframes

  • +
  • intan (List[AlTangentType]) – array of the in-tangents for keyframes

  • +
  • outtan (List[AlTangentType]) – array of the out-tangents for keyframes

  • +
+
+
Returns
+

The status code result of the operation: +Success - operation completed normally +InvalidArgument - one of the arguments was None or invalid +InsufficientMemory - ran out of memory +ObjectAlreadyPresent - a keyframe already exists in given location +Failure - could not create action

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+apply_iterator_to_keyframes(self: alias_api.AlParamAction, iter: AlIterator) Tuple[int, int]
+

Apply the given AlIterator to all keyframes in the action. +The second argument will be set to the return value of the last +application of the iterator’s function. +See the AlIterator class for more information. +:param iter: the iterator to be applied to each keyframe +:type iter: AlIterator

+
+
Returns
+

A tuple containing: +(1) the status of the application of the iterator

+
+

Success - the application of the iterator terminated normally +Failure - the application of the iterator terminated abnormally +InvalidArgument - the iterator was None. +InvalidObject - the action was invalid

+
+
    +
  1. the return value of the last application of the iterator’s function

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, int>

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlParamAction) alias_api.AlObject
+

Returns a duplicate of this wrapper object, pointing to the same object.

+
+ +
+
+delete_keyframe_range(self: alias_api.AlParamAction, min_value: float, max_value: float) int
+

This method deletes all keyframes whose “time”s are greater or equal +to the “min_value” given, and less or equal to than the “max_value” given.

+
+
Parameters
+
    +
  • min_value (float) – min. time value to delete keyframes from

  • +
  • max_value (float) – max. time value to delete keyframes up to

  • +
+
+
Returns
+

The status code result of the operation: +Success - operation completed normally. +Failure - operation failed to complete normally. +InvalidObject - the action was invalid.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+first_keyframe(self: alias_api.AlParamAction) alias_api.AlKeyframe
+

This method returns the first keyframe of this parameter curve action.

+
+ +
+
+last_keyframe(self: alias_api.AlParamAction) alias_api.AlKeyframe
+

This method returns the last keyframe of this parameter curve action.

+
+ +
+
+number_of_keyframes(self: alias_api.AlParamAction) int
+

Returns the number of keyframes in this action, or -1 if the call fails.

+
+ +
+
+type(self: alias_api.AlParamAction) alias_api.AlObjectType
+

Returns the class identifier ‘ParamActionType’.

+
+ +
+ +
+
+class alias_api.AlPerspectiveCamera
+

Encapsulates creation, deletion and manipulation of perspective cameras

+

This class encapsulates all the functionality for creating, +deleting and manipulating a perspective camera. The user +cannot create, delete or manipulate orthographic cameras.

+

A camera is made of 4 parts - an AlPerspectiveCamera object and 3 attached +AlCameraNodes which represent eye, view and up position of +the camera. These camera nodes are members of the universe’s +dag structure.

+

The view direction vector is the vector between the eye +position and the view position. The up direction vector is +the vector between the eye position and the up position. +There are methods to get these positions and to access the +attached camera nodes.

+

To create a perspective camera, the user must instantiate and +call the create method on an AlPerspectiveCamera object. +This creates the necessary eye, view and up AlCameraNodes, +groups them under an AlGroupNode and inserts the group into +the universe’s dag structure. The user cannot instantiate +an AlCameraNode directly.

+

When a camera is created, if the coordinate system is specified +as kZUp (when initializing the universe) the camera’s default eye, +view and up positions are respectively (0.0, -12.0, 0.0), +(0.0, 0.0, 0.0), (0.0, -12.0, 1.0). If the coordinate system is +specified as kYUp, then eye, view and up positions are +(0.0, 0.0, 12.0), (0.0, 0.0, 0.0), (0.0, 1.0, 12.0).

+

There are two ways to delete a camera object. When the +deleteObejct() method of an AlPerspectiveCamera object is called, its +three camera nodes are +deleted. Alternatively, when a camera node is deleted, its +associated camera (and other camera nodes) are deleted. +The group node that originally grouped the eye, view and +up nodes is not deleted.

+
+
+property angle_of_view
+

Get or set the angle of view of the camera.

+
+ +
+
+copy_wrapper(self: alias_api.AlPerspectiveCamera) alias_api.AlObject
+

Return an exact duplicate of this AlPerspectiveCamera wrapper.

+
+ +
+
+create(self: alias_api.AlPerspectiveCamera) int
+

Creates a camera and all associated eye, view, and up camera nodes and attaches them to the camera.

+
+ +
+
+delete_object(self: alias_api.AlPerspectiveCamera) int
+

Delete the AlPerspectiveCamera from the Alias Universe.

+
+ +
+
+eye(self: alias_api.AlPerspectiveCamera) AlCameraNode
+

Return the eye node object attached to the camera.

+
+ +
+
+property focus_length
+

Get or set the focus length of the camera.

+
+ +
+
+property name
+

Get or set the AlPerspectiveCamera name.

+
+ +
+
+set_world_eye(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_world_eye(self: alias_api.AlPerspectiveCamera, p: alPyMath::Vec3) -> int

  2. +
+

Set the world eye position and return the status code result of the operation.

+
    +
  1. set_world_eye(self: alias_api.AlPerspectiveCamera, x: float, y: float, z: float) -> int

    +
    +

    Sets the camera’s world eye position to be x,y, & z in world space. +The value will be set in the camera’s eye node.

    +
    +
    param x
    +

    The new world eye position along the x axis.

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    The new world eye position along the y axis.

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    The new world eye position along the z axis.

    +
    +
    type z
    +

    float

    +
    +
    return
    +

    The status code result: +Success - the position was successfully set +InvalidObject - the camera is not valid.

    +
    +
    rtype
    +

    int(StatusCode)

    +
    +
    +
    +
  2. +
+
+ +
+
+set_world_up(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_world_up(self: alias_api.AlPerspectiveCamera, p: alPyMath::Vec3) -> int

    +
    +

    Set the world up position and return the status code result of the operation.

    +
    +
    param p
    +

    A vec3 containing the new world up position.

    +
    +
    return
    +

    The status code result: +Success - the position was successfully set +InvalidObject - the camera is not valid.

    +
    +
    rtype
    +

    int(StatusCode)

    +
    +
    +
    +
  2. +
  3. set_world_up(self: alias_api.AlPerspectiveCamera, x: float, y: float, z: float) -> int

    +
    +

    Sets the camera’s world up position to be x,y, & z in world space. +The value will be set in the camera’s up node.

    +
    +
    param x
    +

    The new world up position along the x axis.

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    The new world up position along the y axis.

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    The new world up position along the z axis.

    +
    +
    type z
    +

    float

    +
    +
    return
    +

    The status code result: +Success - the position was successfully set +InvalidObject - the camera is not valid.

    +
    +
    rtype
    +

    int(StatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+set_world_view(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_world_view(self: alias_api.AlPerspectiveCamera, p: alPyMath::Vec3) -> int

  2. +
+

Set the world view position and return the status code result of the operation.

+
    +
  1. set_world_view(self: alias_api.AlPerspectiveCamera, x: float, y: float, z: float) -> int

    +
    +

    Sets the camera’s world view position to be x,y, & z in world space. +The value will be set in the camera’s view node.

    +
    +
    param x
    +

    The new world view position along the x axis.

    +
    +
    type x
    +

    float

    +
    +
    param y
    +

    The new world view position along the y axis.

    +
    +
    type y
    +

    float

    +
    +
    param z
    +

    The new world view position along the z axis.

    +
    +
    type z
    +

    float

    +
    +
    return
    +

    The status code result: +Success - the position was successfully set +InvalidObject - the camera is not valid.

    +
    +
    rtype
    +

    int(StatusCode)

    +
    +
    +
    +
  2. +
+
+ +
+
+type(self: alias_api.AlPerspectiveCamera) alias_api.AlObjectType
+

Return the AlPerspectiveCamera type identifier.

+
+ +
+
+up(self: alias_api.AlPerspectiveCamera) AlCameraNode
+

Return the up node object attached to the camera.

+
+ +
+
+view(self: alias_api.AlPerspectiveCamera) AlCameraNode
+

Return the view node object attached to the camera.

+
+ +
+
+world_eye(self: alias_api.AlPerspectiveCamera) Tuple[int, float, float, float]
+

Find the world coordinates of the camera’s eye location.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the coordinates was found +InvalidObject - the point is not valid

+
+

x [float] - the x world coordinate of the eye position +y [float] - the y world coordinate of the eye position +z [float] - the z world coordinate of the eye position

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+world_up(self: alias_api.AlPerspectiveCamera) Tuple[int, float, float, float]
+

Find the world coordinates of the camera’s up location.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the coordinates was found +InvalidObject - the point is not valid

+
+

x [float] - the x world coordinate of the up position +y [float] - the y world coordinate of the up position +z [float] - the z world coordinate of the up position

+

+
+
Return type
+

tuple

+
+
+
+ +
+
+world_view(self: alias_api.AlPerspectiveCamera) Tuple[int, float, float, float]
+

Find the world coordinates of the camera’s view location.

+
+
Returns
+

A tuple (status, x, y, z), where +status [AlStatusCode] - the status code result

+
+

Success - the coordinates was found +InvalidObject - the point is not valid

+
+

x [float] - the x world coordinate of the view position +y [float] - the y world coordinate of the view position +z [float] - the z world coordinate of the view position

+

+
+
Return type
+

tuple

+
+
+
+ +
+ +
+
+class alias_api.AlPickable
+

Basic Interface to Alias objects which can be picked.

+

This class encapsulates the functionality of Alias objects +which have the capacity to be picked. As expected, pickable +objects can either be picked or unpicked.

+
+
+is_picked(self: alias_api.AlPickable) int
+

Return True if the object is picked.

+
+ +
+
+pick(self: alias_api.AlPickable) int
+

Pick the object

+
+ +
+
+unpick(self: alias_api.AlPickable) int
+

Unpick the object

+
+ +
+ +
+
+class alias_api.AlPlaneAttributes
+

Interface to Alias plane surface attributes.

+

AlPlaneAttributes is a class derived from the AlAttributes class. +This class allows access to the attributes for an plane.

+

The attributes which define a plane are the coefficients of +Ax + By + Cz + D = 0 and coordinates of the center of the plane.

+

At this time it is only possible to query an AlPlaneAttribute. +Further it is currently not possible to create a plane with +attributes either in OpenModel or Alias. This attribute is +provided for compatibility with IGES, and as such the only +way to get a plane with attributes into an Alias wire file +is to import an IGES file into Alias and then save a wire +file.

+
+
+center_point(self: alias_api.AlPlaneAttributes) Tuple[int, float, float, float]
+

Returns the center of a plane

+
+
Returns
+

a tuple containing: +(1) the status code result:

+
+

Success - the center point was successfully returned. +InvalidObject - the attr

+
+
    +
  1. the center point x coordinate

  2. +
+

(3) the center point y coordinate +(3) the center point z coordinate

+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float]

+
+
+
+ +
+
+coefficients(self: alias_api.AlPlaneAttributes) Tuple[int, float, float, float, float]
+

Determine the coefficients for the Conic, where the Conic +is defined by the equation

+

Ax + By + Cz + D = 0

+
+
Returns
+

A tuple containg: +(1) the status code result:

+
+

Success - coefficients were successfully returned. +InvalidObject - the attribute was invalid +Failure - an error occurred

+
+
    +
  1. c_a - the coefficient A

  2. +
  3. c_b - the coefficient B

  4. +
  5. c_c - the coefficient C

  6. +
  7. c_d - the coefficient D

  8. +
+

+
+
Return type
+

Tuple[int(AlStatusCode), float, float, float, float]

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlPlaneAttributes) alias_api.AlObject
+

This method makes a copy of the AlPlaneAttributes. The returned +AlPlaneAttributes will reference the same data as the original.

+
+ +
+
+type(self: alias_api.AlPlaneAttributes) alias_api.AlObjectType
+

Returns the class identifier ‘ConicAttributeType’.

+
+ +
+ +
+
+class alias_api.AlPoint
+

Contains functionality common to all Alias construction entity points.

+

This virtual class is derived from AlConstructionEntity and encapsulates methods +common to all the Alias point type such as space points, curve points, +curve on surface points, and surface points.

+
+
+copy_wrapper(self: alias_api.AlPoint) alias_api.AlObject
+

Return an exact duplicate of this AlPoint wrapper.

+
+ +
+
+type(self: alias_api.AlPoint) alias_api.AlObjectType
+

Return the AlPoint type identifier.

+
+ +
+
+worldPosition(self: alias_api.AlPoint, x: float, y: float, z: float) int
+

Return the world coordinates of the AlPoint.

+
+ +
+ +
+
+class alias_api.AlPointType
+

The type of point.

+

Members:

+
+

CV

+

EditPoint

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlRadialLocator
+

Interface to Alias Radial locators

+

A Radial locator is used to create a radial measure of a curve or a +curve on surface in their respective parametric spaces. This class +methods to create the locator, query the radius and set the display +attributes of the radial locator in the Alias windows. If the curve +or curve on surface on which this locator is created is deleted, the +locator is automatically deleted.

+
+
+attached_to(self: alias_api.AlRadialLocator) alias_api.AlObject
+

Returns the object this locator is attached to. This +object can be attached to either a curve on surface or +a curve node. NULL is returned if this method fails.

+
+ +
+
+center(self: alias_api.AlRadialLocator) Tuple[int, float, float, float]
+

Get the center of curvature of the curve where radial locator is created.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the center was found +InvalidObject - the object is not valid

+
+
    +
  1. the center of curvature of the curve at the locator

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlRadialLocator) alias_api.AlObject
+

Return an exact duplicate of this AlRadialLocator wrapper.

+
+ +
+
+create(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create(self: alias_api.AlRadialLocator, curve: alias_api.AlCurve, u: float = 0.0) -> int

    +
    +

    Creates a radial locator on the given curve

    +
    +
    param curve
    +

    The curve on which the locator is created.

    +
    +
    type curve
    +

    AlCurve

    +
    +
    param u
    +

    Curve parameter at which locator is created.

    +
    +
    type u
    +

    float

    +
    +
    return
    +

    The status code result of the operation: +Success - the locator was successfully created +AlreadyCreated - object has already been created +Failure - the radial locator could not be created +InvalidArgument - the curve is not a valid object

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  2. +
  3. create(self: alias_api.AlRadialLocator, curve: alias_api.AlCurveOnSurface, u: float = 0.0) -> int

    +
    +

    Creates a radial locator on the given curve

    +
    +
    param curve
    +

    The curve on which the locator is created.

    +
    +
    type curve
    +

    AlCurveOnSurface

    +
    +
    param u
    +

    Curve parameter at which locator is created.

    +
    +
    type float
    +

    +
    return
    +

    The status code result of the operation: +Success - the locator was successfully created +AlreadyCreated - object has already been created +Failure - the radial locator could not be created +InvalidArgument - the curve is not a valid object

    +
    +
    rtype
    +

    AlStatusCode

    +
    +
    +
    +
  4. +
+
+ +
+
+diameter_create(self: alias_api.AlRadialLocator, curve: alias_api.AlCurve, u: float = 0.0) int
+

Creates a radial locator on the given curve

+
+
Parameters
+
    +
  • curve (AlCurve) – The curve on which which the locator is created.

  • +
  • u (float) – The curve parameter at which locator is created.

  • +
+
+
Returns
+

The status code result of the operation: +Success - the locator was successfully created +AlreadyCreated - object has already been created +Failure - the radial locator could not be created +InvalidArgument - the curve is not a valid object

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+left_justify(self: alias_api.AlRadialLocator) Tuple[int, int]
+

Find whether the text of radial locator is left justified or right justified.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the justification was found +InvalidObject - the object is not valid

+
+
    +
  1. a boolean value indicating whether the text is left justified

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, bool>

+
+
+
+ +
+
+offset(self: alias_api.AlRadialLocator) Tuple[int, float]
+

Get the offset of the Radial locator display.

+
+
Parameters
+

value (float) – The display offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was found +InvalidObject - the object is not valid

+
+
+
+ +
+
+parameter(self: alias_api.AlRadialLocator) Tuple[int, float]
+

Get the curve parameter where radial locator is located.

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the parameter was found

+
+
    +
  1. the curve parameter at the locator

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+radius(self: alias_api.AlRadialLocator) Tuple[int, float]
+

Get the radius of the curve where radial locator is created

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the radius was found +InvalidObject - the object is not valid

+
+
    +
  1. the radius of the curve at the locator

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, float>

+
+
+
+ +
+
+set_left_justify(self: alias_api.AlRadialLocator, left_justify: int) int
+

Set the justification of the text for the Radial locator.

+

The text can be right justified or left justified.

+
+
Parameters
+

left_justify (bool) – A value of true makes the text left +justified and a value false makes it right justified.

+
+
Returns
+

The status code result of the operation: +Success - setting was successful +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+set_offset(self: alias_api.AlRadialLocator, offset: float) int
+

Set the offset in Radial locator display.

+
+
Parameters
+

offset (float) – The value of the offset.

+
+
Returns
+

The status code result of the operation: +Success - the offset was set +InvalidObject - the object is not valid

+
+
+
+ +
+
+set_parameter(self: alias_api.AlRadialLocator, u: float) int
+

Set the curve parameter at which the radial locator is located.

+
+
Parameters
+

u (float) – The curve parameter

+
+
Returns
+

The status code result of the operation: +Success - the parameter was set +InvalidObject - the object is not valid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+type(self: alias_api.AlRadialLocator) alias_api.AlObjectType
+

Return the AlRadialLocator type identifier.

+
+ +
+ +
+
+class alias_api.AlReferenceFile
+

A base class that encapsulates access to Reference File.

+
+
+copy_wrapper(self: alias_api.AlReferenceFile) alias_api.AlObject
+

Return an exact duplicate of this AlReferenceFile wrapper.

+
+ +
+
+delete_object(self: alias_api.AlReferenceFile) int
+

Delete the AlReferenceFile from the Alias Universe and return the status of the performed operation.

+
+ +
+
+property file_name
+

Get the AlReferenceFile file name.

+
+ +
+
+get_alternatives(self: alias_api.AlReferenceFile) List[AlReferenceFileSet]
+

Return a list of all the alternatives this AlReferenceFile belongs to.

+
+ +
+
+property name
+

Get the AlReferenceFile name.

+
+ +
+
+property path
+

Deprecated - use ‘file_name’ property instead.

+
+ +
+
+property source_path
+

Deprecated - use ‘source_wirefile’ property instead.

+
+ +
+
+property source_wirefile
+

Get the AlReferenceFile source wire file path.

+
+ +
+
+status(self: alias_api.AlReferenceFile) alias_api.ReferenceFileStatus
+

Return the status of the reference file.

+
+ +
+
+type(self: alias_api.AlReferenceFile) alias_api.AlObjectType
+

Return the AlReferenceFile type identifier.

+
+ +
+
+property uuid
+

Get the AlReferenceFile UUID.

+
+ +
+ +
+
+class alias_api.AlReferenceFileSet
+

A base class that encapsulates access to Reference File Sets.

+
+
+add_reference(self: alias_api.AlReferenceFileSet, ref_file: alias_api.AlReferenceFile) int
+

Deprecated - use ‘add_reference_file_to_alternative’ instead.

+
+ +
+
+add_reference_file_to_alternative(self: alias_api.AlReferenceFileSet, ref_file: alias_api.AlReferenceFile) int
+

Add an AlReferenceFile to the AlReferenceFileSet.

+
+ +
+
+copy_wrapper(self: alias_api.AlReferenceFileSet) alias_api.AlObject
+

Return an exact duplicate of this AlReferenceFileSet wrapper.

+
+ +
+
+delete_object(self: alias_api.AlReferenceFileSet) int
+

Delete the AlReferenceFileSet from the Alias Universe and return the status of the performed operation.

+
+ +
+
+get_references(self: alias_api.AlReferenceFileSet) List[alias_api.AlReferenceFile]
+

Return a list of all the AlReferenceFiles for this AlReferenceFileSet.

+
+ +
+
+property name
+

Get or set the AlReferenceFile name.

+
+ +
+
+type(self: alias_api.AlReferenceFileSet) alias_api.AlObjectType
+

Return the AlReferenceFileSet type identifier.

+
+ +
+ +
+
+class alias_api.AlReferenceLayer
+

A base class that encapsulates access to Reference Layers.

+
+
+copy_wrapper(self: alias_api.AlReferenceLayer) alias_api.AlObject
+

Return an exact duplicate of this AlReferenceLayer wrapper.

+
+ +
+
+delete_object(self: alias_api.AlReferenceLayer) int
+

Delete the AlReferenceLayer from the Alias Universe and return the status of the performed operation.

+
+ +
+
+get_colour(self: alias_api.AlReferenceLayer) Tuple[int, std::array<unsigned char,4>]
+

Return the colour of this layer.

+
+ +
+
+get_owner(self: alias_api.AlReferenceLayer) alias_api.AlReferenceFile
+

Return the AlReferenceFile owner of this object.

+
+ +
+
+is_visible(self: alias_api.AlReferenceLayer) bool
+

Return True if the layer is visible.

+
+ +
+
+symmetric_normal(self: alias_api.AlReferenceLayer) Tuple[int, float, float, float]
+

Return the symmetry normal of this object.

+
+ +
+
+symmetric_origin(self: alias_api.AlReferenceLayer) Tuple[int, float, float, float]
+

Return the symmetry origin of this object.

+
+ +
+
+symmetry_state(self: alias_api.AlReferenceLayer) alias_api.SymmetryState
+

Return the AlReferenceFile owner of this object.

+
+ +
+
+type(self: alias_api.AlReferenceLayer) alias_api.AlObjectType
+

Return the AlReferenceLayer type identifier.

+
+ +
+ +
+
+class alias_api.AlRetrieveOptions
+

A structure used to transfer options that control the retrieve() method.

+

An AlRetrieveOptions structure is used set or determine the options +that the AlUniverse::retrieve() method uses to tailor the import +of files. +To avoid setting all of the fields of AlRetrieveOptions using +AlUniverse::setRetrieveOptions(), it is recommended that the +current values be acquired first using AlUniverse::retrieveOptions().

+

General Options:

+

new_stage:

+

Determines if all retrieved geometry is put in the current stage, +or is put in a new stage named after the filename. If set to TRUE, +then the retrieved geometry will be put in a new stage called +<filename><ext> (e.g. model.iges -> modeliges) and this stage will +be made current.

+

Wire File Options:

+

All wire file options default to TRUE.

+

keep_windows:

+

If set to TRUE, the modelling window layout contained in wire files +will be retrieved, and if set to FALSE, the window layout will not be +retrieved.

+

ckeep_cameras:

+

If set to TRUE, the cameras contained in wire files will be retrieved, +and if set to FALSE, the cameras will not be retrieved.

+

keep_animation:

+

If set to TRUE, both the animation and the model contained in wire +files will be retrieved, and if set to FALSE, only the model will be +retrieved.

+

Note: If a window contains an animated camera and keep_animation is TRUE +then this window will be retrieved also, even if keep_windows is +FALSE.

+

keep_backgrounds:

+

If set to TRUE, the background contained in wire files will be +retrieved, and if set to FALSE, the background will not be retrieved.

+

keep_unitsTolerances: +If set to TRUE, linear units, angular units, and construction +toleranced contained in the wire will be retrieved and set. +If set to FALSE, the units and tolerances in the wire file are +ignored. Only relevent for OpenAlias plugins.

+

keep_renderGlobals:

+

If set to TRUE, the render global information stored in a wire file will +be retrieved and set. If set to FALSE, this information will be +ignored. Only relevent for OpenAlias plugins.

+

IGES/VDAIS/C4X/JAMA-IS and VDAFS File Options:

+

group:

+

If set to TRUE, all geometry retrieved from the file will be +grouped under a node named after the translator. For example, IGES +geometry will be grouped under a node called “IGES_FILE”. and STEP +geometry will be grouped under a node called “STEP_FILE”. +If set to FALSE, this group node node will not be created. +The default is FALSE.

+

coalesce:

+

If set to TRUE, multiple knots will be removed based on continutity +in IGES Parametric Curve and Surface geometry, and all VDAFS curve and +surface geometry. The default is FALSE.

+

annotation:

+

If set to TRUE, supported geometric entities that have been flagged +for use as annotation will be retrieved. If set to FALSE, these entities +will not be retrieved. This option does not apply to VDAFS.

+

trim_to_surf:

+

If set to TRUE, retrieved Trimmed or Bounded surfaces whose boundaries +are the same as, or iso-parametric to, the natural boundaries of the +untrimmed surface, will be converted to untrimmed surfaces by shrinking +the surface to the trim boundaries. If set to FALSE, trimmed surfaces +will be represented as such even if the trim boundary information is +unnecessary. The default is TRUE. This option does not apply to VDAFS.

+

scale:

+

All retrieved geometry will be scaled by this factor. +The default is 1.0.

+

layer_or_set:

+

This controls the mapping of the IGES/VDAIS/JAMIAS Level. The options are +a) kLayer, maps level to layer, this is the default +b) kSet, maps level to set +c) kLayerAndSet, maps level to layer and set +d) kNoLayerOrSet, there is no mapping level is ignored. +This option does not apply to VDAFS or C4

+

default_trim:

+

This controls the type of curves that will be used in trimming a surface. +The options are +a) kParameter, use the parameter (2D) space curves, this is +the default. +b) kWorld, use the world (3D) space curves +c) kUseFlag, use the preference in the IGES/VDAIS/JAMAIS/C4 file +NOTE kUseFlag is invalid for VDAFS.

+

create_scan_data:

+

This control the conversion of “Scan Data” 106 Forms 1-3, 11-13 and +63. If on this entity is treated as Scan Data on IGES import. +During VDAFS import, PSET and MDI entities are treated as Scan Data.

+

DWG/DXF File Options.

+

group:

+

See description above.

+

stitch:

+

Determines whether to stitch the surfaces of a solid into a shell (TRUE) +or to group them instead (FALSE).

+

%canonymous_blocks +Determines whether “anonymous” DWG/DXF BLOCK entities are processed (TRUE) +or ignored (FALSE). The default is FALSE, since mostly, these BLOCK +entities contain pattern hatching lines.

+

units:

+

If the units of the DWG/DXF coordinate data is known, it can be set using +this option so that the data is properly scaled. This option is +necessary since the units of the DWG/DXF coordinate data is not stored +in the file. The default is inches (kInches), but it can be set to +any of the following values: kMiles, kFeet, kInches, kMils, +kMicroInches, kKilometers, kMeters, kCentimeters, kMillimeters, or +kMicrons.

+

scale:

+

See above for description of this field.

+
+ +
+
+class alias_api.AlRevSurfAttributes
+

Interface to Alias revolved surface attributes.

+

AlRevSurfAttributes is a class derived from the AlAttributes class. +This class allows access to some of the attributes of a revolved +surface, in this case the start and end angles of revolution.

+

When querying the attributes of a revolved surface (retrieved +from IGES or created in Alias with exact ON) the first +attribute will be an AlRevSurfAttributes, the second will be +an AlLineAttributes representing the axis of revolution, and +the remainder of the attributes describe the line which was +revolved to generate the surface.

+
+
+copy_wrapper(self: alias_api.AlRevSurfAttributes) alias_api.AlObject
+

This method makes a copy of the AlRevSurfAttributes. The returned +AlRevSurfAttributes will reference the same data as the original.

+
+ +
+
+end_angle(self: alias_api.AlRevSurfAttributes) float
+

Returns the end angle in degrees for the revolved surface.

+
+ +
+
+start_angle(self: alias_api.AlRevSurfAttributes) float
+

Returns the start angle in degrees for the revolved surface.

+
+ +
+
+type(self: alias_api.AlRevSurfAttributes) alias_api.AlObjectType
+

Returns the class identifier ‘ConicAttributeType’.

+
+ +
+ +
+
+class alias_api.AlSet
+

Basic Interface to Alias set structures.

+

A set can be described as a storable list. A set can contain +any combination of cameras, dag nodes, curve CV’s and surface CV’s, +or polyset vertices. +A set can be exclusive or multi - exclusive means that a member +of a set can be in no other set; multi means that a member of the +set can be in any other non-exclusive set.

+

You can access the members of a set by traversing a set’s list of +members.

+

If you remove all members of a set, the empty AlSet object must be +explicitly deleted. If you store an empty set, it will be lost +when you retrieve your wire file into the interactive Alias package.

+

The following classes can be grouped into sets: AlDagNode, AlPerspectiveCamera, +AlCurveCV, AlPolysetVertex and AlSurfaceCV.

+
+
+apply_iterator_to_members(self: alias_api.AlSet, itr: AlIterator) int
+

Apply the given iterator to eaach member of this set.

+

See documentation for AlIterator.

+
+
Parameters
+

itr (AlIterator) – The iterator to apply to each set member

+
+
Returns
+

The status code result of the operation +Success - operation exited normally +InvalidArgument - ‘iter’ was None +Failure - operation exited abnormally +InvalidObject - the set is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlSet) alias_api.AlObject
+

Return an exact duplicate of this AlSet object.

+
+ +
+
+create(self: alias_api.AlSet, exclusive: int) int
+

Does any initialization and allocation of data for an AlSet.

+

If the ‘exclusive’ flag is set to True, then this set is made an exclusive set (ie. the +members of this set are not allowed to be members of any other set). If it is set to +False, then the set is designated as “multiple” (ie. the members of this set can be in +any other non-exclusive set).

+
+
Parameters
+

exclusive (bool) – state to set the exclusive flag for this set (see above)

+
+
Returns
+

The status code result of the operation: +sSuccess - set was created +sInsufficientMemory - no memory

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+delete_object(self: alias_api.AlSet) int
+

Delete the AlSet from the Alias Universe and return the status of the performed operation.

+
+ +
+
+first_member(self: alias_api.AlSet) AlSetMember
+

Return the AlSetMember that is the first member in the list of members of this set.

+

Return None if this set has no members. Note that this operation is a O(log n) operation +and is provided for convience. If you intend to perform an operation on every element in +the set, use an iterator.

+
+ +
+
+is_empty(self: alias_api.AlSet) int
+

Return True if the set is empty (ie. it has zero members), otherwise return False.

+
+ +
+
+is_exclusive(self: alias_api.AlSet) int
+

Return True if the set is exclusive, or False if the set is ‘multiple’.

+
+ +
+
+property name
+

Get or set the AlSet name.

+
+ +
+
+next_set(self: alias_api.AlSet) alias_api.AlSet
+

Return the next AlSet in the set list, or None if there are no more sets.

+
+ +
+
+number_of_members(self: alias_api.AlSet) int
+

Return the number of members belonging to this set. Return -1 if the set is invalid.

+
+ +
+
+prev_set(self: alias_api.AlSet) alias_api.AlSet
+

Return the previous AlSet in the set list, or None if there are no more sets.

+
+ +
+
+set_exclusive(self: alias_api.AlSet, on: int) int
+

Makes the current set exclusive or multiple. If ‘on’ is True then the set is made exclusive.

+
+ +
+
+type(self: alias_api.AlSet) alias_api.AlObjectType
+

Return the AlSet type identifier.

+
+ +
+ +
+
+class alias_api.AlSetMember
+

Basic Interface to the members of Alias set structures.

+

This class provides utility functions for set operations. The first +AlSetMember of a set can be retrieved from the AlSet. Then iteration +through the sets can be performed using the calls provided within +this class.

+

The following classes can be grouped into sets: AlDagNode, AlPerspectiveCamera, +AlCurveCV, AlPolysetVertex and AlSurfaceCV. These classes use +multiple inheritance which include the AlSettable class. Use the add_to_set() +method of class AlSettable to add the object to a set.

+
+
+copy_wrapper(self: alias_api.AlSetMember) alias_api.AlObject
+

Return an exact duplicate of this AlSetMember object.

+
+ +
+
+next_set_member(self: alias_api.AlSetMember) alias_api.AlSetMember
+

Return the next AlSetMember. Return None if there is no next set member.

+
+ +
+
+object(self: alias_api.AlSetMember) alias_api.AlObject
+

Return the object that this set member references.

+
+ +
+
+prev_set_member(self: alias_api.AlSetMember) alias_api.AlSetMember
+

Return the previous AlSetMember. Return None if there is no next set member.

+
+ +
+
+remove_from_set(self: alias_api.AlSetMember, set: alias_api.AlSet) int
+

Remove this member from the set.

+
+
Parameters
+

set (AlSet) – The set to remove this from

+
+
Returns
+

The status code of the result: +Success - If the object was removed successfully +InvalidArgument - The set was invalid +ObjectNotAMember - If the object was not found in this set +InvalidObject - The set is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+set(self: alias_api.AlSetMember) alias_api.AlSet
+

Return the set that this set member belongs to.

+
+ +
+
+type(self: alias_api.AlSetMember) alias_api.AlObjectType
+

Return the AlSetMember type identifier.

+
+ +
+ +
+
+class alias_api.AlSettable
+

Encapsulates methods common to Alias objects which can belong to sets.

+

This class is a base class for all objects which can be +contained in a set. It provides the methods necessary +to access the set methods of these objects.

+

Note that this class relies on the fact the classes derived from it +overload the extractType function in AlObject. In theory, we should be +introducing a new base class, AlTypeable, which has a pure virtual +extractType method. But this introduces a lot of extra code. Let’s just +assume for now that if AlFoo inherits AlSettable, then AlFoo provides +a working extractType method.

+
+
+add_to_set(self: alias_api.AlSettable, arg0: AlSet) int
+

Adds this object to the set

+
+
Parameters
+

set (AlSet) – set to add to

+
+
Returns
+

The status of the operation: +Success - successfully added to the set. +InsufficientMemory - not enough memory available. +ObjectInSet - this object already belongs to this set +ObjectInAnotherSet - this set is exclusive and this object already belongs to another set. +ObjectInExclusiveSet - this object already belongs to an exclusive set. +ObjectAncestorInSet - an ancestor of this object already belongs to this set. +ObjectDescendentInSet - a descendent of this object already belongs to this set. +InvalidArgument - set was NULL or, this object is a AlSurfaceCV and is the target of a construction history. +InvalidObject - this object was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+apply_iterator_to_sets(self: alias_api.AlSettable, arg0: AlIterator) Tuple[int, int]
+

Apply the given iterator to all the sets affect by this object. +See the documentation for AlIterator.

+

Warning: be careful when using this iterator. If you modify +the actual set during an iteration, it is possible that +this routine will end up pointing to invalid data and send you +garbage. This should not happen when simply applying transformations +to a set. But deleting a set using this method is considered +unsafe. If you do it, return immediately.

+
+
Parameters
+

iter (AlIterator) – the iterator to apply to each set

+
+
Returns
+

A tuple containing: +(1) the status of the application of the iterator

+
+

Success - the applyIteratorToSets exited normally +Failure - applyIteratorToSets exited abnormally +InvalidArgument - iter is NULL

+
+
    +
  1. the return value of the last application of the iterator’s function

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, int>

+
+
+
+ +
+
+first_set(self: alias_api.AlSettable) AlSet
+

Finds and returns the first set of which this object is a member. +If no such set can be found, None is returned.

+
+ +
+
+is_set_member(self: alias_api.AlSettable, arg0: AlSet) AlSetMember
+

Returns the AlSetMember object if it is a member of the set.

+
+
Parameters
+

set (AlSet) – the object to test membership in.

+
+
Returns
+

The AlSetMember object representing the set membership.

+
+
Return type
+

AlSetMember

+
+
+
+ +
+
+next_set(self: alias_api.AlSettable, arg0: AlSet) AlSet
+

Finds and returns the set following the given one of which this +object is a member. If no such set can be found, None is returned.

+
+
Parameters
+

last_set (AlSet) – Set to walk forward from

+
+
Returns
+

The next set of which this object is a member

+
+
Return type
+

AlSet

+
+
+
+ +
+
+prev_set(self: alias_api.AlSettable, arg0: AlSet) AlSet
+

Finds and returns the set preceding the given one of which this +object is a member. If no such set can be found, None is returned.

+
+
Parameters
+

last_set (AlSet) – Set to walk forward from

+
+
Returns
+

The previous set of which this object is a member

+
+
Return type
+

AlSet

+
+
+
+ +
+
+remove_from_all_sets(self: alias_api.AlSettable) int
+

Removes this object from all sets in the universe that it may be in.

+
+
Returns
+

The status of the operation +Success - object was removed from all sets

+
+
+
+ +
+
+remove_from_set(self: alias_api.AlSettable, arg0: AlSet) int
+

Removes this object from the set. If the given dag +node was not found in the set, then nothing is removed.

+
+
Parameters
+

set (AlSet) – the set to remove from.

+
+
Returns
+

The status of the operation: +Success - if this object was removed successfully +InvalidArgument - set was invalid +ObjectNotAMember - if the object was not found in this set +InvalidObject - the set is invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+ +
+
+class alias_api.AlShader
+

Base object for representing shader data

+

This class encapsulates the basic functionality for checking and +setting the name of a shader as well as accessing the textures that +a particular shader refers to, and the animation on the shader. +Shader objects are accessible through both the AlUniverse class and +the objects that reference them (AlSurface and AlFace classes).

+

A shader object may reference textures. The first_texture() and +next_texture() methods are used to access these textures.

+

first_texture() returns the first texture that the shader object +references. next_texture() moves from a given referenced texture +to the next texture in order, as related to the shader object. +(See the similar methods for the AlTexture/AlEnvironment classes.)

+

The animation on a shader can be accessed through the +first_channel() and next_channel() methods. All the channels on the +shader can be deleted by calling deleteAnimation().

+

The shader parameters can be accessed through the parameter() and +setParameter() methods. Each shader has a specific set of parameters +that are valid for it that depend on its type. The full list of +shader parameters can be seen in the file AlShadingFields.h. For example, +all parameters specific to the Blinn shader have names of the form +kFLD_SHADING_BLINN_*. Parameters common to all shaders have the form +kFLD_SHADING_COMMON_*. All parameters are treated as doubles even +though this may not necessarily be what they are. This is done to +make the interface as simple and consistent as possible.

+
+
+add_texture(self: alias_api.AlShader, field_name: str, texture_name: str) Tuple[int, alias_api.AlTexture]
+

Add a texture to the field of the AlShader.

+
+ +
+
+apply_iterator_to_textures(self: alias_api.AlShader, iter: AlIterator, retcode: int) int
+

Applies the given AlIterator to all textures of this shader. The second argument will be set to the return value of the last application of the iterator’s function.

+
+ +
+
+copy_object(self: alias_api.AlShader) alias_api.AlShader
+

Copy this AlShader object and return the new object, or None if the copy operation failed.

+
+ +
+
+copy_wrapper(self: alias_api.AlShader) alias_api.AlObject
+

Return an exact duplicate of this AlShader wrapper.

+
+ +
+
+create(self: alias_api.AlShader) int
+

Initialize and allocate space for the AlShader and add it to the global list of shaders in the Alias Universe.

+
+ +
+
+delete_object(self: alias_api.AlShader, force: bool = False) int
+

Delete the AlObject from the Alias Universe and return the status of the performed operation.

+
+ +
+
+fields(self: alias_api.AlShader) List[alias_api.AlShadingFields]
+

return a list of all the fields used by the texture.

+
+ +
+
+first_texture(self: alias_api.AlShader) alias_api.AlTexture
+

Return the first texture under this shader.

+
+ +
+
+get_assigned_nodes(self: alias_api.AlShader) List[alias_api.AlDagNode]
+

Return the list of AlDagNodes that are assigned to this AlShader.

+
+
Returns
+

The list of dag nodes

+
+
Return type
+

list<AlDagNode>

+
+
+
+ +
+
+is_assigned(self: alias_api.AlShader, node: alias_api.AlDagNode) bool
+

Return True if the node is assigned to the shader, else False.

+
+ +
+
+is_used(self: alias_api.AlShader) int
+

Return True if the AlShader is being used by another object.

+
+ +
+
+mapped_fields(self: alias_api.AlShader) List[str]
+

return a list of all the mapped fields used by the shader.

+
+ +
+
+property name
+

Get or set the unique identifying name property.

+
+ +
+
+next_texture(self: alias_api.AlShader, cur_texture: alias_api.AlTexture) alias_api.AlTexture
+

Get the next texture under this shader.

+
+ +
+
+parameter(self: alias_api.AlShader, parameter_name: alias_api.AlShadingFields) Tuple[int, float]
+

Finds the value of a given texture field.

+
+ +
+
+remove_texture(self: alias_api.AlShader, field_name: str) int
+

Remove the texture from the field of the AlShader.

+
+ +
+
+set_parameter(self: alias_api.AlShader, parameter_name: alias_api.AlShadingFields, value: float) int
+

Changes the value of the texture field.

+
+ +
+
+property shading_model
+

Get or set the shading model property.

+
+ +
+
+type(self: alias_api.AlShader) alias_api.AlObjectType
+

Return the shader type identifier.

+
+ +
+ +
+
+class alias_api.AlShadingFields
+

Types for shader methods.

+

Members:

+
+

CommonColorB

+

ChromeFloorColorG

+

CommonTransparencyShade

+

CommonColorR

+

CommonColorG

+

CommonTransparencyG

+

BallBottom

+

HighlightMax

+

SCloudLevelMax

+

FogMazAltitude

+

MasterLightAOContrast

+

BlinnSpecularR

+

CommonIncandescentB

+

HighlightHLDirectionY

+

SkySunsetBrightnessB

+

SFileRatio

+

ShaderGlowGlowColorR

+

StencilValRange

+

CommonIncandescentR

+

GridVWidth

+

SkySunsetBrightnessR

+

ShaderGlowGlowColorB

+

CommonTextureInvert

+

FogAMult

+

BlinnDiffuse

+

GraniteCellSize

+

CommonTransparencyB

+

BlinnReflectivity

+

BlinnSpecularG

+

CommonTransparencyR

+

CommonIncandescentG

+

SkySunsetBrightnessG

+

CommonUseBackgroundColor

+

CommonRefractiveIndex

+

CommonReflectionLimit

+

LambertDiffuse

+

SkyCloudThreshold

+

CommonPsysSpeedDecay

+

CommonTextureAlphaOffset

+

CommonRefractionSamples

+

FogDepthB

+

CommonRefractionLimit

+

StencilKeyMasking

+

CommonShadowLevelLimit

+

PhongSpecularG

+

CommonRespectReflectionMap

+

SWoodRandomness

+

RampHueNoiseFrequency

+

SFractalLevelMin

+

CommonTextureVCoverage

+

PhongDiffuse

+

SWoodLayerSize

+

BlinnGloss_

+

FogColumn

+

SMarbleRatio

+

CommonPsysBolbNoise

+

PhongSpecularR

+

PhongSpecularB

+

SkyAirDensity

+

ChromeGridWidthOffset

+

CommonPsysUnused

+

PhongReflectivity

+

PhongShinyness

+

ShaderGlowGlowRadialNoise

+

BlinnSpecularB

+

CommonPsysHairLengthMax

+

BlinnSpecularRolloff

+

LeatherCreaseColorG

+

BlinnEccentricity

+

BackgroundColorR

+

CommonFillColorB

+

ChromeLightColorR

+

SWoodFillerColorB

+

BackgroundColorG

+

RampNoise

+

CommonShadingMap_

+

ChromeLightColorG

+

BackgroundColorB

+

CommonFillColorR

+

TextureActive

+

ChromeLightColorB

+

SWoodFillerColorR

+

CommonTextureUCoverage

+

FogColorR

+

FogColorG

+

FogColorB

+

CommonPsysSurfaceShading

+

CommonConcentRatio_

+

FogDepthR

+

StencilThreshold

+

CubeBackImage_

+

FogAOffset

+

FogDepthG

+

CommonTextureAlphaMult

+

FilerType

+

FogMinAltitude

+

MountainSnowDropOff

+

CommonTextureRGBOffsetR

+

FogFogType

+

SCloudColor2R

+

CommonTranslucenceDepth

+

CommonTextureRGBMultR

+

SCloudColor2G

+

CommonTextureRGBMultG

+

SCloudColor2B

+

CommonTextureRGBMultB

+

CommonTextureRGBOffsetG

+

CommonTextureUOffset

+

CommonTextureRGBOffsetB

+

CommonTextureBlurMult

+

CommonPsysBranchAngle

+

CommonPsysRenderType

+

CommonTextureBlurOffset

+

SMarbleContrast

+

CommonTextureRotate

+

CommonTextureURepeat

+

ShaderGlowHaloTyoe

+

CommonTextureMirror

+

CommonTextureVRepeat

+

SFractalAmplitude

+

ClothVThreadColorR

+

CommonTextureVOffset

+

CommonTextureUnused

+

ShaderGlowAutoExposure_

+

ClothVThreadColorB

+

CommonTextureUTranslate

+

CommonTextureVTranslate

+

CommonTextureUWrap

+

CommonTextureVWrap

+

BulgeUWidth

+

SCloudCenterThreshold

+

WaterSmoothness

+

CommonPsysColorG

+

BulgeVWidth

+

GridFillerColorR

+

BallInclination

+

ClothUWave

+

SMarbleLevelMax

+

BallElevation

+

WaterWindU

+

BallEyeSpace

+

BallReflect

+

ChromeGRidWidth

+

RampSatNoise

+

GroundPlaneShadowTransparency_

+

BallSkyRadius

+

ChromeLightWidth

+

MountainRockRoughness

+

GraniteDensity

+

BallTop

+

BallLeft

+

SMarbleLevelMin

+

BallRight

+

BallFront

+

CommonPsysHairLengthMin

+

BallBack

+

CheckerColor1R

+

CheckerColor1G

+

SynWallElasticity

+

CheckerColor1B

+

CheckerColor2R

+

CheckerColor2G

+

RampValNoiseFrequency

+

CheckerColor2B

+

StencilPositiveKey

+

CommonPsysFriction

+

CheckerContrast

+

ClothUThreadColorR

+

ClothUThreadColorG

+

ClothUThreadColorB

+

SFractalLevelMaz

+

ClothVThreadColorG

+

ClothGapColorR

+

WaterRipplePhaseVelocity

+

WaterVMin

+

SkySunHaloBrightnessB

+

ClothGapColorG

+

SkySunHaloBrightnessG

+

ShaderGlowGlowStarLevel

+

ClothGapColorB

+

CommonTextureStagger

+

ClothUThreadWidth

+

SkySkySamples

+

ClothVThreadWidth

+

ClothVWave

+

SMarbleFillerColorR

+

ClothRandomness

+

FogDensityMap_

+

SRockColor2R

+

CommonPsysTransparencyMethod

+

ClothWidthSpread

+

ClothBrightnessSpread

+

ChromeSkyColorR

+

ChromeZenithColorG

+

GraniteColor2G

+

DynTurbTimeResolution

+

ChromeSkyColorG

+

ChromeZenithColorR

+

GridLineColorB

+

GraniteColor2R

+

ChromeSkyColorB

+

GridLineColorG

+

WaterUMax

+

FractalAnimated

+

ChromeZenithColorB

+

GridLineColorR

+

GraniteColor2B

+

SWoodXRipples

+

SMarbleXRipples

+

ChromeLightWidthMulti

+

ChromeLightWidthOffset

+

LeatherDensity

+

ChromeLightDepth

+

HighlightHLDirectionZ

+

ChromeLightDepthMult

+

ShaderGlowGlowType

+

CommonFillColorG

+

GeometryScale

+

ChromeLightDepthOffset

+

SWoodFillerColorG

+

ChromeFloorColorR

+

CommonPsysSize

+

ChromeFloorColorB

+

ChromeHorizonColorR

+

StencilColorKeyB

+

ChromeHorizonColorG

+

CommonPsysBlobLighting

+

SWoodAge

+

ChromeHorizonColorB

+

StencilColorKeyR

+

ChromeGridColorR

+

ChromeGridColorG

+

ChromeGridColorB

+

ChromeRealFloor

+

ChromeGridWidthMult

+

ChromeGridDepth

+

ShaderGlowGlowColorG

+

ChromeGridDepthMult

+

ChromeGridDepthOffset

+

WaterRippleSpreadStart

+

FractalAmplitude

+

CurvatureMin

+

MasterLightColorB

+

CurvatureMax

+

FractalThreshold

+

FractalRatio

+

FractalLevelMin

+

SCloudXRipples

+

LensEffectFilterB

+

SphereShearU

+

CommonFogActive

+

FractalLevelMax

+

FractalTime

+

GridFillerColorG

+

DynTurbIntensity

+

GridFillerColorB

+

CommonPsysAttraction

+

GridUWidth

+

WaterReflectionBoundary

+

GridContrast

+

HighlightMin

+

SCloudLevelMin

+

ShaderGlowHaloLensFlare

+

HighlightHLDirectionX

+

MountainSnowColorR

+

NoiseAmplitude

+

SFractalThreshold

+

RampRampColor_

+

MountainSnowColorG

+

MountainSnowColorB

+

SMarbleZRipples

+

SkySunBrightnessG

+

MountainRockColorR

+

WaterRippleTime

+

CommonContrast_

+

MountainAmplitude

+

CommonPsysSpeedRange

+

MountainSnowRoughness

+

MountainBoundaryRoughness

+

CommonGlowIntensity

+

CommonPsysIncandescenceG

+

MountainSnowAltitude

+

GraniteColor1B

+

GraniteFillerColorG

+

WaterSubFrequency

+

MountainSnowMaxSlope

+

ToneMappingExposure_

+

MountainSnowLevelMax

+

NoiseThreshold

+

NoiseAnimated

+

CubeRightImage_

+

DynBackOffset

+

NoiseTime

+

WaterAmplitude

+

CommonPsysBlobThreshold

+

RampUWave

+

RampVWave

+

RampNoiseFrequency

+

CommonPsysBlurQuality

+

DynFloorOffset

+

RampHueNoise

+

RampValNoise

+

CommonPsysGrowMethod

+

RampSatNoiseFrequency

+

DynTurbSpaceResolution

+

SCloudColor1R

+

ToneMappingSaturation_

+

SCloudColor1G

+

SCloudColor1B

+

SCloudContrast

+

ShaderGlowHaloColorG

+

SCloudSoftEdges

+

SCloudTransparencyRange

+

SCloudEdgeThreshold

+

SnowThreshold

+

ShaderGlowHaloColorR

+

SCloudAmplitude

+

SCloudRatio

+

SnowSurfaceColorR

+

SCloudYRipples

+

RampInterpolation

+

CommonPSysBlobMap_

+

GraniteSpottyness

+

SCloudZRipples

+

SFractalRatio

+

SFractalXRipples

+

SFractalYRipples

+

SFractalZRipples

+

SkyCloudBrightnessR

+

WaterFrequency

+

LeatherCellSize

+

ShaderGlowGlowSpread

+

CommonTextureOverlap_

+

DynTurbRougness

+

SkyTotalBrightness

+

SkySunBrightnessR

+

SkySunBrightnessB

+

SkySunHaloBrightnessR

+

CommonPsysMotionType

+

SkySunElevation

+

BackgroundBackdrop_

+

SkySunAzimuth

+

SFileYAmplitude

+

SkySunSize

+

SkySunBlur

+

LeatherCellColorR

+

SkySkyBrightnessR

+

SkySkyBrightnessG

+

SFileZRipples

+

StencilSatRange

+

SkySkyBrightnessB

+

SkyDustDensity

+

ShaderGlowQuality

+

SkySkyThickness

+

SkySkyRadius

+

LightTunnelNumberBands

+

SkyHasFloor

+

SkyFloorTextureR

+

SkyFloorTextureG

+

GraniteThreshold

+

SkyFloorTextureB

+

SkyCloudBrightnessG

+

LightTunnelBandwidth

+

SkyCloudBrightnessB

+

SphereShearV

+

SkyCloudDensity

+

SkyCloudPower

+

SkyCloudAltitude

+

CommonPsysDiffusionMethod

+

SkyCloudHaloSize

+

SkyFloorSamples

+

SkyCloudSamples

+

SMarbleFillerColorG

+

StencilEdgeBlend

+

SWoodGrainSpacing

+

StencilMaskLevel

+

StencilMaskBlur

+

StencilColorKeyG

+

StencilHueRange

+

CommonPsysIncandescenceR

+

CommonDisplacement_

+

GraniteFillerColorR

+

SFileXAmplitude

+

WaterUMin

+

SFileLevelMin

+

CommonPsysBendV

+

SFileLevelMax

+

SnowThickness

+

CommonTextureChordLength

+

SFileXRipples

+

SFileYRipples

+

SMarbleFillerColorB

+

SMarbleVienColorR

+

SMarbleVienColorG

+

SMarbleVienColorB

+

SMarbleVienWidth

+

SnowDepthDecay

+

ShaderGlowRotation

+

SMarbleDiffusion

+

MasterLightIntensity

+

CommonPsysSplitTime

+

SMarbleAmplitude

+

SMarbleYRipples

+

SnowColorR

+

CommonTextureBlend

+

GroundPlaneShadowBlur_

+

SnowColorG

+

SnowColorB

+

ShaderGlowGlowOpacity

+

CurvatureScale_

+

CommonTextureNotUsed

+

SnowSurfaceColorG

+

SRockDiffusion

+

SnowSurfaceColorB

+

SphereFlip

+

DynLeft

+

ShaderGlowGlowIntensity

+

SRockColor1R

+

CommonPsysHairStiffness

+

SRockColor1G

+

SRockColor1B

+

LeatherThreshold

+

CommonTranslucence

+

SRockColor2G

+

SRockColor2B

+

SRockMixRatio

+

SRockGrainSize

+

SFileStagger

+

LeatherCellColorG

+

LeatherCellColorB

+

LeatherCreaseColorR

+

LeatherCreaseColorB

+

LeatherSpotyness

+

LeatherRandomness

+

LeatherCreases

+

GraniteColor1R

+

CommonPsysIncandescenceB

+

GraniteColor1G

+

GraniteFillerColorB

+

LightTunnelVisible

+

GraniteColor3R

+

CommonPsysParentShading

+

CubeCrossImage_

+

GraniteColor3G

+

CommonPropsDensity

+

GraniteColor3B

+

GraniteMixRatio

+

LensEffectFilterR

+

CubeTopImage_

+

GraniteRandomness

+

CommonTextureSmearMap_

+

GraniteCrease

+

SWoodVeinColorR

+

SWoodVeinColorG

+

SWoodVeinColorB

+

ShaderGlowRadialNoiseFrequency

+

SWoodVeinSpread

+

SWoodGrainColorR

+

SWoodGrainColorG

+

SWoodGrainColorB

+

WaterWindV

+

SWoodGrainContrast

+

SWoodCenterU

+

SWoodCenterV

+

SWoodXAmplitude

+

SWoodYAmplitude

+

DynLeftOffset

+

SWoodRatio

+

ShaderGlowStarPoints

+

CommonPsysCollisionMethod

+

SWoodLevelMin

+

SWoodLevelMax

+

CommonPsysTimeRandom

+

LensEffectFilmGrain

+

SWoodYRipples

+

SWoodZRipples

+

WaterRippleSpreadRate

+

CommonPSysParticle_File_

+

VolumeFrom

+

VolumeTo

+

CurvatureRepeats

+

ShaderGlowHaloRadialNoise

+

WaterNumWaves

+

WaterWaveTime

+

WaterWaveVelocity

+

WaterRippleDropSize

+

WaterRippleFrequency

+

RampIntensity_

+

WaterRippleAmplitude

+

WaterRippleUOrigin

+

WaterRippleVOrigin

+

DynTurbPersistance

+

WaterRippleGroupVelocity

+

WaterVMax

+

CommonHideGlowSource

+

CommonPropsFriction

+

CommonSurfaceWidth

+

CommonTransparencyDepth

+

CommonChromaticAberration

+

CommonRefractionJitter

+

CommonUseFillerColor

+

CommonLineThickness

+

CommonUPatchLines

+

CommonVPatchLines

+

CommonTextureWrap

+

RampType

+

SFileProjection

+

DynTurbGranularity

+

HighlightRepeats

+

FileUseExtension

+

FileFrameExtension

+

SphereSourceTexture_

+

ShaderGlowThredhold

+

ShaderGlowGlowEccentricity

+

ShaderGlowHaloColorB

+

ShaderGlowHaloSpread

+

ShaderGlowHaloEccentricity

+

ShaderGlowHaloStarLevel

+

LensEffectFilterG

+

MasterLightColorR

+

MaterLightColorG

+

CommonOpacityDepth

+

CommonPsysEmission

+

CommonPsysGlowIntensity

+

CommonPsysLifespanMin

+

CommonPsysColorR

+

CommonPsysColorB

+

CurvatureType_

+

CommonPsysTransparencyR

+

CommonPsysTransparencyG

+

GeometrySourceTexture

+

CommonPsysTransparencyB

+

DynFrontOffset

+

CommonPsysTranslucence

+

CommonPsysBolbNoiseFrequency

+

CommonPsysDensity

+

CommonPsysSizeRange

+

CommonPsysBuoyancy

+

GeometryType

+

CommonPsysMass

+

CommonPsysStartFrame

+

CommonPsysElasticity

+

CommonPsysAtomsPerSec

+

CommonPsysSpeed

+

CommonPsysLifespanMax

+

CommonPsysRandomization

+

CommonPsysBlurLength

+

CommonPsysCollisions

+

CommonPsysCycles

+

FileImage_

+

CommonPsysNoiseAspect

+

CommonPsysNumChildren

+

CommonPsysBendU

+

CommonPsysCurl

+

CommonPsysEndFrame

+

CommonPsysUseParticleFile

+

CommonPsysHairSegments

+

CommonPropsPropMass

+

CommonPropsElasticity

+

CommonPropsDragCoeff

+

DynGravity

+

DynAitDensity

+

DynForceScale

+

DynTimeScale

+

DynFloor

+

DynCeiling

+

DynCeilingOffset

+

DynRight

+

DynRightOffset

+

DynTurbVariability

+

DynFront

+

DynBack

+

CommonPSysDiffusionRate_

+

DynTurbType

+

DynTurbSpread

+

DynTurbAnimated

+

DynWallFriction

+

CommonMatteObject

+

FogMinDistance

+

FogMaxDistance

+

Cache

+

CommonReflectBackground

+

ShaderGlowHaloIntensity

+

TransparencyMaterialCode

+

ClearCoatActive

+

ClearCoatIndex

+

ClearCoatScale

+

ClearCoatBias

+

CommonPSysStartFrame_

+

ClearCoatMaterialCode

+

LightTunnelEnable

+

LightTunnelIntensity

+

PhongGloss_

+

LightTunnelColorR

+

LightTunnelBandFringe

+

GeometryRotate

+

GeometryHeight

+

CommonBump_

+

CommonEmitParticles_

+

CommonRefractiveMaterial_

+

CommonPSysPresent_

+

CommonPSysUseFile_

+

CommonPSysMotionType_

+

CommonPSysEndFrame_

+

CommonPSysHairLengthMap_

+

CommonPSysDiffusion_

+

CommonPSysCollisions_

+

CommonPSysHitMethod_

+

PhongSpecularity_

+

PhongReflection_

+

BlinnSpecularity_

+

BlinnReflection_

+

ClearCoarMaterial_

+

BackgroundSequence_

+

ToneMappingGamma_

+

GroundPlanePreview_

+

GroundPlaneHeight_

+

GroundPlaneShadows_

+

GroundPlaneShadowPosition_

+

GroundPlaneReflection_

+

GroundPlaneReflectivity_

+

GroundPlaneReflectionDepth_

+

GroundPlaneReflectionBlur_

+

GroundPlaneReflectionBlurDepth_

+

CommonTextureColorRemap_

+

RampPosition_

+

StencilImage_

+

StencilMask_

+

CubeFiniteSize_

+

SubeCrossOrientation_

+

BallImage_

+

SkyCloudTexture_

+

SFileSourceTexture_

+

CurvatureDisplay_

+

IBLReflectionMap_

+

IBLReflectionMapRotation_

+

VolumePixSequence_

+

CubeLeftImage_

+

CubeBottomImage_

+

CubeFrontImage_

+

CommonVREDMaterialTag_

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlShell
+

Interface to Alias nurbs surface geometry.

+

A shell is a collection of surfaces which behave as a single object. +Each surface can have its own set of trim curves. A cube with six +square sides is a shell. +The cube can be assigned a single shader and rendering formation. +The cube is made of a collection of 6 spline surfaces.

+

The AlTrimRegions are inaccurately named. +They actually represent the surfaces in the shell.

+
+
+assign_shader(self: alias_api.AlShell, shader: AlShader) int
+

Assign the given shader to the surface.

+

If the surface already has shaders they will be removed from the surface. The surface +must have a surface node for this method to succeed.

+
+
Parameters
+

shader (AlShader) – the shader which will be assigned to the surface.

+
+
Returns
+

The status code result +Success - the shader was successfully assigned to the surface. +InvalidArgument - ‘shader’ was invalid +Failure - the shader was not created. +InvalidObject - the surface is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlShell) alias_api.AlObject
+

Return an exact duplicate of this AlShell wrapper.

+
+ +
+
+first_shader(self: alias_api.AlShell) AlShader
+

Return the first shader that this surface object references. Return None if there are no shaders.

+
+ +
+
+get_layered_shader(self: alias_api.AlShell) AlLayeredShader
+

Return the attached layered shader.

+
+ +
+
+get_switch_shader(self: alias_api.AlShell) AlSwitchShader
+

Return the attached switch shader.

+
+ +
+
+layer_shader(self: alias_api.AlShell, shader: AlShader) int
+

Layers the given shader on the surface.

+

The surface must have a surface node for this method to succeed.

+
+
Parameters
+

shader – the shader which will be layered on the surface.

+
+
Tye shader
+

AlShader

+
+
Returns
+

The status code result +Success - the shader was successfully layered on the surface. +InvalidArgument - ‘shader’ was invalid +Failure - the shader was not created. +InvalidObject - the surface is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+next_shader(self: alias_api.AlShell, shader: AlShader) AlShader
+

Return the shader after the given shader in the object’s shader list.

+

Return None if there isn’t a next shader. Specifying None as parameter will return the first shader.

+
+
Parameters
+

shader (AlShader) – the shader to get the next one from

+
+
Returns
+

The next shader

+
+
Return type
+

AlShader

+
+
+
+ +
+
+shell_node(self: alias_api.AlShell) AlShellNode
+

Return the AlShellNode for this surface.

+
+ +
+
+type(self: alias_api.AlShell) alias_api.AlObjectType
+

Return the AlShell type identifier.

+
+ +
+ +
+
+class alias_api.AlShellNode
+

Dag node class for shells.

+

This method provides DagNode level access to Shells. Use the shell +method to get the actual AlShell underneath this DagNode.

+
+
+copy_wrapper(self: alias_api.AlShellNode) alias_api.AlObject
+

Return an exact duplicate of this AlShellNode wrapper.

+
+ +
+
+shell(*args, **kwargs)
+

Overloaded function.

+
    +
  1. shell(self: alias_api.AlShellNode) -> alias_api.AlShell

  2. +
+

Return a pointer to the shell data structure which can be used to access the geometry of the shell.

+
    +
  1. shell(self: alias_api.AlShellNode, arg0: alias_api.AlTM) -> alias_api.AlShell

  2. +
+

Return a pointer to the shell data structure which can be used to access the geometry of the shell. The AlTM will be updated with the shell’s transformation matrix.

+
+ +
+
+type(self: alias_api.AlShellNode) alias_api.AlObjectType
+

Return the AlShellNode type identifier.

+
+ +
+ +
+
+class alias_api.AlSpacePoint
+

Interface to Alias space points.

+

AlSpacePoint is the interface to Alias Space points. A space point can +be created at any point in the world coordinate system. There are methods to +query and modify the position of the point in this class.

+
+
+copy_wrapper(self: alias_api.AlSpacePoint) alias_api.AlObject
+

Return an exact duplicate of this AlSpacePoint wrapper.

+
+ +
+
+create(self: alias_api.AlSpacePoint, x: float, y: float, z: float) int
+

Create an AlSpacePoint at the given coordinates.

+
+ +
+
+type(self: alias_api.AlSpacePoint) alias_api.AlObjectType
+

Return the AlSpacePoint type identifier.

+
+ +
+ +
+
+class alias_api.AlStatusCode
+

Resulting operation status codes

+

Members:

+
+

NameChangedToUniqueOne

+

Success

+

AlreadyCreated

+

Failure

+

ExprParseError

+

CannotDelete

+

InsufficientMemory

+

InvalidArgument

+

NoProjectEnvironment

+

NoParent

+

RenameStageFailure

+

ExprNotValidRelative

+

InvalidObject

+

InvalidWireFile

+

ObjectInSet

+

ObjectInAnotherSet

+

ExprBadVariable

+

ObjectInExclusiveSet

+

ExprNotValidName

+

ObjectAncestorInSet

+

ObjectDescendentInSet

+

ObjectNotAMember

+

ExprNotDagObject

+

ExprNotValidCV

+

ExprNotValidParameter

+

DeleteStageFailure

+

ExprAxInsertCircRef

+

ExprAxInsertBadRef

+

ExprAxInsertSelfRef

+

SetStageFailure

+

AlreadyTrimmed

+

ObjectNotFound

+

NotAvailable

+

ObjectAlreadyPresent

+

EndOfGlobalCodes

+

InvalidWindowType

+

EndOfAlStatusCodes

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlStoreOptions
+

A structure used to transfer options that control the store() method.

+

An AlStoreOptions structure is used set or determine the options +that the store() method uses to tailor the export +of files.

+

To avoid setting all of the fields of AlStoreOptions using +set_store_options(), it is recommended that the +current values be acquired first using store_options().

+
+ +
+
+class alias_api.AlSurface
+

Interface to Alias nurbs surface geometry.

+

AlSurface is the interface to the geometric data of Alias’ NURBS +surface objects. To create a surface, first instantiate and create +an AlSurface and then instantiate and create an AlSurfaceNode. There +is only a limited amount that you can do with an AlSurface that does +not have an AlSurfaceNode.

+

For more information on how to create the surface geometry, see the +description for the create() method.

+

The method is_construction_history_resulting_surface() is used to +find out if a surface may be modified based on changes to +its constructor objects.

+

A NURBS surface is described as having two dimensions u and v. +Many of the surface properties (form, multiplicity, etc.) are the +same as a NURBS curve but are expressed in both the u and +v direction.

+

The form of a surface in the u or v direction can be one of three types: +periodic, closed or open. If a surface is “kPeriodic” in u, then +it is tangent continuous in u at all points in that direction. +If a surface is “Closed” in u, it is not periodic but its +edges in the u direction are coincident. If the surface +is neither closed nor periodic in u, it is considered to be “Open”. +The same applies in the v direction.

+

There are two ways to delete an AlSurface. If the AlSurface +delete_object() is called, the attached AlSurfaceNode is +deleted. If the AlSurfaceNode delete_object() is called, the attached +AlSurface is deleted.

+

You should always create a surface node for a surface. If you +create a surface with no surface node, then the surface is not +added to the universe. If you should lose the pointer to the +the surface, it will become lost memory.

+

There is one limitation to this class: you cannot add or remove +individual CV’s (except by changing multiplicity).

+

If an AlSurface has curves-on-surface, then you can get a pointer +to the first curve-on-surface and then traverse the curves using +methods in the class AlCurveOnSurface.

+

If an AlSurface is trimmed, the trim regions on the surface can be +accessed using the first_trim_region() method and then traversed +using methods in the class AlTrimRegion.

+

All AlSurface objects will have at least one shader attached to them. +These can be accessed through the first_shader() and next_shader() methods.

+

All AlSurface objects have render information attached to them. +The AlRenderInfo structure can be used to query the surface’s +render parameters.

+

Surfaces are made of surface control points (or CV’s) which you +traverse as a list by using the first_cv() in conjunction with the +AlSurfaceCV methods. You can also pack the surface information +into an array using methods in this class.

+

What is multiplicity?

+

An AlSurfaceCV object can actually represent multiple CV’s, depending +on the AlSurfaceCV’s multiplicity and periodicity. Notice that in +this class there are two sets of methods - some “incl_multiples” +and some not (namely “number_of_cvs”, “cvs_world_position”, +“cvs_unaffected_position”, etc). The set of methods without +multiplicity lets you get all surface CV’s where a surface CV can have +multiplicity of 1, 2 or 3. The set of methods “incl_multiples” +lets you get ALL surface CV’s including multiples due to a multiplicity +> 1 and due to periodicity.

+

Example 1:

+

Create a surface in the interactive Alias package with +16 CV’s, and pick the CV which is 2nd in the +u direction and 2nd in the v direction. Set the multiplicity +of this CV to 3 in the u direction and 2 in the v direction (using +the “multiplicity” menu item in the Curve Tools menu). Then:

+
+
    +
  1. number_of_cvs() will return 4. number_of_cvs() will return 4.

  2. +
  3. cvs_world_position must be passed a 4x4x4 CVs matrix, and +the u and v multiplicity vectors must each be of length 4.

  4. +
  5. cvs_unaffected_position() must be passed the same as item 2.

  6. +
  7. set_cvs_unaffected_position() must be passed the same as item 2.

  8. +
  9. number_of_cvs_incl_multiples() will return 6. +number_of_cvs_incl_multiples() will return 5.

  10. +
  11. cvs_world_position_incl_multiples() must be passed a 6x5x4 CVs matrix.

  12. +
+
+

You will notice that in this matrix there are duplicate CVs +to indicate multiples due to mutiplicity > 1 and periodicity.

+
+
    +
  1. cvs_unaffected_position_incl_multiples() must be passed the same as item 6.

  2. +
+
+

You will notice that in this matrix there are duplicate CVs +to indicate multiples due to mutiplicity > 1 and periodicity.

+
+
    +
  1. set_cvs_unaffected_position_incl_multiples() must be passed the

  2. +
+
+

same as item 6. +Similar to items 6 and 7, you should put duplicate CVs +to account for multiples although this is not mandatory. +You may want to refer to the examples in the AlCurve class +description. The way CVs are ignored also applies to this method.

+
+
+

Example 2:

+

If you create a surface in the interactive Alias +package with 16 CV’s and “close” the surface in the u direction +(using the “close” menu item in the Object Tools menu), you +create a periodic surface. Then:

+
+
    +
  1. number_of_cvs() will return 4. number_of_cvs() will return 4.

  2. +
+

2. cvs_world_position must be passed a 4x4x4 CVs matrix, and +the u and v multiplicity vectors must each be of length 4. +3. cvs_unaffected_position() must be passed the same as item 2. +4. set_cvs_unaffected_position() must be passed the same as item 2. +5. number_of_cvs_incl_multiples() will return 7. +number_of_cvs_incl_multiples() will return 4. +6. cvs_world_position_incl_multiples() must be passed a 7x4x4 CVs matrix. +7. cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +8. set_cvs_unaffected_position_incl_multiples() must be passed the +same as item 6. +Similar to items 6 and 7, you should put duplicate CVs +to account for multiples although this is not mandatory. +You may want to refer to the examples in the AlCurve class +description. The way CVs are ignored also applies to this method.

+
+

How do I process a matrix of CV’s?

+

Methods in this class store CV’s in the V direction first, then +in the U direction. Here’s an example of how to get the world +positions of the CV’s of a surface and print them out in +V direction then U direction. (Notice that the outer “for” loop +uses the number of CV’s in the U direction).

+
+
+assign_shader(self: alias_api.AlSurface, shader: AlShader) int
+

Assign the given shader to the surface.

+

If the surface already has shaders they will be removed from the surface. The surface +must have a surface node for this method to succeed.

+
+
Parameters
+

shader (AlShader) – the shader which will be assigned to the surface.

+
+
Returns
+

The status code result +Success - the shader was successfully assigned to the surface. +InvalidArgument - ‘shader’ was invalid +Failure - the shader was not created. +InvalidObject - the surface is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+copy_wrapper(self: alias_api.AlSurface) alias_api.AlObject
+

Return an exact duplicate of this AlSurface wrapper.

+
+ +
+
+create_sphere(self: alias_api.AlSurface, center: alPyMath::Vec3, radius: float) int
+

Create a spherical surface from an origin point and a radius.

+
+ +
+
+delete_object(self: alias_api.AlSurface) int
+

Delete the AlSurface from the Alias Universe and return the status of the performed operation.

+
+ +
+
+first_shader(self: alias_api.AlSurface) AlShader
+

Return the first shader that this surface object references. Return None if there are no shaders.

+
+ +
+
+get_curves_on_surface(self: alias_api.AlSurface) List[alias_api.AlCurveOnSurface]
+

Return a list of curve on surface nodes.

+
+ +
+
+get_layered_shader(self: alias_api.AlSurface) AlLayeredShader
+

Return the attached layered shader.

+
+ +
+
+get_shaders(self: alias_api.AlSurface) List[AlShader]
+

Return a list of shaders.

+
+ +
+
+get_switch_shader(self: alias_api.AlSurface) AlSwitchShader
+

Return the attached switch shader.

+
+ +
+
+is_construction_history_resulting_surface(self: alias_api.AlSurface) int
+

Returns True if this surface is the resulting surface of a construction history operation, else False.

+
+ +
+
+layer_shader(self: alias_api.AlSurface, shader: AlShader) int
+

Layers the given shader on the surface.

+

The surface must have a surface node for this method to succeed.

+
+
Parameters
+

shader – the shader which will be layered on the surface.

+
+
Tye shader
+

AlShader

+
+
Returns
+

The status code result +Success - the shader was successfully layered on the surface. +InvalidArgument - ‘shader’ was invalid +Failure - the shader was not created. +InvalidObject - the surface is invalid

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+property name
+

Get or set the AlSurface name.

+
+ +
+
+next_shader(self: alias_api.AlSurface, shader: AlShader) AlShader
+

Return the shader after the given shader in the object’s shader list.

+

Return None if there isn’t a next shader. Specifying None as parameter will return the first shader.

+
+
Parameters
+

shader (AlShader) – the shader to get the next one from

+
+
Returns
+

The next shader

+
+
Return type
+

AlShader

+
+
+
+ +
+
+surface_node(self: alias_api.AlSurface) AlSurfaceNode
+

Return the surface node for this surface. Return None if there is no surface node attached.

+
+ +
+
+type(self: alias_api.AlSurface) alias_api.AlObjectType
+

Return the AlSurface type identifier.

+
+ +
+ +
+
+class alias_api.AlSurfaceNode
+

Dag node class for nurbs surfaces.

+

AlSurfaceNode is the class used to access and manipulate +surfaces within the dag.

+

This class behaves like other dag nodes (see AlDagNode for a +description of the usage and purpose of dag nodes) +and in addition allows users to add curves on surfaces and +access the geometry of the surface via the surface() method. +The surface() method returns a pointer to an AlSurface object +which provides the user with the methods used to modify the +geometry of the surface. Surfaces can be created from scratch +by calling the AlSurfaceNode.create() method, or read in from +a wire file.

+
+
+copy_wrapper(self: alias_api.AlSurfaceNode) alias_api.AlObject
+

Return an exact duplicate of this AlSurfaceNode wrapper.

+
+ +
+
+create(self: alias_api.AlSurfaceNode, surface: alias_api.AlSurface) int
+

Allocate the dag node and geometry required for this object.

+

This method must be called once and only once before any other method and only if the +surface has been allocated by the user (e.g. not read in from a wire file). It is an +error to call this method twice or if the object has been read in from a wire file.

+
+
Parameters
+

surface (AlSurface) – The surface to create this surface node for.

+
+
Returns
+

The status code result +Success - the surface node was created +InvalidArgument - the ‘surface’ was None or invalid +Failure - the surface node was not created

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+delete_object(self: alias_api.AlSurfaceNode) int
+

Delete the AlSurfaceNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+has_history(self: alias_api.AlSurfaceNode) bool
+

Return True if the surface node’s surface has construction history.

+
+ +
+
+patch_precision(self: alias_api.AlSurfaceNode) int
+

Return the patch precision for the surface. Return -1 if the surface is invalid.

+
+ +
+
+set_patch_precision(self: alias_api.AlSurfaceNode, precision: int) int
+

Set the patch precision for the surface.

+
+
Parameters
+

precision (int) – The new patch precision (range is 2-64).

+
+
Returns
+

The status code result +Success - the patch precision was set +InvalidArgument - value for patch prevision was invalid +InvalidObject - the surface node was invalid

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+surface(*args, **kwargs)
+

Overloaded function.

+
    +
  1. surface(self: alias_api.AlSurfaceNode) -> alias_api.AlSurface

  2. +
+

Return a the surface data structure which can be used to access the geometry of the surface.

+
    +
  1. surface(self: alias_api.AlSurfaceNode, arg0: alias_api.AlTM) -> alias_api.AlSurface

  2. +
+

Return a the surface data structure which can be used to access the geometry of the surface.

+
+ +
+
+type(self: alias_api.AlSurfaceNode) alias_api.AlObjectType
+

Return the AlSurfaceNode type identifier.

+
+ +
+ +
+
+class alias_api.AlSurfacePoint
+

Interface to Alias Surface points.

+

A point can be created in the parametric space of any AlSurface. This +point can be queried for the surface normal, tangents, position in +world coordinate system, arc lengths, and curvatures. This class contains +methods for creating, and moving the surface point.

+

If the AlSurface is deleted, the surface point created on it is +automatically deleted.

+
+
+attached_to(self: alias_api.AlSurfacePoint) alias_api.AlSurfaceNode
+

Return the AlSurfaceNode this AlSurfacePoint is associated with.

+
+ +
+
+copy_wrapper(self: alias_api.AlSurfacePoint) alias_api.AlObject
+

Return an exact duplicate of this AlSurfacePoint wrapper.

+
+ +
+
+create(self: alias_api.AlSurfacePoint, surface: alias_api.AlSurface, u: float, v: float) int
+

Create an AlSurfacePoint on the given AlSurface.

+
+ +
+
+type(self: alias_api.AlSurfacePoint) alias_api.AlObjectType
+

Return the AlSurfacePoint type identifier.

+
+ +
+ +
+
+class alias_api.AlSwitchShader
+

Base object for representing shader data

+

This class encapsulates the basic functionality for checking and +setting the name of a shader as well as accessing the textures that +a particular shader refers to, and the animation on the shader. +Shader objects are accessible through both the AlUniverse class and +the objects that reference them (AlSurface and AlFace classes).

+

A switch shader object may reference shaders. The first_shader() and +next_shader() methods are used to access these textures.

+

first_shader() returns the first shader that the shader object +references. next_shader() moves from a given referenced shader +to the next shader in order, as related to the switch shader object.

+
+
+add_shader(self: alias_api.AlSwitchShader, shader: alias_api.AlShader) bool
+

Add a shader to the switch shader.

+
+ +
+
+copy_wrapper(self: alias_api.AlSwitchShader) alias_api.AlObject
+

Return an exact duplicate of this AlSwitchShader wrapper.

+
+ +
+
+create(self: alias_api.AlSwitchShader) int
+

Initialize and allocate space for the AlSwitchShader and add it to the global list of shaders in the Alias Universe.

+
+ +
+
+delete_object(self: alias_api.AlSwitchShader) int
+

Delete the Alias shader object and return the status code of the delete operation.

+
+ +
+
+get_active_shader(self: alias_api.AlSwitchShader) alias_api.AlShader
+

Return the current active shader.

+
+ +
+
+get_first_inactive_shader(self: alias_api.AlSwitchShader) alias_api.AlShader
+

Returns the first inactive shader.

+
+ +
+
+get_next_inactive_shader(self: alias_api.AlSwitchShader, cur_shader: alias_api.AlShader) alias_api.AlShader
+

get the next inactive shader.

+
+ +
+
+is_used(self: alias_api.AlSwitchShader) int
+

Returns True if the SwitchShader object is assigned to a gemoetry node, else False.

+
+ +
+
+property name
+

Get or set the AlSwitchShader name.

+
+ +
+
+remove_shader(self: alias_api.AlSwitchShader, shader: alias_api.AlShader) bool
+

Remove a shader to the switch shader.

+
+ +
+
+set_active_shader(self: alias_api.AlSwitchShader, shader: alias_api.AlShader) None
+

Set the current active shader.

+
+ +
+
+type(self: alias_api.AlSwitchShader) alias_api.AlObjectType
+

Return the AlSwitchShader type identifier.

+
+ +
+ +
+
+class alias_api.AlTM
+

Basic Interface to Alias transformation matrix.

+

This class encapsulates the functionality for creating, +manipulating and deleting Alias 4x4 transformation matrices.

+

Tranformation matrices are used to perform linear transformations +of a vector. Composite transformations are performed by multiplying +the individual transformations together.

+
+
The matrix is ordered as AlTM[y][x]:

0,0 0,1 0,2 0,3 +1,0 1,1 1,2 1,3 +2,0 2,1 2,2 2,3 +3,0 3,1 3,2 3,3

+
+
+

The transformation matrix usually takes the form:

+
+
TM = | r00 r01 r02 0 |
+
r10 r11 r12 0 |
+
r20 r21 r22 0 |
+
tx0 ty0 tz0 1 |
+
+
+
+

where tx0, ty0, tz0 are the aggregrate translations and +r(xy) is the aggregate product of rotations, scales and shears.

+

A point is transformed by considering the point to be a row vector of +4 elements and then post multiplying by the transformation matrix.

+

[x’ y’ z’ w’] = [x y z w] +| 00 01 02 03 | +| 10 11 12 13 | +| 20 21 22 23 | +| 30 31 32 33 |

+

If the w component is not specified, it is assumed to have a value of 1.

+
+
+assign(self: alias_api.AlTM, row: int, col: int, value: float) None
+

Set the AlTM matrix value at the row and column index.

+
+ +
+
+decompose(self: alias_api.AlTM) Tuple[int, List[float[3]], List[float[3]], List[float[3]], List[float[3]]]
+

Decompose the transform matrix into translate, rotate, scale and shear vectors.

+
+ +
+
+static diagonal(d0: float, d1: float, d2: float, d3: float) alias_api.AlTM
+

Return a zero matrix with diagonal values of ‘d’.

+
+ +
+
+get_tm(self: alias_api.AlTM) Tuple[int, List[List[float[4]][4]]]
+

Return the contents of the AlTM into a 4x4 array.

+
+ +
+
+static identity() alias_api.AlTM
+

Return the identity matrix.

+
+ +
+
+inverse(self: alias_api.AlTM) alias_api.AlTM
+

Return the inverse of the matrix.

+
+ +
+
+static rotate(x: float, y: float, z: float, angle: float) alias_api.AlTM
+

Return a transformation matrix to rotate counterclockwise about the axis (x, y, z).

+
+ +
+
+static rotate_x(rx: float) alias_api.AlTM
+

Return a transformation matrix to rotate about the x-axis.

+
+ +
+
+static rotate_y(ry: float) alias_api.AlTM
+

Return a transformation matrix to rotate about the y-axis.

+
+ +
+
+static rotate_z(rz: float) alias_api.AlTM
+

Return a transformation matrix to rotate about the z-axis.

+
+ +
+
+static scale(d: float) alias_api.AlTM
+

Return a transformation matrix to scale a point (x, y, z) by a constant with a value of ‘d’.

+
+ +
+
+static scale_nonp(sx: float, sy: float, sz: float) alias_api.AlTM
+

Return a transformation matrix to non-proportionally scale a point (x, y, z) by ‘sx’ in the x-axis, ‘sy’ in the y-axis, and ‘sz’ in the z-axis.

+
+ +
+
+set_tm(self: alias_api.AlTM, tm: List[List[float[4]][4]]) int
+

Copies the given 4x4 transform matrix into this AlTM.

+
+ +
+
+trans_normal(self: alias_api.AlTM, x: float, y: float, z: float) Tuple[int, float, float, float]
+

Using the transformation matrix, transform the normal (x,y,z).

+
+ +
+
+trans_point(*args, **kwargs)
+

Overloaded function.

+
    +
  1. trans_point(self: alias_api.AlTM, d: List[float[4]]) -> Tuple[int, List[float[4]]]

  2. +
+

Return the resulting point by transforming the point ‘d’ using this matrix.

+
    +
  1. trans_point(self: alias_api.AlTM, x: float, y: float, z: float, w: float) -> Tuple[int, float, float, float, float]

  2. +
+

Using the transformation matrix, transform the point (x,y,z,w).

+
    +
  1. trans_point(self: alias_api.AlTM, x: float, y: float, z: float) -> Tuple[int, float, float, float]

  2. +
+

Using the transformation matrix, transform the point (x,y,z,1).

+
+ +
+
+trans_vector(self: alias_api.AlTM, x: float, y: float, z: float) Tuple[int, float, float, float]
+

Using the transformation matrix, transform the vector (x,y,z,1).

+
+ +
+
+static translate(arg0: float, arg1: float, arg2: float) alias_api.AlTM
+

Return a transformation matrix to translate a point (x, y, z) by (tx, ty, tz).

+
+ +
+
+transpose(self: alias_api.AlTM) alias_api.AlTM
+

Return the transpose of the matrix.

+
+ +
+
+static zero() alias_api.AlTM
+

Return the zero matrix.

+
+ +
+ +
+
+class alias_api.AlTangentType
+

The type of tangent.

+

Members:

+
+

TangentSmooth

+

TangentLinear

+

TangentFlat

+

TangentStep

+

TangentSlow

+

TangentInOut

+

TangentFast

+

TangentFixed

+

TangentUnchanged

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlTessellateTypes
+

The tessellation types.

+

Members:

+
+

TessellateTriangle

+

TessellateQuad

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlTexture
+

Base object for representing texture data

+

This class encapsulates the basic functionality for checking and +setting the name of a texture as well as accessing the textures that +this texture refers to, and the animation on this texture. +These texture objects can be obtained from the AlShader class and the +AlEnvironment class.

+

A texture object itself may also reference other textures. For +this reason the first_texture() and next_texture() methods are used.

+

first_texture() returns the first texture that the texture object +references. next_texture() moves from a given referenced texture +to the next texture in order, as related to the texture object. +(See the similar methods for the AlShader/AlEnvironment classes.)

+

The animation on a texture can be accessed through the +first_channel() and next_channel() methods. All the channels on the +texture can be deleted by calling deleteAnimation().

+

The texture parameters can be accessed through the parameter() and +set_parameter() methods. Each texture has a specific set of parameters +that are valid for it that depend on its type. The full list of +texture parameters can be seen in the file AlShadingFields.h. For example, +all parameters specific to the water texture have names of the form +FLD_SHADING_WATER_*. Parameters common to all textures have the form +FLD_SHADING_COMMON_TEXTURE_*. All parameters are treated as doubles +even though this may not necessarily be what they are. This was done +to make the interface as simple and consistent as possible.

+

New AlTextures cannot be created by allocating a new AlTexture object +because an AlTexture must be associated with a shader. Use the +AlShader.add_texture() method to create the new AlTexture.

+
+
+add_texture(self: alias_api.AlTexture, field_name: str, texture_type: str) Tuple[int, alias_api.AlTexture]
+

Add a texture to the field of the AlTexture.

+
+ +
+
+copy_wrapper(self: alias_api.AlTexture) alias_api.AlObject
+

Return an exact duplicate of this AlTexture wrapper.

+
+ +
+
+field_type(self: alias_api.AlTexture) str
+

Returns a string which indicates which field of the parent object(AlShader, AlTexture, AlEnvironment) that this texture is mapped to. +Note that the returned strings are identical to the field names written out to SDL.The SDL manual gives a complete list of possible return

+
+

values for this function.

+
+
+ +
+
+fields(self: alias_api.AlTexture) List[alias_api.AlShadingFields]
+

return a list of all the fields used by the texture.

+
+ +
+
+filename(self: alias_api.AlTexture) str
+
+
If the texture is a file texture, this method returns the path and name to the image file used for

the texture. If the texture is any other type, NULL is returned.

+
+
+
+ +
+
+first_texture(self: alias_api.AlTexture) alias_api.AlTexture
+

Return the first texture.

+
+ +
+
+mapped_fields(self: alias_api.AlTexture) List[str]
+

return a list of all the fields used by the texture.

+
+ +
+
+property name
+

Get or set the AlTexture name.

+
+ +
+
+next_texture(self: alias_api.AlTexture, cur_texture: alias_api.AlTexture) alias_api.AlTexture
+

return the next texture.

+
+ +
+
+parameter(self: alias_api.AlTexture, parameter_name: alias_api.AlShadingFields) Tuple[int, float]
+

Finds the value of a given texture field.

+
+ +
+
+remove_texture(self: alias_api.AlTexture, field_name: str) int
+

Remove the texture from the field of the AlTexture.

+
+ +
+
+set_filename(self: alias_api.AlTexture, file_path: str) int
+

If the texture is a file texture, this method sets the path and name to the image file used for +the texture. If the texture is any other type, sFailure is returned. Note that the string provided +is duplicated, so you are responsible for the space allocated for the original copy.

+
+ +
+
+set_parameter(self: alias_api.AlTexture, parameter_name: alias_api.AlShadingFields, value: float) int
+

Changes the value of the texture field.

+
+ +
+
+texture_node(self: alias_api.AlTexture) AlTextureNode
+

Returns a pointer to the transformation AlTextureNode on solid textures. If the texture is +not a solid texture or there is no AlTextureNode, this method returns None.

+
+ +
+
+texture_type(self: alias_api.AlTexture) str
+

Returns a string which indicates the ‘name’ of the texture type. Note that these strings are identical to those output to SDL.

+
+ +
+
+type(self: alias_api.AlTexture) alias_api.AlObjectType
+

Return the AlTexture type identifier.

+
+ +
+ +
+
+class alias_api.AlTextureNode
+

Dag node class for solid textures.

+

AlTextureNode is the class used to access and manipulate +the transformations on solid textures within the dag. +This class behaves like other dag nodes (see AlDagNode for a +description of the usage and purpose of dag nodes) except that +you are not able to instantiate or create one.

+
+
+copy_wrapper(self: alias_api.AlTextureNode) alias_api.AlObject
+

Return an exact duplicate of this AlTextureNode wrapper.

+
+ +
+
+delete_object(self: alias_api.AlTextureNode) int
+

Delete the AlTextureNode from the Alias Universe and return the status of the performed operation.

+
+ +
+
+texture(self: alias_api.AlTextureNode) alias_api.AlTexture
+

Return the texture under this node.

+
+ +
+
+type(self: alias_api.AlTextureNode) alias_api.AlObjectType
+

Return the AlTextureNode type identifier.

+
+ +
+ +
+
+class alias_api.AlTripleComponent
+
+

The component of an action that should be extracted when evaluating a channel.

+
+

Members:

+
+

InvalidComponent

+

X_Component

+

Y_Component

+

Z_Component

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.AlWindow
+

Interface to the Alias modeling windows.

+

Alias modeling windows are the windows in which geometry information +is actually viewed and modified. These are the Top, Front, Right +and Perspective windows, as well as the SBD window. This class +allows the creation, positioning and sizing windows. You can get +the camera associated with a window. Plugins can use the mapping +functions to determine where in world space a screen event occurred.

+

AlUniverse contains methods for getting the first modeling window, +the current modeling window, and the sbd window.

+
+
+class AlViewType
+

The window view type.

+

Members:

+
+

ViewInvalid

+

Bottom

+

Back

+

ViewOther

+

Left

+

Front

+

Right

+

Sbd

+

Top

+

Perspective

+
+
+
+property name
+
+ +
+ +
+
+property camera
+

Get or set the effective camera of the modeling window.

+
+ +
+
+copy_wrapper(self: alias_api.AlWindow) alias_api.AlObject
+

Return an exact duplicate of this AlWindow wrapper.

+
+ +
+
+create(self: alias_api.AlWindow, view_type: alias_api.AlWindow.AlViewType) int
+

Create a new AlWindow object with the given view type in the Alias Universe.

+
+ +
+
+delete_object(self: alias_api.AlWindow) int
+

Delete the AlWindow from the Alias Universe and return the status of the performed operation.

+
+ +
+
+get_resolution(self: alias_api.AlWindow) Tuple[int, int, int]
+

Retrieves the resolution of a window.

+
+ +
+
+property grid_size
+

Return the size of the grid in world coordinates.

+
+ +
+
+type(self: alias_api.AlWindow) alias_api.AlObjectType
+

Return the AlWindow type identifier.

+
+ +
+ +
+
+exception alias_api.AliasCompatibilityException
+
+ +
+
+exception alias_api.AliasOpenModelException
+
+ +
+
+exception alias_api.AliasPythonException
+
+ +
+
+class alias_api.LinearUnit
+

Linear measurement units.

+

Members:

+
+

Miles

+

Yards

+

Feet

+

Inches

+

Kilometers

+

Meters

+

Centimeters

+

Millimeters

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.Menu
+

Add menus to the Alias menu bar using this object.

+
+
+add_command(self: alias_api.Menu, label: str, callback: Callable[[], None], add_separator: bool = False, parent: object = None) object
+
+ +
+
+add_menu(self: alias_api.Menu, label: str, parent: object = None) object
+
+ +
+
+clean(self: alias_api.Menu) None
+
+ +
+
+remove(self: alias_api.Menu) int
+
+ +
+ +
+
+class alias_api.MenuItem
+

Menu items for the Menu object.

+
+ +
+
+class alias_api.MessageResult
+

The result returned by a message event.

+
+
+property attributes_1_name
+

Get the first AlAttributes from the message event that triggered the Python callback.

+
+ +
+
+property bool_value_1
+

Get the first bool value from the message event that triggered the Python callback.

+
+ +
+
+property camera_1_name
+

Get the first AlCamera from the message event that triggered the Python callback.

+
+ +
+
+property cloud_1_name
+

Get the first AlCloud from the message event that triggered the Python callback.

+
+ +
+
+property curve_on_surface_1_name
+

Get the first AlCurveOnSurface from the message event that triggered the Python callback.

+
+ +
+
+property dag_node_1_name
+

Get the first AlDagNode from the message event that triggered the Python callback.

+
+ +
+
+property dag_node_2_name
+

Get the second AlDagNode from the message event that triggered the Python callback.

+
+ +
+
+property int_value_1
+

Get the first int value from the message event that triggered the Python callback.

+
+ +
+
+property int_value_2
+

Get the second int value from the message event that triggered the Python callback.

+
+ +
+
+property light_1_name
+

Get the first AlLight from the message event that triggered the Python callback.

+
+ +
+
+property locator_1_name
+

Get the first AlLocator from the message event that triggered the Python callback.

+
+ +
+
+property message_type
+

Get the message type that trigger the Python callback.

+
+ +
+
+property reference_file_1_name
+

Get the first AlReferenceFile name from the message event that triggered the Python callback.

+
+ +
+
+property reference_file_1_path
+

Get the first AlReferenceFile source wire file path from the message event that triggered the Python callback.

+
+ +
+
+property reference_file_set_1_name
+

Get the first AlReferenceFileSet from the message event that triggered the Python callback.

+
+ +
+
+property shader
+

Get the first AlShader name from the message event that triggered the Python callback. Deprecated and will be remoed in v4.0.0 - use shader_1_name instead.

+
+ +
+
+property shader_1_name
+

Get the first AlShader from the message event that triggered the Python callback.

+
+ +
+
+property str_value_1
+

Get the first string value from the message event that triggered the Python callback.

+
+ +
+
+property surface_1_name
+

Get the first AlSurface from the message event that triggered the Python callback.

+
+ +
+
+property texture_1_name
+

Get the first AlTexture from the message event that triggered the Python callback.

+
+ +
+
+property tm_1
+

Get the first AlTM from the message event that triggered the Python callback.

+
+ +
+ +
+
+class alias_api.ReferenceFileStatus
+

The reference file status.

+

Members:

+
+

FileNotFound

+

SourceWireNotFound

+

Stale

+

UpToDate

+

Error

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.Stage
+

Class object to represetn a stage in Alias.

+
+
+property name
+

Get or set the Stage name.

+
+ +
+
+property path
+

Get or set the Stage path.

+
+ +
+ +
+
+class alias_api.SymmetryState
+

The symmetry state.

+

Members:

+
+

Mirror

+

Original

+

BothSides

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.TraverseDagInputData
+

Input data for traversing teh dag.

+
+
+property layers
+

Get or set the list of layers to filter the search results.

+

If the filter is inclusive (see layersInclusive), then only nodes assigned to one of the +layers will be accepted in the traversal results.

+

If the filter is not inclusive, then nodes assigned to one of the layers will not be +accepted in the traversal results.

+

If the list is empty, all nodes may be accepted in the search results.

+
+ +
+
+property layersInclusive
+

Get or set the flag to indicate if the layers filter is inclusive.

+

Set to True to include only nodes that are assigned to one of the layers. Set to False +to exclude nodes that are assigned to one of the layers.

+
+ +
+
+property nodeNamesInclusive
+

Get or set the flag to indicate if the nodeNames filter is inclusive. +Set to True to include only nodes whose name is listed in nodeNames. Set to False +to exclude nodes whose name is listed in nodeNames.

+
+ +
+
+property nodeTypesInclusive
+

Get or set the flag to indicate if the nodeTypes filter is inclusive.

+

Set to True to include only nodes with type that is listed in nodeTypes. Set to False +to exclude nodes with type thati s listed in nodeTypes.

+
+ +
+
+property node_names
+

Get or set the list of node names to filter the search results. +If the filter is inclusive (see nodeNameInclusive), then only nodes whose name is listed +in nodeNames will be accepted in the traversal results. +If the filter is not inclusive, then nodes whose name is listed in nodeNames will not be +accepted in the traversal results. +If the list is empty, all nodes names may be accepted in the search results.

+
+ +
+
+property node_types
+

Get or set the list of node types to filter the search results.

+

If the filter is inclusive (see nodeTypesInclusive), then only nodes with types listed +in nodeTypes will be accepted in the traversal results.

+

If the filter is not inclusive, then nodes with types listed in nodeTypes will not be +accepted in the traversal results.

+

If the list is empty, all nodes types may be accepted in the search results.

+
+ +
+
+property shaders
+

Get or set the list of shaders to filter the search results.

+

If the filter is inclusive (see shadersInclusive), then only nodes assigned to one of the +shaders will be accepted in the traversal results.

+

If the filter is not inclusive, then nodes assigned to one of the shaders will not be +accepted in the traversal results.

+

If the list is empty, all nodes may be accepted in the search results.

+
+ +
+
+property shadersInclusive
+

Get or set the flag to indicate if the shaders filter is inclusive.

+

Set to True to include only nodes that are assigned to one of the shaders. Set to False +to exclude nodes that are assigned to one of the shaders.

+
+ +
+ +
+
+class alias_api.TraverseDagOutputData
+

Output data from traversing the dag.

+
+
+property count
+

Get the number of nodes obtained from traversing the DAG.

+
+ +
+
+property curves_on_surface
+

Get the curves on surface obtained from traversing the DAG.

+
+ +
+
+property nodes
+

Get the nodes obtained from traversing the DAG.

+
+ +
+
+property status
+

Get the resulting status code from traversing the DAG.

+
+ +
+ +
+
+class alias_api.Type
+

The type of measurment unit.

+

Members:

+
+

Unit

+

Subunit

+

Position

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.UngroupOption
+

Options for ungrouping

+

Members:

+
+

DeleteNode

+

CopyNode

+

Collapse

+

Extract

+

MoveUp

+
+
+
+property name
+
+ +
+ +
+
+class alias_api.Variant
+

Class object to represent a variant in Alias.

+
+
+property name
+

Get the Variant name. If the Variant is renamed after this object is created, the name property will not be updated to reflect the name change.

+
+ +
+
+property path
+

Get the thumnail path for the Variant. If the Variant path is changed after this object is created, the path property will not be updated to reflect the path change.

+
+ +
+ +
+
+class alias_api.Vec3
+

Class object to represent a 3D vector.

+
+
+cross(*args, **kwargs)
+

Overloaded function.

+
    +
  1. cross(self: alias_api.Vec3, v: alias_api.Vec3) -> alias_api.Vec3

  2. +
+

Compute the cross product of this vector and ‘v’. Return the resulting cross product vector.

+
    +
  1. cross(self: alias_api.Vec3, v: alias_api.Vec3, result: alias_api.Vec3) -> None

  2. +
+

Compute the cross product of this vector and ‘v’. Assign the resulting cross product vector to ‘result’.

+
+ +
+
+magnitude(self: alias_api.Vec3) float
+

Return the magnitude value of the vector.

+
+ +
+
+normalize(self: alias_api.Vec3) bool
+

Normalize the vector. Return True if the vector was successfully normalized, else False.

+
+ +
+
+to_list(self: alias_api.Vec3) list
+

Return the vector coordinates as a list of values.

+
+ +
+
+property x
+

Get or set the x coordinate of the vector.

+
+ +
+
+property y
+

Get or set the y coordinate of the vector.

+
+ +
+
+property z
+

Get or set the z coordinate of the vector.

+
+ +
+ +
+
+class alias_api.VectorAlTangentType
+

A list containing object of type AlTangentType

+
+
+append(self: alias_api.VectorAlTangentType, x: alias_api.AlTangentType) None
+

Add an item to the end of the list

+
+ +
+
+clear(self: alias_api.VectorAlTangentType) None
+

Clear the contents

+
+ +
+
+count(self: alias_api.VectorAlTangentType, x: alias_api.AlTangentType) int
+

Return the number of times x appears in the list

+
+ +
+
+extend(*args, **kwargs)
+

Overloaded function.

+
    +
  1. extend(self: alias_api.VectorAlTangentType, L: alias_api.VectorAlTangentType) -> None

  2. +
+

Extend the list by appending all the items in the given list

+
    +
  1. extend(self: alias_api.VectorAlTangentType, L: Iterable) -> None

  2. +
+

Extend the list by appending all the items in the given list

+
+ +
+
+insert(self: alias_api.VectorAlTangentType, i: int, x: alias_api.AlTangentType) None
+

Insert an item at a given position.

+
+ +
+
+pop(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pop(self: alias_api.VectorAlTangentType) -> alias_api.AlTangentType

  2. +
+

Remove and return the last item

+
    +
  1. pop(self: alias_api.VectorAlTangentType, i: int) -> alias_api.AlTangentType

  2. +
+

Remove and return the item at index i

+
+ +
+
+remove(self: alias_api.VectorAlTangentType, x: alias_api.AlTangentType) None
+

Remove the first item from the list whose value is x. It is an error if there is no such item.

+
+ +
+ +
+
+alias_api.add_message_handler(message_type: alias_api.AlMessageType, callback_func: Callable[[alias_api.MessageResult], None]) Tuple[int, int]
+

Install a message handler in the Alias Universe.

+
+ +
+
+alias_api.adjust_window(hwnd: int) None
+

Adjust the specified child window such that it is centered over the Alias main window.

+
+ +
+
+alias_api.al_are_equal(al_object1: alias_api.AlObject, al_object2: alias_api.AlObject) int
+

Return True if the two Alias Objects are equal, else False.

+
+ +
+
+alias_api.al_is_valid(al_object: alias_api.AlObject) int
+

Return True if the Alias Object is valid, else False.

+
+ +
+
+alias_api.apply_iterator_to_dag_nodes(iter: AlIterator, retcode: int) int
+

Applies the iterator to all AlDagNodes. It does not recursively go down the DAG.

+
+ +
+
+alias_api.apply_iterator_to_shaders(iter: AlIterator, retcode: int) int
+

Apply the iterator to each AlShader.

+
+
Parameters
+
    +
  • iter (AlIterator) – the iterator to apply

  • +
  • retcode (int) – the return value of the last application of the iterator

  • +
+
+
Returns
+

The status code result +Success - the iterator was successfully applied to each shader +InvalidArgument - ‘iter’ was None +Failure - AlUniverse was not initialized

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.assign_children_to_parent_layer(*args, **kwargs)
+

Overloaded function.

+
    +
  1. assign_children_to_parent_layer(parent_nodes: List[alias_api.AlDagNode]) -> int

    +
    +

    Move the children of the given parent nodes to the parent’s layer.

    +
    +
    param parent_nodes
    +

    The parent nodes.

    +
    +
    type parent_nodes
    +

    List[AlDagNode]

    +
    +
    +
    +
  2. +
  3. assign_children_to_parent_layer(parent_node_names: List[str]) -> int

    +
    +

    Move the children of the given parent nodes to the parent’s layer.

    +
    +
    param parent_nodes
    +

    The parent node names.

    +
    +
    type nodes
    +

    List[str]

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.assign_nodes_to_layer(*args, **kwargs)
+

Overloaded function.

+
    +
  1. assign_nodes_to_layer(nodes: List[str], layer_name: str) -> int

    +
    +

    Set the layer of the given dag nodes to the specified layer.

    +
    +
    param nodes
    +

    The dag nodes to set the layer.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    param layer_name
    +

    The name of the layer to set the nodes to.

    +
    +
    type layer_name
    +

    str

    +
    +
    return
    +

    The status code result +Success - all nodes were set to the layer successfully +Failure - one or more nodes failed to set the layer +InvalidArgument - the layer name is invalid

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. assign_nodes_to_layer(nodes: List[alias_api.AlDagNode], layer_name: str) -> int

    +
    +

    Set the layer of the given dag nodes to the specified layer.

    +
    +
    param nodes
    +

    The dag nodes to set the layer.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    param layer_name
    +

    The name of the layer to set the nodes to.

    +
    +
    type layer_name
    +

    str

    +
    +
    return
    +

    The status code result +Success - all nodes were set to the layer successfully +Failure - one or more nodes failed to set the layer +InvalidArgument - the layer name is invalid

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.cleanup_geometry_model(face_to_surf: bool = False, split_c1_breaks: bool = False, split_closed_basis: bool = False, shrink_closed_surf: bool = False, set_persistent_ids: bool = False, split_sphere: bool = False, picked_dags_only: bool = False, split_multiknots: bool = False, delete_null_nodes: bool = False, delete_degenerate_geo: bool = False) int
+

Clean up the geometry of the model.

+
+ +
+
+alias_api.clear_pick_list() int
+

Remove all objects from the pick list.

+
+ +
+
+alias_api.clear_queued_events() None
+

Clear the currently queued events. The callbacks of the events in the queue will not be triggered.

+
+ +
+
+alias_api.convert_face_node_to_trimmed_surface_node(node: alias_api.AlDagNode) int
+

Convert a AlFaceNode to AlSurfaceNode (a trimmed surface).

+

The dag node and the attachment is not changed but the geometry is replaced +by a trimmed surface. The animation and other attachment on geometry +level are gone (lost).

+
+
Parameters
+

node (AlDagNode) – The face node to convert. This will be modified if the function succeeds.

+
+
Returns
+

The status code result.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.convert_to_trimmed_surface_node(node: alias_api.AlDagNode) int
+

This function works on a AlSurfaceNode only, and only on a surface +that is a closed/periodic and untrimmed surface (e.g. a pure cylinder). +then the function converts it to a trimmed surface and split the +closed surface into multiple open regions.

+
+
Parameters
+

node (AlDagNode) – The node to convert.

+
+
Returns
+

The status code result +Success - the conversion is done so the geometry under

+
+

node is changed (also the wrapper AlDagNode)

+
+
+
Failure - there is no need to convert or error happened

the node is not changed at all.

+
+
+

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.copy_object(node: alias_api.AlDagNode, run_cleanup: int = True) alias_api.AlDagNode
+

This function performs the copy of the dag node based on the +copy options that have been set with the setCopyOptionFlags() +routine.

+

Note: set runCleanup to False if you will be performing many +copies, then call AlDagNodeExt::copyObjectCleanup() after. +This will speed up the copying of objects.

+
+
Parameters
+
    +
  • node (AlDagNode) – The dag node to copy

  • +
  • run_cleanup (bool) – Flag to run clean up after copy object operation. +Defaults to True.

  • +
+
+
Returns
+

The copied object

+
+
Return type
+

AlDagNode

+
+
+
+ +
+
+alias_api.copy_object_cleanup() int
+

Call this method after performing a number of dag node copy object operations to clean up the scene.

+
+ +
+
+alias_api.create_alternative(name: str, force: bool = False) alias_api.AlReferenceFileSet
+

Create an AlReferenceFileSet in the Alias Universe.

+
+ +
+
+alias_api.create_construction_plane(tm: alias_api.AlTM) alias_api.AlDagNode
+

Create a dag node that is a construction plane at the position denoted by ‘tm’.

+
+
Parameters
+

tm (AlTM) – The tansformation matrix used to set the construction plane position.

+
+
Returns
+

The construction plane dag node.

+
+
Return type
+

AlDagNode

+
+
+
+ +
+
+alias_api.create_group_for_layer(layer_name: str, group_name: str) alias_api.AlGroupNode
+

Create a group node for the specified layer.

+
+
Parameters
+
    +
  • layer_name (str) – The name of the layer to create the group node for.

  • +
  • group_name (str) – The name of the group node to create.

  • +
+
+
Returns
+

The newly created group node. None if failed to create +the group node.

+
+
Return type
+

AlGroupNode

+
+
+
+ +
+
+alias_api.create_layer(layer_name: str) alias_api.AlLayer
+

Create a new AlLayer in the Alias Universe.

+
+ +
+
+alias_api.create_layer_folder(folder_name: str) alias_api.AlLayer
+

Create a new AlLayer folder in the Alias Universe.

+
+ +
+
+alias_api.create_layered_shader() alias_api.AlLayeredShader
+

Create a new AlLayeredShader in the Alias Universe.

+
+ +
+
+alias_api.create_orthographic_camera(view_type: alias_api.AlWindow.AlViewType) alias_api.AlOrthographicCamera
+

Create and return an AlOrthographicCamera object.

+
+ +
+
+alias_api.create_perspective_camera() alias_api.AlPerspectiveCamera
+

Create and return a AlPerspectiveCamera object.

+
+ +
+
+alias_api.create_reference(arg0: str) alias_api.AlReferenceFile
+

Create an AlReferenceFile with the given path, in the Alias Universe.

+
+ +
+
+alias_api.create_reference_alternative(name: str) alias_api.AlReferenceFileSet
+

Create an AlReferenceFileSet with the given name.

+
+ +
+
+alias_api.create_shader() alias_api.AlShader
+

Create a new AlShader in the Alias Universe.

+
+ +
+
+alias_api.create_stage(arg0: str) int
+

Create a new stage in Alias.

+
+ +
+
+alias_api.create_switch_shader() alias_api.AlSwitchShader
+

Create a new AlSwitchShader in the Alias Universe.

+
+ +
+
+alias_api.create_texture_node(*args, **kwargs)
+

Overloaded function.

+
    +
  1. create_texture_node(imagePath: str, useConstructionPlane: bool = False, errs: list = []) -> bool

  2. +
+

A function which creates a Canvas Image at the center of the world.

+
    +
  1. create_texture_node(name : str, imagePath : str, useConstructionPlane: bool, errs: list) -> bool

  2. +
+

A function which creates a Canvas Image at the center of the world.

+
+ +
+
+alias_api.current_window() alias_api.AlWindow
+

Returns the currently active window.

+
+ +
+
+alias_api.delete_all(objs: List[alias_api.AlObject]) int
+

Delete all the Alias Objects in the list.

+
+
Parameters
+

objs (List[AlObject]) – List of Alias Objects to delete.

+
+
Returns
+

The status code result of the operation: +sSuccess - all objects were deleted +sFailure - one or more objects were not deleted

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.delete_all_construction_entities() int
+

Delete all AlConstructionPlane objects found in the Alias Universe.

+
+ +
+
+alias_api.delete_all_construction_history(cos: std::vector<AlCurveOnSurface * __ptr64, std::allocator<AlCurveOnSurface * __ptr64> >) None
+

Delete the construction histor for all the given curve on surface objects.

+
+ +
+
+alias_api.delete_all_locators() int
+

Delete all locators.

+

After this operation, all references to all AlLocators will be invalid.

+
+
Returns
+

The status code result +Success - everything was successfully deleted. +Failure - the universe was not initialized or the deletion failed.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.delete_construction_history(cos: alias_api.AlCurveOnSurface) None
+

Delete the construction histor for the curve on surface.

+
+ +
+
+alias_api.delete_dag_nodes_by_name(node_names: List[str]) int
+

Delete the dag nodes with the given names.

+
+
Parameters
+

node_names (List[str]) – The names of the dag nodes to delete.

+
+
Returns
+

The status code result +Success - all nodes were deleted successfully +Failure - one or more nodes failed to delete

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.delete_history(*args, **kwargs)
+

Overloaded function.

+
    +
  1. delete_history(node: alias_api.AlDagNode) -> None

    +
    +

    Delete the history from this dag node.

    +
    +
    param node
    +

    The dag node to delete history from.

    +
    +
    type node
    +

    AlDagNode

    +
    +
    +
    +
  2. +
  3. delete_history(nodes: List[alias_api.AlDagNode]) -> None

    +
    +

    Delete the history from the given dag nodes.

    +
    +
    param nodes
    +

    The dag nodes to delete history from.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.delete_layers_by_name(layer_names: List[str]) int
+

Delete the layers with the given names.

+
+
Parameters
+

layer_names (List[str]) – The names of the layers to delete.

+
+
Returns
+

The status code result of the operation: +sSuccess - all objects were deleted +sFailure - one or more objects were not deleted

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.delete_null_nodes() int
+

Delete all null nodes in the Alias scene.

+
+ +
+
+alias_api.delete_sets_by_name(names: Set[str]) int
+

Delete sets by name.

+
+
Parameters
+

names (List[str]) – The names of the sets to delete.

+
+
Returns
+

The status code result of the operation +Success - operation exited normally +Failure - operation exited abnormally

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.do_updates(new_state: int = True) int
+

The do_updates flag is used to notify the system that you are finished +performing. If this flag is true, then it is equivalent to sending +out a ‘geometry modified’ message to the rest of the system. +When the system receives the update message, then operations such +as construction history etc are performed.

+

If the previous state of the flag was FALSE and the new state is TRUE, +then an update will be performed now and on each subsequent dag +modification.

+
+ +
+
+alias_api.expand_instances(node: alias_api.AlDagNode) int
+

Convert all instsances below the given node (top node of tree) to uninstanced geometry.

+
+ +
+
+alias_api.export_by_layer(target_dirname: str, base_filename: str, file_type: alias_api.AlFileType, layer_list: List[alias_api.AlLayer], overwrite: bool = False) int
+

Export each layer to a new file.

+

This function will modify the pick list, ensure to save the state of the pick list +before calling this function if it is desired to restore it after this operation.

+

This is an alternative function to exportByLayerSequentially that is optimized for +when there are many dag nodes, since it will only traverse the DAG once, whereas +exportByLayerSequentially will traverse the DAG once per layer. The downside of this +function is that it requires more memory since it will keep track of the nodes per +layer.

+

This function requires Alias >= 2022.2

+
+
Parameters
+
    +
  • target_dirname (str) – The output directory to save new layer files to.

  • +
  • base_filename (str) – The base filename for the newly saved layer files. The layer name will be appended for each file.

  • +
  • file_type (AlFileType) – The file type that the new layer files will be saved as.

  • +
  • layer_list (list<AlLayer>) – The layers to export.

  • +
  • overwrite (bool) – True will overwrite any existing files, False will not save a the layer file it if a file already exists with the same name.

  • +
+
+
Raises
+
+
+
+
+ +
+
+alias_api.export_by_layer_sequentially(target_dirname: str, base_filename: str, file_type: alias_api.AlFileType, layer_list: List[alias_api.AlLayer], overwrite: bool = False) int
+

Export each layer to a new file.

+

This function will modify the pick list, ensure to save the state of the pick list +before calling this function if it is desired to restore it after this operation.

+

This is a naive approach to export all layers. For each layer, the DAG is traversed +to pick each node in the layer. This will be slow if there are many nodes in the DAG.

+

Use exportByLayer for an optimized approach, for Alias >= 2022.2

+
+
Parameters
+
    +
  • target_dirname (str) – The output directory to save new layer files to.

  • +
  • base_filename (str) – The base filename for the newly saved layer files. The layer name will be appended for each file.

  • +
  • file_type (AlFileType) – The file type that the new layer files will be saved as.

  • +
  • layer_list (list<str>) – The layers in the file to export. If not specified, all layers will be exported.

  • +
  • overwrite (bool) – True will overwrite any existing files, False will not save a the layer file it if a file already exists with the same name.

  • +
+
+
+
+ +
+
+alias_api.find_dag_node_by_name(name: str) alias_api.AlDagNode
+

Find and return the DagNode that matches the given name.

+

This traverses into group nodes to search the entire DAG for the node.

+
+
Parameters
+

name (str) – The unique dag node name to search by.

+
+
Returns
+

The dag node with the given name.

+
+
Return type
+

AlDagNode

+
+
+
+ +
+
+alias_api.find_top_level_dag_node_by_name(name: str) alias_api.AlDagNode
+

Find and return the DagNode that matches the given name.

+

This does not traverse into group nodes, only the top-level nodes in the DAG.

+
+
Parameters
+

name (str) – The unique dag node name to search by.

+
+
+
+ +
+
+alias_api.first_construction_entity() alias_api.AlConstructionEntity
+

Return the first AlConstructionPlane object found in the Alias Universe.

+
+ +
+
+alias_api.first_dag_node() alias_api.AlDagNode
+

Return the first AlDagNode in the list of Alias AlDagNode objects (the DAG).

+
+ +
+
+alias_api.first_environment() alias_api.AlEnvironment
+

Returns the first Environment in the list of Alias Environment objects. NULL is returned if the list is empty..

+
+ +
+
+alias_api.first_layer() alias_api.AlLayer
+

Return the first layer which refers to the default layer. This layer is always valid in the universe. None is returned if the universe is not initialized.

+
+ +
+
+alias_api.first_layered_shader() alias_api.AlLayeredShader
+

Return the first AlLayeredShader in the list of Alias AlLayeredShader objects. None is returned if the list is empty.

+
+ +
+
+alias_api.first_locator() alias_api.AlLocator
+

Return the first AlLocator in the list of Alias AlLocator objects. None is returned if the list is empty.

+
+ +
+
+alias_api.first_pick_item() int
+

Set the pick list to reference the first object in the list.

+
+ +
+
+alias_api.first_set() alias_api.AlSet
+

Return the first set in the Alias Universe.

+
+ +
+
+alias_api.first_shader() alias_api.AlShader
+

Return the first AlShader in the list of Alias AlShader objects. None is returned if the list is empty.

+
+ +
+
+alias_api.first_switch_shader() alias_api.AlSwitchShader
+

Return the first AlSwitchShader in the list of Alias AlSwitchShader objects. None is returned if the list is empty.

+
+ +
+
+alias_api.flatten_group_nodes(*args, **kwargs)
+

Overloaded function.

+
    +
  1. flatten_group_nodes() -> int

    +
    +

    Flatten all top-level group nodes in the DAG.

    +

    This function is deprecated. Use method ungroup with UngroupOption.Collapse instead.

    +

    Any group nodes found in the top-level group nodes will have all its children moved to the +top-level group node, and then be removed. The result is each group node specified will +not contain any nested group nodes.

    +
    +
    return
    +

    The status code result of the flatten operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. flatten_group_nodes(group_nodes: List[alias_api.AlGroupNode]) -> int

    +
    +

    Flatten the specified group nodes.

    +

    Any group nodes found in the specified group nodes will have all its children moved to the +top-level group node, and then itself will be removed. The result is each group node +specified will not contain any nested group nodes.

    +
    +
    param group_nodes
    +

    The group nodes to flatten.

    +
    +
    type group_nodes
    +

    list<AlGroupNode>

    +
    +
    return
    +

    The status code result of the flatten operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.get_alternative_by_name(name: str) alias_api.AlReferenceFileSet
+

Return the AlReferenceFileSet matching the given name.

+
+ +
+
+alias_api.get_alternatives() List[alias_api.AlReferenceFileSet]
+

Return a list of all the alternatives for the current AlReferenceFileSet.

+
+ +
+
+alias_api.get_annotation_locator_strings() List[str]
+

Return the string value for all annotation locators in the Alias Universe.

+
+ +
+
+alias_api.get_annotation_locators() List[alias_api.AlAnnotationLocator]
+

Return all annotation locators in the Alias Universe.

+
+ +
+
+alias_api.get_bounding_box_from_hanger(node: alias_api.AlDagNode) Tuple[int, List[float[6]]]
+

Return the bounding box computed from the bounding box hanger for the dag node.

+
+ +
+
+alias_api.get_children(arg0: alias_api.AlGroupNode) List[alias_api.AlDagNode]
+

Return a list of all the children in the group node.

+
+ +
+
+alias_api.get_construction_plane_by_name(name: str) alias_api.AlConstructionPlane
+

Return the AlConstructionPlane matching the given unique name.

+
+ +
+
+alias_api.get_current_path() str
+

Return the current file path.

+
+ +
+
+alias_api.get_current_pick_item() AlObject
+

Return the object that the pick list is currently referencing.

+
+ +
+
+alias_api.get_current_stage() alias_api.Stage
+

Return the current stage.

+
+ +
+
+alias_api.get_dag_nodes_by_name(names: List[str]) List[alias_api.AlDagNode]
+

Returns a list of the dag nodes matching the given names.

+
+
Parameters
+

names (Union[List[str], Set[str]]) – The names of the dag nodes to search for.

+
+
Returns
+

The list of dag nodes that match the given names.

+
+
Return type
+

List[AlDagNode]

+
+
+
+ +
+
+alias_api.get_empty_layers(include_folders: bool = True, skip_layers: Set[str] = set()) List[alias_api.AlLayer]
+

Return all empty layers.

+
+
Parameters
+

skip_layers (list<str>) – List of layer names to skip when checking for empty ones.

+
+
Returns
+

The empty layers.

+
+
Return type
+

list<AlLayer>

+
+
+
+ +
+
+alias_api.get_empty_sets() List[alias_api.AlSet]
+

Return a list of all empty sets in the Alias Universe.

+
+ +
+
+alias_api.get_layer_by_name(layer_name: str) alias_api.AlLayer
+

Return a layer given its name in the Alias Universe.

+
+ +
+
+alias_api.get_layer_by_number(layer_number: int) alias_api.AlLayer
+

Return a layer given its number in the Alias Universe.

+
+ +
+
+alias_api.get_layered_shader_by_name(shader_name: str) alias_api.AlLayeredShader
+

Return the AlLayeredShader found by the given name.

+
+ +
+
+alias_api.get_layered_shader_by_node(node_name: str) alias_api.AlLayeredShader
+

Return the AlLayeredShader assigned to the node corresponding to the given name.

+
+ +
+
+alias_api.get_layered_shaders() List[alias_api.AlLayeredShader]
+

Return a list of all the AlLayeredShader objects in the Alias universe.

+
+ +
+
+alias_api.get_layers(*args, **kwargs)
+

Overloaded function.

+
    +
  1. get_layers(ignore_names: Set[str] = set(), ignore_numbers: Set[int] = set(), include_folders: bool = True, include_non_folders: bool = True) -> List[alias_api.AlLayer]

  2. +
+

Return a list of all the layers in the Alias Universe.

+
    +
  1. get_layers(nodes: List[AlDagNode]) -> List[alias_api.AlLayer]

    +
    +

    Return a list of all the layers in the Alias Universe that are +assigned to the given nodes.

    +
    +
    param nodes
    +

    The nodes to get the layers from.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    return
    +

    The list of layers assigned to the given nodes.

    +
    +
    rtype
    +

    List[AlLayer]

    +
    +
    +
    +
  2. +
+
+ +
+
+alias_api.get_layers_by_name(layer_names: List[str]) List[alias_api.AlLayer]
+

Return the AlLayer objects found from the given list of names.

+
+ +
+
+alias_api.get_layers_using_multiple_shaders() List[alias_api.AlLayer]
+

Return layers whose geometry do not all use the one same shader.

+
+ +
+
+alias_api.get_locator_by_name(name: str) alias_api.AlLocator
+

Return the AlLocator object with the given name.

+
+
Parameters
+

name (str) – The name of the locator to return.

+
+
Returns
+

The AlLocator object with the given name.

+
+
Return type
+

AlLocator

+
+
+
+ +
+
+alias_api.get_locators() List[alias_api.AlLocator]
+

Return a list of all AlLocator objects in the Alias Universe.

+
+
Returns
+

The list of AlLocator objects.

+
+
Return type
+

List[AlLocator]

+
+
+
+ +
+
+alias_api.get_locators_by_name(names: List[str]) List[alias_api.AlLocator]
+

Return a list of AlLocator objects with the given names.

+
+
Parameters
+

names (List[str]) – The list of locator names to return.

+
+
Returns
+

The list of AlLocator objects with the given names.

+
+
Return type
+

List[AlLocator]

+
+
+
+ +
+
+alias_api.get_main_window_id() int
+

Return the window handle to the Alias main window.

+
+ +
+
+alias_api.get_nesting_groups() List[alias_api.AlGroupNode]
+

Return the list of top-level group nodes that contain at least one group.

+
+ +
+
+alias_api.get_perspective_camera_by_name(name: str) alias_api.AlPerspectiveCamera
+

Find and return the AlPerspectiveCamera that matches the unique identifier name.

+
+ +
+
+alias_api.get_perspective_cameras() List[alias_api.AlPerspectiveCamera]
+

Find and return all AlPerspectiveCameras in the Alias Universe.

+
+ +
+
+alias_api.get_pick_item_dag_nodes() List[AlDagNode]
+

Return a list of all dag nodes that are in the pick list.

+
+ +
+
+alias_api.get_pick_items() List[AlObject]
+

Return a list of all objects that are in the pick list.

+
+ +
+
+alias_api.get_product_information() dict
+

Return the Alias product information.

+
+ +
+
+alias_api.get_reference_by_name(name: str) alias_api.AlReferenceFile
+

Return the AlReferenceFile matching the given name.

+
+ +
+
+alias_api.get_reference_by_path(path: str) alias_api.AlReferenceFile
+

Return the AlReferenceFile matching the given file path.

+
+ +
+
+alias_api.get_reference_by_uuid(uuid: list) alias_api.AlReferenceFile
+

Return the AlReferenceFile matching the given uuid.

+
+ +
+
+alias_api.get_references() List[alias_api.AlReferenceFile]
+

Return all the AlReferenceFiles imported into the current file.

+
+ +
+
+alias_api.get_references_by_name(names: List[str]) List[alias_api.AlReferenceFile]
+

Return the AlReferenceFile objects matching the given list of names.

+
+ +
+
+alias_api.get_sets_by_name(names: Set[str]) List[alias_api.AlSet]
+

Get sets by name.

+
+
Parameters
+

names (List[str]) – The names of the sets to get.

+
+
Returns
+

A list of sets with the given names.

+
+
Return type
+

List[AlSet])

+
+
+
+ +
+
+alias_api.get_shader_by_name(shader_name: str) alias_api.AlShader
+

Return the Shader found by the given name.

+
+ +
+
+alias_api.get_shaders() List[alias_api.AlShader]
+

Return a list of all the shaders in the Alias universe.

+
+ +
+
+alias_api.get_shaders_by_name(shader_names: List[str]) List[alias_api.AlShader]
+

Return the Shader objects found by the given list of names.

+
+ +
+
+alias_api.get_shaders_by_node(node_name: str) List[alias_api.AlShader]
+

Return a list of all the shaders assigned to the node corresponding to the given name.

+
+ +
+
+alias_api.get_stages() List[alias_api.Stage]
+

Return all the existing stages of the current Alias session.

+
+ +
+
+alias_api.get_switch_shader_by_name(shader_name: str) alias_api.AlSwitchShader
+

Return the SwitchShader found by the given name.

+
+ +
+
+alias_api.get_switch_shader_by_node(node_name: str) alias_api.AlSwitchShader
+

Return the switch shader assigned to the node corresponding to the given name.

+
+ +
+
+alias_api.get_switch_shaders() List[alias_api.AlSwitchShader]
+

Return a list of all the switch shaders in the Alias universe.

+
+ +
+
+alias_api.get_top_dag_nodes() List[alias_api.AlDagNode]
+

Returns a list of the top level dag nodes in the Alias Universe.

+
+ +
+
+alias_api.get_variants() List[alias_api.Variant]
+

Return all the variants of the current file.

+
+ +
+
+alias_api.has_annotation_locator() bool
+

Return True if there are any annotation locators in the Alias Universe.

+
+ +
+
+alias_api.has_construction_history(cos: alias_api.AlCurveOnSurface) int
+

Return 1 if the curve on surface has construction history, 0 if no construction history, and -1 if the curve on surface is invalid.

+
+ +
+
+alias_api.has_history(node: alias_api.AlDagNode) bool
+

Return True if the dag node has history, else False.

+
+
Parameters
+

node (AlDagNode) – The dag node to check history.

+
+
Returns
+

True if the node has history, else False.

+
+
Return type
+

bool

+
+
+
+ +
+
+alias_api.has_queued_events() bool
+

Check if there are Alias event callbacks queued and waiting to execute.

+

Queued event callbacks will be executed once queuing events is turned off.

+
+
Returns
+

True if there are queued event callbacks, else False.

+
+
Return type
+

bool

+
+
+
+ +
+
+alias_api.has_reference() bool
+

Return True if any AlReferenceFiles found in the current Alias Universe.

+
+ +
+
+alias_api.has_variants() bool
+

Check if the current file contains variants.

+
+ +
+
+alias_api.import_file(arg0: str) None
+

Import a file into the current file.

+
+ +
+
+alias_api.import_reference(filename: str) alias_api.AlReferenceFile
+

Import the file and create an AlReferenceFile object from it.

+
+ +
+
+alias_api.import_subdiv(filepath: str) None
+

Imports a subdiv data from OBJ, TSM, F3D or SF3D file.

+

Note that SF3D file format is only supported in OpenAlias.

+
+
Parameters
+

filepath (str) – The name of the input file to process

+
+
Throws AliasPythonException
+

If filepath is None, Alias failed to import or the Alias universe has not been initialized.

+
+
+
+ +
+
+alias_api.import_subdivision(filepath: str) None
+

Deprecated - use ‘import_subdiv’ instead.

+

Imports a subdiv data from OBJ, TSM, F3D or SF3D file.

+

Note that SF3D file format is only supported in OpenAlias.

+
+
Parameters
+

filepath (str) – The name of the input file to process

+
+
Throws AliasPythonException
+

If filepath is None, Alias failed to import or the Alias universe has not been initialized.

+
+
+
+ +
+
+alias_api.initialize_universe(up: alias_api.AlCoordinateSystem = <AlCoordinateSystem.???: 1>, init_project_env: int = False) int
+

Initialize the Alias Universe.

+
+ +
+
+alias_api.is_construction_layer(layer_number: int) bool
+

Determine if the layer is a construction layer.

+
+
Parameters
+

layer_number – The number of the layer to check.

+
+
Returns
+

True if the layer is a construction layer, else False.

+
+
+
+ +
+
+alias_api.is_copy_of_vred_shader(shader: alias_api.AlShader) bool
+

Returns True if the shader was created from a VRED shader.

+
+ +
+
+alias_api.is_empty_file() bool
+

Deprecated - use ‘is_stage_empty’ instead.

+
+ +
+
+alias_api.is_queuing_events() bool
+

Check if the Alias event callbacks are currently being queued.

+

When event callbacks are being queued, this means that when Alias events are +fired, the C++ message handler is still invoked, but the Python callbacks +registered to the Alias events will not be executed immediately, and instead +will be executed once queuing events is turned off.

+
+
Returns
+

True if event callbacks are being queued, else False.

+
+
Return type
+

bool

+
+
+
+ +
+
+alias_api.is_stage_empty() bool
+

Check if the current file is empty or not.

+
+ +
+
+alias_api.linear_scale(type: alias_api.Type) float
+

Return the linear scale factor for the current units.

+
+ +
+
+alias_api.linear_units(type: alias_api.Type) alias_api.LinearUnit
+

Return the linear units for the current units.

+
+ +
+
+alias_api.log_message(outputType: AlOutputType, msg: str) None
+

A function which logs a message to the given output.

+
+ +
+
+alias_api.log_to_errlog(msg: str) None
+

A function which logs a message to the Alias error log.

+
+ +
+
+alias_api.log_to_prompt(msg: str) None
+

A function which logs a message to the Alias prompt.

+
+ +
+
+alias_api.log_to_prompt_no_history(msg: str) None
+

A function which logs a message to the Alias prompt without history.

+
+ +
+
+alias_api.log_to_stderr(msg: str) None
+

A function which logs a message to the standard error stream.

+
+ +
+
+alias_api.log_to_stdout(msg: str) None
+

A function which logs a message to the standard output stream.

+
+ +
+
+alias_api.next_construction_entity(entity: alias_api.AlConstructionEntity) alias_api.AlConstructionEntity
+

Return the next AlConstructionPlane object found, after the given entity, in the Alias Universe.

+
+ +
+
+alias_api.next_layer(cur_layer: alias_api.AlLayer) alias_api.AlLayer
+

Return the leaf layer following cur_layer in the graph of Alias AlLayer objects in a pre-order traversal.

+

Note: This function does not return layer folders (only leaf layers).

+

None is returned if cur_layer has no next layer.

+
+
Parameters
+

cur_layer (AlLayer) – Layer from which to walk forward

+
+
Returns
+

The leaf layer following cur_layer.

+
+
Return type
+

AlLayer

+
+
+
+ +
+
+alias_api.next_locator(cur_locator: alias_api.AlLocator) alias_api.AlLocator
+

Return the AlLocator following cur_locator in the list of Alias AlLocator objects.

+

None is returned if cur_locator has no next locator.

+
+
Parameters
+

cur_locator (AlLocator) – The locator from which to walk forward.

+
+
Returns
+

The locator following the cur_locator.

+
+
Return type
+

AlLocator

+
+
+
+ +
+
+alias_api.next_pick_item() int
+

Set the pick list to reference the next object in the list.

+
+ +
+
+alias_api.next_shader(*args, **kwargs)
+

Overloaded function.

+
    +
  1. next_shader(cur_shader: alias_api.AlShader) -> alias_api.AlShader

  2. +
+

Return the AlShader following cur_shader in the list of Alias AlShader objects. None is returned if cur_shader has no next shader.

+
    +
  1. next_shader(cur_shader: alias_api.AlLayeredShader) -> alias_api.AlLayeredShader

  2. +
+

Return the AlLayeredShader following cur_shader in the list of Alias AlLayeredShader objects. None is returned if cur_shader has no next shader.

+
+ +
+
+alias_api.next_switch_shader(cur_shader: alias_api.AlSwitchShader) alias_api.AlSwitchShader
+

Return the AlSwitchShader following cur_shader in the list of Alias AlSwitchShader objects. None is returned if cur_shader has no next shader.

+
+ +
+
+alias_api.node_first_shader(node: alias_api.AlDagNode) AlShader
+

Return the first shader used by the given dag node. Return None if no shader is used.

+
+ +
+
+alias_api.node_switch_shader(node: alias_api.AlDagNode) AlSwitchShader
+

Return the switch shader used by the given dag node. Return None if no switch shader used.

+
+ +
+
+alias_api.open_file(path: str, new_stage: bool = False, delete_current: bool = False) int
+

Open a file in Alias.

+
+ +
+
+alias_api.pick(pickables: List[alias_api.AlPickable]) int
+

Pick all the given objects.

+

The objects must be pickable.

+
+
Parameters
+

pickables (List[AlPickable]) – The list of pickables to pick.

+
+
+
+ +
+
+alias_api.pick_all_layers() int
+

Pick all layers in the Alias Universe.

+
+
Returns
+

The status code result of the operation. +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.pick_all_locators() int
+

Pick all locators.

+
+
Returns
+

The status code result +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.pick_by_name(name: str) int
+

Add all objects that match the given string pattern to the pick list.

+
+ +
+
+alias_api.pick_layers(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pick_layers(layers: List[alias_api.AlLayer]) -> int

    +
    +

    Pick the layers.

    +
    +
    param layers
    +

    The layers to pick.

    +
    +
    type layers
    +

    List[AlLayer]

    +
    +
    return
    +

    The status code result of the operation. +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. pick_layers(layer_names: List[str]) -> int

    +
    +

    Pick the layers with the given names.

    +
    +
    param layer_names
    +

    The names of the layers to pick.

    +
    +
    type layer_names
    +

    List[str]

    +
    +
    return
    +

    The status code result of the operation. +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.pick_locators(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pick_locators(locators: List[alias_api.AlLocator]) -> int

    +
    +

    Pick the given locators.

    +
    +
    param locators
    +

    The list of locators to pick.

    +
    +
    type locators
    +

    List[AlLocator]

    +
    +
    return
    +

    The status code result +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. pick_locators(names: List[str]) -> int

    +
    +

    Pick the locators with the given names.

    +
    +
    param names
    +

    The list of locator names to pick.

    +
    +
    type names
    +

    List[str]

    +
    +
    return
    +

    The status code result +Success - everything was successfully picked. +Failure - not all locators were successfully picked.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.pick_nodes(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pick_nodes(nodes: List[alias_api.AlPickable]) -> int

    +
    +
    +

    Pick the given dag nodes.

    +
    +
    +
    param nodes
    +

    The dag nodes to pick.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    return
    +

    The status code result +Success - all nodes were picked successfully +Failure - one or more nodes failed to pick

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. pick_nodes(node_names: List[str]) -> int

    +
    +

    Pick the dag nodes with the given names.

    +
    +
    param node_names
    +

    The names of the dag nodes to pick.

    +
    +
    type node_names
    +

    List[str]

    +
    +
    return
    +

    The status code result +Success - all nodes were picked successfully +Failure - one or more nodes failed to pick

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.pick_nodes_assigned_to_layers(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pick_nodes_assigned_to_layers(layers: List[alias_api.AlLayer]) -> int

    +
    +

    Pick all the nodes assigned to the given layers.

    +
    +
    param layers
    +

    The layers to pick nodes from.

    +
    +
    type layers
    +

    List[AlLayer]

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. pick_nodes_assigned_to_layers(layer_names: List[str]) -> int

    +
    +

    Pick all the nodes assigned to the given layers.

    +
    +
    param layer_names
    +

    The names of the layers to pick nodes from.

    +
    +
    type layer_names
    +

    List[str]

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.pick_nodes_assigned_to_shaders(*args, **kwargs)
+

Overloaded function.

+
    +
  1. pick_nodes_assigned_to_shaders(shaders: List[alias_api.AlShader]) -> int

    +
    +

    Pick the nodes assigned to all the given shaders.

    +
    +
    param shaders
    +

    The list of shaders.

    +
    +
    type shaders
    +

    List[AlShader]

    +
    +
    +
    +
  2. +
  3. pick_nodes_assigned_to_shaders(shader_names: List[str]) -> int

    +
    +

    Pick the nodes assigned to all the given shaders.

    +
    +
    param shaders
    +

    The list of shaders by name.

    +
    +
    type shaders
    +

    List[str]

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.pop_pick_list() int
+

Pops the pushed pick list.

+
+ +
+
+alias_api.prev_pick_item() int
+

Set the pick list to reference the previous object in the list.

+
+ +
+
+alias_api.push_pick_list(copy: int) int
+

Push a new pick list onto the stack.

+
+ +
+
+alias_api.queue_events(queue: bool) None
+

Manage queuing Python callbcacks triggered by Alias message events.

+

Pass True to this function to start queuing all Python callbacks that +are triggered by Alias message events.

+

When ready to execute the Python callbacks, pass False to this funciton +to empty the queue and trigger each Python callback in the queue.

+
+
Parameters
+

queue – True to queue event callbacks, and False to execute the +queued event callbacks.

+
+
+

type queue: bool

+
+ +
+
+alias_api.redraw_screen(redraw_flag: int = 3) int
+

Redraw the Alias screen.

+
+ +
+
+alias_api.remove_message_handler(message_type: alias_api.AlMessageType, callback_id: int) int
+

Remove the specific message handler for the message type and callback.

+
+ +
+
+alias_api.remove_message_handlers(message_type: alias_api.AlMessageType) int
+

Remove all message handlers for the message type.

+
+ +
+
+alias_api.remove_reference(reference_file: alias_api.AlReferenceFile) int
+

Remove the AlReferenceFile from the Alias Universe.

+
+ +
+
+alias_api.remove_references(reference_files: List[alias_api.AlReferenceFile]) int
+

Remove all the AlReferenceFile from the Alias Universe.

+
+ +
+
+alias_api.reset() None
+

Deprecated - use ‘reset_stages’ instaed.

+
+ +
+
+alias_api.reset_pivots(*args, **kwargs)
+

Overloaded function.

+
    +
  1. reset_pivots(nodes: List[alias_api.AlDagNode]) -> int

    +
    +

    Reset the pivots of the given dag nodes to the origin.

    +
    +
    param nodes
    +

    The dag nodes to reset pivots to origin.

    +
    +
    type nodes
    +

    List[AlDagNode]

    +
    +
    +
    +
  2. +
  3. reset_pivots(node_names: List[str]) -> int

    +
    +

    Reset the pivots of the dag nodes with the given names to the origin.

    +
    +
    param node_names
    +

    The names of the dag nodes to reset pivots to origin.

    +
    +
    type node_names
    +

    List[str]

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.reset_stages() None
+

Reset the current session by deleting all the stages. OpenAlias will create default windows.

+
+ +
+
+alias_api.retrieve(file_name: str) int
+

Retrieves an Alias Wire file and adds the objects stored in the +file to the list of Alias AlDagNode objects. If fileName is NULL +the file is read from stdin.

+

If the universe has been initialized with Y-axis up, and the wire +file retrieved was stored in a Z-axis up system, or vice versa, +then the model will be rotated by 90 degrees. It is best to +initialize the universe in the same orientation as the wire files +that will be retrieved.

+

Note that if InvalidWireFile is returned you are likely +trying to retrieve a newer wire file than your application +recognizes. In this case you should link your application +with the OpenModel library distributed with the newer Alias.

+
+
Parameters
+

file_name (str) – The name of the file to be retrieved

+
+
Returns
+

The status code result of the operation: +Success - the file was retrieved successfully +InsufficientMemory - not enough memory +Failure - the wire file could not be retrieved properly +InvalidWireFile - the file was not a compatible Alias wire file.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+alias_api.retrieve_options() Tuple[int, AlRetrieveOptions]
+

Get the options used by retrieve().

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the options were returned succesfully. +Failure - AlUniverse was not initialized.

+
+
    +
  1. The options used by retrieve().

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, AlRetrieveOptions>

+
+
+
+ +
+
+alias_api.save_file() int
+

Save the current file.

+
+ +
+
+alias_api.save_file_as(path: str) int
+

Save the current file to the given path.

+
+ +
+
+alias_api.save_layers(file_path: str, target_dirname: str, layer_names: List[str] = [], save_invisible: bool = True, picked_only: bool = False, file_type: alias_api.AlFileType = <AlFileType.Wire: 1>, use_sequential: bool = False, overwrite: bool = False, threshold: int = 8) int
+

Retrieve the file and export each of its layers to a new file.

+

This provides the same functionality as the Save Layers plugin. It is a +convenience function to calling the main export by layer functions ( +export_by_layer, export_by_layer_sequentially).

+

The pick list state will be saved before modifying it, and restored at the end of +the operation.

+

Empty layers will be omitted (there will be no wire file created for empty layers).

+

This function requires Alias >= 2022.2

+
+
Parameters
+
    +
  • file_path (str) – The file to export layers from. This file will first be retrieved.

  • +
  • target_dirname (str) – The output directory to save new layer files to.

  • +
  • layer_names (list<str>) – The layers in the file to export. If not specified, all layers will be exported.

  • +
  • save_invisible (bool) – True will export all non-empty layers, False will only save layers that are visible or that are construction layers.

  • +
  • picked_only (bool) – True will export only layers that are picked, False will export both picked and not picked layers.

  • +
  • file_type (AlFileType) – The file type that the new layer files will be saved as.

  • +
  • use_sequential (bool) – True will force using the sequential export method (ignores the threshold value).

  • +
  • overwrite (bool) – True will overwrite any existing files, False will not save a the layer file it if a file already exists with the same name.

  • +
  • threshold (int) – Set the upperbound limit on number of layers to switch between export methods. +If the number of layers is less than or equal the threshold, then layers are exported sequentially. +If the number of layers is greater than the threshold, then layers are exported in an optimized way.

  • +
+
+
Raises
+
+
+
+
+ +
+
+alias_api.search_dag(input_data: alias_api.TraverseDagInputData) alias_api.TraverseDagOutputData
+

Search the entire DAG validating each node with the provided input data.

+

The input data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+

input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_has_history(input_data: alias_api.TraverseDagInputData) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes with construction history.

+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+

input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_has_non_origin_pivot(input_data: alias_api.TraverseDagInputData, reset: bool = False) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes with scale or rotate pivots not positioned at the origin.

+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • reset (bool) – True will reset the pivot to the origin, else False to return the data.

  • +
+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_has_non_zero_transform(input_data: alias_api.TraverseDagInputData, top_level_only: bool = True, reset: bool = False) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes that do not have a zero transform.

+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • top_level_only (bool) – True will return only top-level nodes with non-zero transforms.

  • +
  • reset (bool) – True will reset the transform to zero, else False to return the data.

  • +
+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_is_instance(input_data: alias_api.TraverseDagInputData, expand: bool = False) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes that are instances.

+
+
A node is considered an instance if:
    +
  • it is a group node

  • +
  • it shares its children with another sibling group node; e.g. when groupNode.isInstanced() = true

  • +
  • its previous sibling node is an instance; e.g. when groupNode.prevInstance() is not null

  • +
+
+
+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • expand (bool) – True will expand the instances, else False to return the data. Defaults to False.

  • +
+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_is_template(input_data: alias_api.TraverseDagInputData) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes that are templates.

+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+

input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_layer_does_not_match_parent_layer(input_data: alias_api.TraverseDagInputData, return_parent: bool = False) alias_api.TraverseDagOutputData
+

Search the entire DAG for nodes that do not have the same layer assigned as their parent node.

+

The input_data will be used to filter the output data results. See TraverseDagInputData +for more details on how to filter the output data.

+

NOTE: this is a customized traverse_dag function optimized for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • return_parent (bool) – True will return the parent of the node that does not match its parent +layer, else False to return the node itself. Default is False.

  • +
+
+
Returns
+

The status code result of the traversal.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.search_node_unused_curves_on_surface(input_data: alias_api.TraverseDagInputData, delete_unused: bool = False) alias_api.TraverseDagOutputData
+

Search the DAG for nodes that have unused curves on surface.

+

A curve on surface is unused if it is not being used to trim the +surface it is on.

+

The input_data will be used to filter the output data results. +See TraverseDagInputData for more details on how to filter the +output data.

+

Instanced nodes will be skipped.

+

NOTE: this is a customized traverse_dag function optimized +for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • delete_unused (bool) – True to delete the unused curves on +surface that are found, else False to return the data. +Default is False.

  • +
+
+
Returns
+

The found unused curves on surface.

+
+
Return type
+

TraverseDagOutputData

+
+
+
+ +
+
+alias_api.search_node_unused_curves_on_surface_with_history(input_data: alias_api.TraverseDagInputData, delete_history: bool = False) alias_api.TraverseDagOutputData
+

Search the DAG for nodes that have unused curves on surface.

+

A curve on surface is unused if it is not being used to trim the +surface it is on.

+

The input_data will be used to filter the output data results. +See TraverseDagInputData for more details on how to filter the +output data.

+

Instanced nodes will be skipped.

+

NOTE: this is a customized traverse_dag function optimized +for this specific use case.

+
+
Parameters
+
    +
  • input_data (TraverseDagInputData) – The input data to pass to the DAG traversal

  • +
  • delete_history (bool) – True to delete the unused curves on +surface that are found, else False to return the data. +Default is False.

  • +
+
+
Returns
+

The found unused curves on surface.

+
+
Return type
+

TraverseDagOutputData

+
+
+
+ +
+
+alias_api.set_layer_symmetry(*args, **kwargs)
+

Overloaded function.

+
    +
  1. set_layer_symmetry(layers: List[alias_api.AlLayer], symmetric: bool) -> int

    +
    +

    Set the symmetry of the given list of layers.

    +
    +
    param layers
    +

    The layers to set the symmetry on.

    +
    +
    type layers
    +

    List[AlLayer]

    +
    +
    param symmetric
    +

    True will set the layer to be symmetric, False will set the layer to be non-symmetric.

    +
    +
    type symmetric
    +

    bool

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. set_layer_symmetry(layer_name: List[str], symmetric: bool) -> int

    +
    +

    Set the symmetry of the given list of layers by name.

    +
    +
    param layer_names
    +

    The names of the layers to set the symmetry on.

    +
    +
    type layer_names
    +

    List[str]

    +
    +
    param symmetric
    +

    True will set the layer to be symmetric, False will set the layer to be non-symmetric.

    +
    +
    type symmetric
    +

    bool

    +
    +
    return
    +

    The status code result of the operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.set_parent_window(hwnd: int) None
+

Set the parent window of the specified child window to the main Alias window.

+
+ +
+
+alias_api.set_retrieve_options(options: AlRetrieveOptions) int
+

Set the options used by retrieve().

+
+
Returns
+

The status code result of the operation: +Success - the options were set succesfully. +InvalidArgument - ‘options’ was NULL, or a parameter in ‘options’ was

+
+

out of range.

+
+

Failure - AlUniverse was not initialized.

+

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+alias_api.set_store_options(options: AlStoreOptions) int
+

Set the options used by store().

+
+
Returns
+

The status code result of the operation: +Success - the options were set succesfully. +InvalidArgument - ‘options’ was NULL, or a parameter in ‘options’ was

+
+

out of range.

+
+

Failure - AlUniverse was not initialized.

+

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+alias_api.store(*args, **kwargs)
+

Overloaded function.

+
    +
  1. store(file_name: str, dag_node: alias_api.AlDagNode = 0) -> int

    +
    +

    If the AlDagNode argument is absent or NULL then this method +stores all the AlObjects in the universe to a file as an +Alias Wire file. +If the AlDagNode argument is not NULL then only the model below +the AlDagNode is stored. If the AlDagNode is in the middle of +a hierarchy, the AlDagNodes above the argument will also be +stored so as to preserve transformations on the model.

    +
    +
    param file_name
    +

    The name of the file to be stored

    +
    +
    type file_name
    +

    str

    +
    +
    param dag_node
    +

    See description

    +
    +
    type dag_node
    +

    AlDagNode

    +
    +
    return
    +

    The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly

    +
    +
    +
    +
  2. +
  3. store(file_name: str, dag_node: alias_api.AlDagNode, embed_image_references: bool, include_installed_images: bool, file_type: alias_api.AlFileType = <AlFileType.Wire: 1>) -> int

    +
    +

    If the AlDagNode argument is absent or NULL then this method +stores all the AlObjects in the universe to a file as an +Alias Wire file. +If the AlDagNode argument is not NULL then only the model below +the AlDagNode is stored. If the AlDagNode is in the middle of +a hierarchy, the AlDagNodes above the argument will also be +stored so as to preserve transformations on the model.

    +

    The embedImageReferences flag can be used to set the option +for saving Embedded Images with the wirefile.

    +

    The includeInstalledImages flag can be used to set the option +for saving including installed images with the +embedded references in the wirefile.

    +
    +
    param file_name
    +

    The name of the file to be stored

    +
    +
    type file_name
    +

    str

    +
    +
    param dag_node
    +

    See description

    +
    +
    type dag_node
    +

    AlDagNode

    +
    +
    param embed_image_references
    +

    See description

    +
    +
    type embed_image_references
    +

    bool

    +
    +
    param include_installed_images
    +

    See description

    +
    +
    type include_installed_images
    +

    bool

    +
    +
    param file_type
    +

    The type of the file to store, see AlFileType

    +
    +
    type file_type
    +

    AlFileType

    +
    +
    return
    +

    The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly

    +
    +
    +
    +
  4. +
  5. store(filename: str, active: bool, file_type: alias_api.AlFileType = <AlFileType.Wire: 1>) -> int

    +
    +

    This is a very early implementation of a general file saving method. +It accepts a filename, active flag and a file type. Currently it +will only store wire files, iges files, and dxf files, as well as +IGES derivatives C4, Jamias and VDAIS and VDAFS.

    +
    +
    param fileName
    +

    The name of the file to be stored.

    +
    +
    param active
    +

    Store all or just the selected objects.

    +
    +
    param filetype
    +

    The type of file to save.

    +
    +
    return The status code result
    +

    Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  6. +
+
+ +
+
+alias_api.store_active(file_name: str, file_type: alias_api.AlFileType = <AlFileType.Wire: 1>) int
+

This method allows the user to store only those +objects which are on the pick list.

+
+
Parameters
+
    +
  • file_name (str) – The name of the file to be stored

  • +
  • file_type (AlFileType) – The type of the file to store, see AlFileType

  • +
+
+
Returns
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly

+
+
+
+ +
+
+alias_api.store_current_window(filename: str, width: int = 1280, height: int = 1024, anit_alias: bool = False) int
+

Save the current Alias window to a file.

+
+
Supported file formats include:
    +
  • TIFF (*.tif)

  • +
  • JPEG Files (*.jpg)

  • +
  • Bitmap Image Files (*.bmp)

  • +
+
+
+
+
Parameters
+
    +
  • filename (str) – The path to the file, including file name, to save the resulting image to.

  • +
  • width (int) – The width (in pixels) of the resulting image. Defaults to 1280.

  • +
  • height (int) – The height (in pixels) of the resulting image. Defaults to 1024.

  • +
  • anti_alias (bool) – True to apply anti-aliasing to the resulting image, else False to not apply anti-aliasing. Defaults to False.

  • +
+
+
Returns
+

The resulting status code of the operation.

+
+
Return type
+

AlStatusCode

+
+
+
+ +
+
+alias_api.store_options() Tuple[int, AlStoreOptions]
+

Get the options used by store().

+
+
Returns
+

A tuple containing: +(1) the status code result of the operation:

+
+

Success - the options were returned succesfully. +Failure - AlUniverse was not initialized.

+
+
    +
  1. The options used by store().

  2. +
+

+
+
Return type
+

tuple<AlStatusCode, AlStoreOptions>

+
+
+
+ +
+
+alias_api.tessellate_adaptive(node: alias_api.AlDagNode, type: alias_api.AlTessellateTypes, min: int, max: int, threshold: float, uniformUV: int) Tuple[int, alias_api.AlDagNode]
+

This method causes geometry below the AlDagNode to be subdivided into polygons depending on the curvature +of the surface. Each spline patch will be converted into the minimum allowable number of polygons that +satisfy the threshold parameter. If the threshold can not be satisfied by subdividing within the maximum +number of subdivisions then the maximum subdivisions value will be used. When converting face nodes, +adaptive subdivision cannot be used. Uniform subdivision is used with a spacing of ‘uniformUV’.

+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • type – kTESSELATE_TRIANGLE or kTESSELATE_QUADRILATERAL.

  • +
  • min – The minimum number of times the surface will be subdivided meet the threshold (minimum of 1 ).

  • +
  • max – The maximum number of times the surface will be subdivided meet the threshold (minimum of 1 ).

  • +
  • threshold – The accuracy of the approximation (between 0 and 1). Higer values give a better approximations.

  • +
  • uniformUV – Uniform value used when handing FaceNodes.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_chord_height_deviation(node: alias_api.AlDagNode, tolerance: float) Tuple[int, alias_api.AlDagNode]
+
+
This method tessellates a dag using a chord height deviation tolerance. The chord height deviation

specifies the maximum distance that a triangle will be away from the surface boundary that it +will be representing.

+
+
+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • tolerance – Chord height deviation.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_chord_height_deviation_accurate(node: alias_api.AlDagNode, tolerance: float) Tuple[int, alias_api.AlDagNode]
+
+

This method tessellates a dag node using a chord height deviation tolerance and the accurate tessellator. +The chord height deviation specifies the maximum distance that a triangle will be away from the +surface boundary that it will be representing.

+
+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • tolerance – Chord height deviation.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_chord_height_deviation_fast(node: alias_api.AlDagNode, tolerance: float) Tuple[int, alias_api.AlDagNode]
+

This method tessellates a dag using a chord height deviation tolerance. The chord height deviation +specifies the maximum distance that a triangle will be away from the surface boundary that it will +be representing.

+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • tolerance – Chord height deviation.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_number(node: alias_api.AlDagNode, type: alias_api.AlTessellateTypes, total: int, count_tol: int, curve_tol: float) Tuple[int, alias_api.AlDagNode]
+

This method repeatedly tessellates the surfaces with different adaptive subdivision parameters until +settings are found that produce a total polygon count close to the requested number. If the requested +polygon count cannot be satisfied within the given search tolerance, this function will return either +the closest tessellation found that is below the requested total or the minimum number of polygons +that it can possibly create. Unlike the interactive method there is no way to abandon this process prematurely.

+

Since the number of polygons that a spline surface may be tessellated into is not a continuous function +it may not be possible to achieve the desired number of polygons exactly. To prevent the search from +continuing infinitely, there are tolerances that limit the tesselation. When a test tesselation finds +parameter settings that give a polygon count that is between total - count_tol and total + count_tol +the search is stopped. Further since it may not be possible to find a tesselation that satisfies the +requested total within the given count tolerance this parameter allows the search to be ended when +the changes the function makes to the adaptive subdivision curvature threshold parameter +falls below curve_tol.

+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • type – kTESSELATE_TRIANGLE or kTESSELATE_QUADRILATERAL.

  • +
  • total – The number of polygons desired (minimum of 1 ).

  • +
  • count_tol – How close to the total is acceptable (minimum of 0).

  • +
  • curve_tol – The adaptive subdivision tolerance (between 0 and 1). Lower values give a better approximation.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_render_settings(node: alias_api.AlDagNode, type: alias_api.AlTessellateTypes) Tuple[int, alias_api.AlDagNode]
+
+

This method causes the geometry below the AlDagNode to be subdivided into polygons in according to +the current AlRender parameters.

+
+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • type – kTESSELATE_TRIANGLE or kTESSELATE_QUADRILATERAL.

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.tessellate_uniform(node: alias_api.AlDagNode, type: alias_api.AlTessellateTypes, alongU: int, alongV: int) Tuple[int, alias_api.AlDagNode]
+

This method causes the geometry below the AlDagNode to be subdivided into polygons in a uniform manner. +Each spline patch will be converted into a fixed number of polygons. This method should not be used on +trimmed geometry as it will fail; instead, you should use the adaptive method below.

+
+
Parameters
+
    +
  • node – The AlDagNode above the geometry to tessellate.

  • +
  • type – kTESSELATE_TRIANGLE or kTESSELATE_QUADRILATERAL.

  • +
  • alongU – The number of subdivisions in the U direction (minimum of 1).

  • +
  • alongV – The number of subdivisions in the V direction (minimum of 1).

  • +
+
+
Return A tuple containing status and dagNode
+

The status code result: +Success - the file was stored successfully +Failure - the wire file could not be stored properly +InvalidArgument - unrecognized file type or fileName is NULL.

+

The resulting mesh Dag Node.

+
+
+
+ +
+
+alias_api.traverse_dag(*args, **kwargs)
+

Overloaded function.

+
    +
  1. traverse_dag(node_callback: Callable[[alias_api.AlDagNode], int]) -> alias_api.TraverseDagOutputData

    +
    +

    Traverse the entire DAG and trigger the provided callback for each node.

    +

    For each node in the DAG, the node_callback will be called with the current node being +traversed. The node_callback will determine if the current node will be accepted (included) +in the traversal output data.

    +
    +
    param node_callback
    +

    The node callback during traversal for all nodes

    +
    +
    type node_callback
    +

    function(AlDagNode) -> int(AlStatusCode)

    +
    +
    return
    +

    The output data from the DAG traversal.

    +
    +
    rtype
    +

    TraverseDagOutputData

    +
    +
    +
    +
  2. +
  3. traverse_dag(group_node_callback: Callable[[alias_api.AlDagNode], int], leaf_node_callback: Callable[[alias_api.AlDagNode], int]) -> alias_api.TraverseDagOutputData

    +
    +

    Traverse the entire DAG and trigger the provided callback for each node.

    +

    For each node in the DAG, the one of the provided callbacks will be called with the current +node being traversed. The callback will determine if the current node will be accepted +(included) in the traversal output data.

    +
    +
    param group_node_callback
    +

    The node callback during traversal for group nodes

    +
    +
    type group_node_callback
    +

    function(AlDagNode) -> int(AlStatusCode)

    +
    +
    param leaf_node_callback
    +

    The node callback during traversal for leaf nodes

    +
    +
    type leaf_node_callback
    +

    function(AlDagNode) -> int(AlStatusCode)

    +
    +
    return
    +

    The output data from the DAG traversal.

    +
    +
    rtype
    +

    TraverseDagOutputData

    +
    +
    +
    +
  4. +
  5. traverse_dag(root: alias_api.AlDagNode, group_node_callback: Callable[[alias_api.AlDagNode], int], leaf_node_callback: Callable[[alias_api.AlDagNode], int]) -> alias_api.TraverseDagOutputData

    +
    +

    Traverse the DAG starting at the root node, and trigger the provided callbacks for each node.

    +

    For each node in the DAG, the one of the provided callbacks will be called with the current +node being traversed. The callback will determine if the current node will be accepted +(included) in the traversal output data.

    +
    +
    param root
    +

    The root node to start the traversal at

    +
    +
    type root
    +

    AlDagNode

    +
    +
    param group_node_callback
    +

    The node callback during traversal for group nodes

    +
    +
    type group_node_callback
    +

    function(AlDagNode) -> int(AlStatusCode)

    +
    +
    param leaf_node_callback
    +

    The node callback during traversal for leaf nodes

    +
    +
    type leaf_node_callback
    +

    function(AlDagNode) -> int(AlStatusCode)

    +
    +
    return
    +

    The output data from the DAG traversal.

    +
    +
    rtype
    +

    TraverseDagOutputData

    +
    +
    +
    +
  6. +
+
+ +
+
+alias_api.ungroup(*args, **kwargs)
+

Overloaded function.

+
    +
  1. ungroup(node: alias_api.AlDagNode, ungroup_option: alias_api.UngroupOption, preserve_position: bool = True) -> int

    +
    +

    Ungroup the specified group nodes.

    +

    The specified group node will be removed from the DAG, and all its children will be moved +to the parent of the group node.

    +
    +
    return
    +

    The status code result of the ungroup operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  2. +
  3. ungroup(node: List[alias_api.AlDagNode], ungroup_option: alias_api.UngroupOption, preserve_position: bool = True) -> int

    +
    +

    Ungroup the specified group nodes.

    +

    The specified group node will be removed from the DAG, and all its children will be moved +to the parent of the group node.

    +
    +
    return
    +

    The status code result of the ungroup operation.

    +
    +
    rtype
    +

    int(AlStatusCode)

    +
    +
    +
    +
  4. +
+
+ +
+
+alias_api.unpick(pickables: List[alias_api.AlPickable]) int
+

Unpick all the given objects.

+

The objects must be pickable.

+
+
Parameters
+

pickables (List[AlPickable]) – The list of pickables to unpick.

+
+
+
+ +
+
+alias_api.unpick_all_layers() int
+

Unpick all layers in the Alias Universe.

+
+
Returns
+

The status code result of the operation. +Success - everything was successfully unpicked. +Failure - not all locators were successfully unpicked.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.unpick_all_locators() int
+

Unpick all locators.

+
+
Returns
+

The status code result +Success - everything was successfully unpicked. +Failure - not all locators were successfully unpicked.

+
+
Return type
+

int(AlStatusCode)

+
+
+
+ +
+
+alias_api.update_reference(old_path: str, new_path: str) alias_api.AlReferenceFile
+

Update an AlReferenceFile path with the new path provided.

+
+ +
+
+alias_api.zero_transform(*args, **kwargs)
+

Overloaded function.

+
    +
  1. zero_transform() -> int

  2. +
+

Apply zero transform to all dag nodes currently in the pick list.

+
    +
  1. zero_transform(node_name: str, clear_pick_list: bool = False) -> int

  2. +
+

Apply zero transform to all nodes that match the given name.

+
    +
  1. zero_transform(node: alias_api.AlDagNode) -> int

  2. +
+

Apply the zero transform to the given dag node.

+
    +
  1. zero_transform(nodes: List[alias_api.AlDagNode]) -> int

  2. +
+

Apply the zero transform to the given list of dag nodes.

+
+ +
+
+alias_api.zero_transform_top_level() int
+

Apply zero transform to all top-level dag nodes in the universe.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/search.html b/_static/alias_api/2024.0/search.html new file mode 100644 index 00000000..54e6e2f4 --- /dev/null +++ b/_static/alias_api/2024.0/search.html @@ -0,0 +1,119 @@ + + + + + + Search — Alias Python API documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/_static/alias_api/2024.0/searchindex.js b/_static/alias_api/2024.0/searchindex.js new file mode 100644 index 00000000..1a810b72 --- /dev/null +++ b/_static/alias_api/2024.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["_autosummary/alias_api","changes","index","module_summary","reference"],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:56},filenames:["_autosummary\\alias_api.rst","changes.rst","index.rst","module_summary.rst","reference.rst"],objects:{"":{alias_api:[4,0,0,"-"]},"alias_api.AlAction":{channel_reference:[4,2,1,""],comment:[4,2,1,""],copy:[4,2,1,""],eval:[4,2,1,""],extrap_type_post:[4,2,1,""],extrap_type_pre:[4,2,1,""],name:[4,3,1,""],num_channel_references:[4,2,1,""],set_comment:[4,2,1,""],set_extrap_type_post:[4,2,1,""],set_extrap_type_pre:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlActionExtrapType":{name:[4,3,1,""]},"alias_api.AlAngleLocator":{angle:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],end_point:[4,2,1,""],mid_point:[4,2,1,""],offset:[4,2,1,""],set_offset:[4,2,1,""],set_true_display:[4,2,1,""],set_world_space_offset:[4,2,1,""],start_point:[4,2,1,""],true_display:[4,2,1,""],type:[4,2,1,""],world_space_offset:[4,2,1,""]},"alias_api.AlAnimatable":{apply_iterator_to_channels:[4,2,1,""],delete_animation:[4,2,1,""],find_channel:[4,2,1,""],first_channel:[4,2,1,""],global_param:[4,2,1,""],global_param_list:[4,2,1,""],local_param:[4,2,1,""],local_param_list:[4,2,1,""],next_channel:[4,2,1,""],prev_channel:[4,2,1,""],sample_channel:[4,2,1,""],set_global_param:[4,2,1,""],set_local_param:[4,2,1,""]},"alias_api.AlAnnotationLocator":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],left_justify:[4,2,1,""],length:[4,2,1,""],local_leader_position:[4,2,1,""],offset:[4,2,1,""],point:[4,2,1,""],set_left_justify:[4,2,1,""],set_length:[4,2,1,""],set_local_leader_position:[4,2,1,""],set_offset:[4,2,1,""],set_show_arrow:[4,2,1,""],set_world_leader_position:[4,2,1,""],show_arrow:[4,2,1,""],string:[4,3,1,""],type:[4,2,1,""],world_leader_position:[4,2,1,""]},"alias_api.AlArcAttributes":{calculate_start_and_end_andles:[4,2,1,""],center_point:[4,2,1,""],copy_wrapper:[4,2,1,""],end_point:[4,2,1,""],radius:[4,2,1,""],set_end_point:[4,2,1,""],set_radius:[4,2,1,""],set_start_point:[4,2,1,""],set_sweep_from_end_point:[4,2,1,""],set_sweep_from_start_point:[4,2,1,""],start_point:[4,2,1,""],sweep:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlAttributes":{copy_wrapper:[4,2,1,""],next_attribute:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlCamera":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],name:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlCameraNode":{camera:[4,2,1,""],copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],is_eye_node:[4,2,1,""],is_instanceable:[4,2,1,""],is_up_node:[4,2,1,""],is_view_node:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlChannel":{animated_item:[4,2,1,""],applied_action:[4,2,1,""],applied_action_component:[4,2,1,""],apply_warp:[4,2,1,""],apply_warp_o:[4,2,1,""],channel_type:[4,2,1,""],copy:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],eval:[4,2,1,""],expression_string:[4,2,1,""],link:[4,2,1,""],num_applied_actions:[4,2,1,""],parameter:[4,2,1,""],parameter_name:[4,2,1,""],remove_warp:[4,2,1,""],sample:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlChannelDataType":{name:[4,3,1,""]},"alias_api.AlCloud":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],name:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlCluster":{apply_iterator_to_members:[4,2,1,""],cluster_node:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],is_empty:[4,2,1,""],next_cluster:[4,2,1,""],number_of_members:[4,2,1,""],prev_cluster:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlClusterMember":{cluster:[4,2,1,""],copy_wrapper:[4,2,1,""],next_cluster_member:[4,2,1,""],next_cluster_member_d:[4,2,1,""],object:[4,2,1,""],prev_cluster_member:[4,2,1,""],prev_cluster_member_d:[4,2,1,""],remove_from_cluster:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlClusterNode":{cluster:[4,2,1,""],copy_wrapper:[4,2,1,""],is_instanceable:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlClusterable":{add_to_cluster:[4,2,1,""],apply_iterator_to_clusters:[4,2,1,""],first_cluster:[4,2,1,""],is_cluster_member:[4,2,1,""],next_cluster:[4,2,1,""],next_cluster_d:[4,2,1,""],percent_effect:[4,2,1,""],prev_cluster:[4,2,1,""],prev_cluster_d:[4,2,1,""],remove_from_all_clusters:[4,2,1,""],remove_from_cluster:[4,2,1,""],set_percent_effect:[4,2,1,""]},"alias_api.AlConicAttributes":{center_point:[4,2,1,""],coefficients:[4,2,1,""],copy_wrapper:[4,2,1,""],end_point:[4,2,1,""],form:[4,2,1,""],start_point:[4,2,1,""],transform:[4,2,1,""],type:[4,2,1,""],z_displacement:[4,2,1,""]},"alias_api.AlConicType":{name:[4,3,1,""]},"alias_api.AlConstructionEntity":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],invisible:[4,3,1,""],layer:[4,3,1,""],name:[4,3,1,""],templated:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlConstructionPlane":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],first:[4,2,1,""],second:[4,2,1,""],third:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlCoordinateSystem":{name:[4,3,1,""]},"alias_api.AlCopyOptions":{copy_animation:[4,2,1,""],copy_clusters:[4,2,1,""],instance_copy:[4,2,1,""],num_copies:[4,2,1,""],rotation:[4,2,1,""],scale:[4,2,1,""],set_copy_animation:[4,2,1,""],set_copy_clusters:[4,2,1,""],set_instance_copy:[4,2,1,""],set_num_copies:[4,2,1,""],set_rotation:[4,2,1,""],set_scale:[4,2,1,""],set_time_offset:[4,2,1,""],set_translation:[4,2,1,""],time_offset:[4,2,1,""],translation:[4,2,1,""]},"alias_api.AlCurve":{adjust_end_span:[4,2,1,""],append:[4,2,1,""],apply_iterator_to_cvs:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],create_arc:[4,2,1,""],create_conic:[4,2,1,""],create_ellipse:[4,2,1,""],create_hyperbola:[4,2,1,""],create_line:[4,2,1,""],create_parabola:[4,2,1,""],create_point:[4,2,1,""],curve_node:[4,2,1,""],cvs_affected_position:[4,2,1,""],cvs_affected_position_incl_multiples:[4,2,1,""],cvs_unaffected_position:[4,2,1,""],cvs_unaffected_position_incl_multiples:[4,2,1,""],cvs_world_position:[4,2,1,""],cvs_world_position_incl_multiples:[4,2,1,""],degree:[4,2,1,""],delete_object:[4,2,1,""],do_updates:[4,2,1,""],eval:[4,2,1,""],extend_curve:[4,2,1,""],first_attribute:[4,2,1,""],first_cv:[4,2,1,""],form:[4,2,1,""],get_cv:[4,2,1,""],increment_degree:[4,2,1,""],insert:[4,2,1,""],is_display_mode_set:[4,2,1,""],knot_vector:[4,2,1,""],length:[4,2,1,""],normal:[4,2,1,""],number_of_cvs:[4,2,1,""],number_of_cvs_incl_multiples:[4,2,1,""],number_of_knots:[4,2,1,""],number_of_spans:[4,2,1,""],periodic_to_non_periodic:[4,2,1,""],real_knot_vector:[4,2,1,""],real_number_of_knots:[4,2,1,""],replace:[4,2,1,""],reverse_curve:[4,2,1,""],set_cvs_unaffected_position:[4,2,1,""],set_cvs_unaffected_position_incl_multiples:[4,2,1,""],set_display_mode:[4,2,1,""],set_knot_vector:[4,2,1,""],set_real_knot_vector:[4,2,1,""],trim_curve:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlCurveAttributes":{copy_wrapper:[4,2,1,""],cvs_unaffected_position:[4,2,1,""],degree:[4,2,1,""],form:[4,2,1,""],knot_vector:[4,2,1,""],number_of_cvs:[4,2,1,""],number_of_knots:[4,2,1,""],number_of_spans:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlCurveCV":{copy_wrapper:[4,2,1,""],curve:[4,2,1,""],do_updates:[4,2,1,""],index:[4,2,1,""],multiplicity:[4,2,1,""],next:[4,2,1,""],prev:[4,2,1,""],set_multiplicity:[4,2,1,""],set_unaffected_position:[4,2,1,""],set_world_position:[4,2,1,""],type:[4,2,1,""],unaffected_position:[4,2,1,""],world_position:[4,2,1,""]},"alias_api.AlCurveFormType":{name:[4,3,1,""]},"alias_api.AlCurveNode":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],curve:[4,2,1,""],delete_object:[4,2,1,""],join:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlCurveNodeJoinErrors":{name:[4,3,1,""]},"alias_api.AlCurveOnSurface":{control_point:[4,2,1,""],copy_wrapper:[4,2,1,""],degree:[4,2,1,""],delete_object:[4,2,1,""],form:[4,2,1,""],in_trim:[4,2,1,""],insert:[4,2,1,""],knot_value:[4,2,1,""],next_curve_on_surface:[4,2,1,""],number_of_control_points:[4,2,1,""],number_of_knots:[4,2,1,""],number_of_spans:[4,2,1,""],prev_curve_on_surface:[4,2,1,""],real_number_of_knots:[4,2,1,""],reverse:[4,2,1,""],set_control_point:[4,2,1,""],set_knot_value:[4,2,1,""],set_visible:[4,2,1,""],surface:[4,2,1,""],type:[4,2,1,""],visible:[4,2,1,""]},"alias_api.AlCurveOnSurfacePoint":{arc_length:[4,2,1,""],attached_to:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],normal1:[4,2,1,""],normal2:[4,2,1,""],parameter:[4,2,1,""],set_parameter:[4,2,1,""],tangent:[4,2,1,""],type:[4,2,1,""],world_position:[4,2,1,""]},"alias_api.AlCurvePoint":{arc_length:[4,2,1,""],attached_to:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],normal1:[4,2,1,""],normal2:[4,2,1,""],parameter:[4,2,1,""],radius:[4,2,1,""],set_parameter:[4,2,1,""],tangent:[4,2,1,""],type:[4,2,1,""],world_position:[4,2,1,""]},"alias_api.AlDagNode":{add_joint:[4,2,1,""],add_sibling_node:[4,2,1,""],affected_transformation_matrix:[4,2,1,""],bounding_box:[4,2,1,""],comment:[4,2,1,""],copy_object:[4,2,1,""],copy_transform:[4,2,1,""],copy_wrapper:[4,2,1,""],create_symmetric_geometry:[4,2,1,""],delete_object:[4,2,1,""],do_updates:[4,2,1,""],get_surface_orientation:[4,2,1,""],global_transformation_matrix:[4,2,1,""],inverse_global_transformation_matrix:[4,2,1,""],is_a_construction_plane:[4,2,1,""],is_ancestor_an_instance:[4,2,1,""],is_display_mode_set:[4,2,1,""],is_instanceable:[4,2,1,""],is_instanced:[4,2,1,""],layer:[4,2,1,""],local_rotate_by:[4,2,1,""],local_rotation_angles:[4,2,1,""],local_rotation_axes:[4,2,1,""],local_transformation_matrix:[4,2,1,""],local_translate_by:[4,2,1,""],name:[4,3,1,""],next_node:[4,2,1,""],parent_node:[4,2,1,""],prev_node:[4,2,1,""],remove_blind_data:[4,2,1,""],remove_comment:[4,2,1,""],remove_joint:[4,2,1,""],rotate_pivot:[4,2,1,""],rotation:[4,2,1,""],scale:[4,2,1,""],scale_pivot:[4,2,1,""],search_across:[4,2,1,""],search_below:[4,2,1,""],send_geometry_modified_message:[4,2,1,""],set_blind_data:[4,2,1,""],set_comment:[4,2,1,""],set_display_mode:[4,2,1,""],set_layer:[4,2,1,""],set_local_rotation_angles:[4,2,1,""],set_local_rotation_axes:[4,2,1,""],set_rotate_pivot:[4,2,1,""],set_rotation:[4,2,1,""],set_scale:[4,2,1,""],set_scale_pivot:[4,2,1,""],set_surface_orientation:[4,2,1,""],set_translation:[4,2,1,""],set_world_translation:[4,2,1,""],translation:[4,2,1,""],type:[4,2,1,""],update_draw_info:[4,2,1,""],version:[4,2,1,""]},"alias_api.AlDeviationLocator":{attached_to:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],deviation:[4,2,1,""],deviation_components:[4,2,1,""],left_justify:[4,2,1,""],length:[4,2,1,""],offset:[4,2,1,""],parameter:[4,2,1,""],parameter_target_curve:[4,2,1,""],set_left_justify:[4,2,1,""],set_length:[4,2,1,""],set_offset:[4,2,1,""],set_parameter:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlDisplayModeType":{name:[4,3,1,""]},"alias_api.AlDistanceLocator":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],distance:[4,2,1,""],end_point:[4,2,1,""],length:[4,2,1,""],offset:[4,2,1,""],set_offset:[4,2,1,""],set_true_display:[4,2,1,""],start_point:[4,2,1,""],true_display:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlEnvironment":{add_texture:[4,2,1,""],apply_iterator_to_textures:[4,2,1,""],copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],fields:[4,2,1,""],first_texture:[4,2,1,""],mapped_fields:[4,2,1,""],name:[4,3,1,""],next_texture:[4,2,1,""],parameter:[4,2,1,""],remove_texture:[4,2,1,""],set_parameter:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlFace":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],face_node:[4,2,1,""],first_shader:[4,2,1,""],get_layered_shader:[4,2,1,""],get_switch_shader:[4,2,1,""],next_face:[4,2,1,""],next_shader:[4,2,1,""],prev_face:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlFaceNode":{add_face:[4,2,1,""],convert_to_trimmed_surface:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],first_face:[4,2,1,""],normal:[4,2,1,""],remove_face:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlFileType":{name:[4,3,1,""]},"alias_api.AlGroupNode":{add_child_node:[4,2,1,""],add_children:[4,2,1,""],apply_iterator_to_children:[4,2,1,""],child_node:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],is_instance_node:[4,2,1,""],is_instanceable:[4,2,1,""],next_instance:[4,2,1,""],prev_instance:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlIKHandle":{copy_wrapper:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlIKHandleNode":{copy_wrapper:[4,2,1,""],ik_handle:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlIterator":{func:[4,2,1,""]},"alias_api.AlKeyframe":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],in_tangent:[4,2,1,""],is_locked:[4,2,1,""],location:[4,2,1,""],next:[4,2,1,""],out_tangent:[4,2,1,""],prev:[4,2,1,""],set_in_tangent:[4,2,1,""],set_location:[4,2,1,""],set_lock:[4,2,1,""],set_out_tangent:[4,2,1,""],set_tangent_types:[4,2,1,""],set_value:[4,2,1,""],tangent_types:[4,2,1,""],type:[4,2,1,""],value:[4,2,1,""]},"alias_api.AlLayer":{assign_child:[4,2,1,""],assign_parent:[4,2,1,""],assign_selection:[4,2,1,""],assign_sibling_on_left:[4,2,1,""],assign_sibling_on_right:[4,2,1,""],child_layer:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],create_folder:[4,2,1,""],delete_object:[4,2,1,""],draw_instances:[4,3,1,""],export_content_to_file:[4,2,1,""],get_assigned_nodes:[4,2,1,""],invisible:[4,3,1,""],is_assigned:[4,2,1,""],is_empty:[4,2,1,""],is_folder:[4,2,1,""],is_picked:[4,2,1,""],name:[4,3,1,""],next_layer:[4,2,1,""],number:[4,3,1,""],parent_layer:[4,2,1,""],pick:[4,2,1,""],pick_nodes:[4,2,1,""],prev_layer:[4,2,1,""],set_symmetric_normal:[4,2,1,""],set_symmetric_origin:[4,2,1,""],symmetric:[4,3,1,""],symmetric_normal:[4,2,1,""],symmetric_origin:[4,2,1,""],type:[4,2,1,""],unpick:[4,2,1,""]},"alias_api.AlLayeredShader":{add_shader:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],get_first_shader:[4,2,1,""],get_next_shader:[4,2,1,""],is_used:[4,2,1,""],name:[4,3,1,""],remove_shader:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlLight":{delete_object:[4,2,1,""],first_linked_object:[4,2,1,""],has_linked_objects:[4,2,1,""],light_node:[4,2,1,""],look_at_node:[4,2,1,""],name:[4,3,1,""],next_linked_object:[4,2,1,""],type:[4,2,1,""],up_node:[4,2,1,""]},"alias_api.AlLightNode":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],is_instanceable:[4,2,1,""],is_look_at_node:[4,2,1,""],is_position_node:[4,2,1,""],is_up_node:[4,2,1,""],light:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlLineAttributes":{copy_wrapper:[4,2,1,""],end_point:[4,2,1,""],set_end_point:[4,2,1,""],set_start_point:[4,2,1,""],start_point:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlList":{append:[4,2,1,""],clear:[4,2,1,""],first:[4,2,1,""],last:[4,2,1,""],remove:[4,2,1,""]},"alias_api.AlLocator":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],invisible:[4,3,1,""],is_picked:[4,2,1,""],layer:[4,3,1,""],name:[4,3,1,""],pick:[4,2,1,""],templated:[4,2,1,""],type:[4,2,1,""],unpick:[4,2,1,""]},"alias_api.AlMesh":{assign_layered_shader:[4,2,1,""],assign_shader:[4,2,1,""],assign_switch_shader:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],first_shader:[4,2,1,""],get_layered_shader:[4,2,1,""],get_switch_shader:[4,2,1,""],layer_shader:[4,2,1,""],mesh_node:[4,2,1,""],name:[4,3,1,""],next_shader:[4,2,1,""],normals:[4,2,1,""],number_of_triangles:[4,2,1,""],number_of_vertices:[4,2,1,""],triangles:[4,2,1,""],type:[4,2,1,""],uvs:[4,2,1,""],vertices:[4,2,1,""]},"alias_api.AlMeshNode":{copy_wrapper:[4,2,1,""],mesh:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlMessageType":{name:[4,3,1,""]},"alias_api.AlMinmaxLocator":{attached_to:[4,2,1,""],comb_density:[4,2,1,""],comb_display:[4,2,1,""],comb_scale:[4,2,1,""],comb_threshold:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],left_justify_max_distance:[4,2,1,""],left_justify_min_distance:[4,2,1,""],maximum_distance:[4,2,1,""],minimum_distance:[4,2,1,""],set_comb_density:[4,2,1,""],set_comb_display:[4,2,1,""],set_comb_scale:[4,2,1,""],set_comb_threshold:[4,2,1,""],set_left_justify_max_distance:[4,2,1,""],set_left_justify_min_distance:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlObject":{as_action_ptr:[4,2,1,""],as_angle_locator_ptr:[4,2,1,""],as_animatable_ptr:[4,2,1,""],as_annotation_locator_ptr:[4,2,1,""],as_arc_attributes_ptr:[4,2,1,""],as_attributes_ptr:[4,2,1,""],as_camera_node_ptr:[4,2,1,""],as_camera_ptr:[4,2,1,""],as_channel_ptr:[4,2,1,""],as_cloud_ptr:[4,2,1,""],as_cluster_member_ptr:[4,2,1,""],as_cluster_node_ptr:[4,2,1,""],as_cluster_ptr:[4,2,1,""],as_clusterable_ptr:[4,2,1,""],as_conic_attributes_ptr:[4,2,1,""],as_construction_entity_ptr:[4,2,1,""],as_construction_plane_ptr:[4,2,1,""],as_curve_attributes_ptr:[4,2,1,""],as_curve_cv_ptr:[4,2,1,""],as_curve_on_surface_point_ptr:[4,2,1,""],as_curve_on_surface_ptr:[4,2,1,""],as_curve_point_ptr:[4,2,1,""],as_curve_ptr:[4,2,1,""],as_dag_node_ptr:[4,2,1,""],as_deviation_locator_ptr:[4,2,1,""],as_distance_locator_ptr:[4,2,1,""],as_envronment_ptr:[4,2,1,""],as_face_node_ptr:[4,2,1,""],as_face_ptr:[4,2,1,""],as_group_node_ptr:[4,2,1,""],as_ik_handle_node_ptr:[4,2,1,""],as_ik_handle_ptr:[4,2,1,""],as_keyframe_ptr:[4,2,1,""],as_layer_ptr:[4,2,1,""],as_layered_shader_ptr:[4,2,1,""],as_light_node_ptr:[4,2,1,""],as_light_ptr:[4,2,1,""],as_line_attributes_ptr:[4,2,1,""],as_locator_ptr:[4,2,1,""],as_mesh_node_ptr:[4,2,1,""],as_mesh_ptr:[4,2,1,""],as_minmax_locator_ptr:[4,2,1,""],as_orthographic_camera_ptr:[4,2,1,""],as_param_action_ptr:[4,2,1,""],as_perspective_camera_ptr:[4,2,1,""],as_plane_attributes_ptr:[4,2,1,""],as_point_ptr:[4,2,1,""],as_radial_locator_ptr:[4,2,1,""],as_rev_surf_attributes_ptr:[4,2,1,""],as_set_member_ptr:[4,2,1,""],as_set_ptr:[4,2,1,""],as_settable_ptr:[4,2,1,""],as_shader_ptr:[4,2,1,""],as_shell_node_ptr:[4,2,1,""],as_shell_ptr:[4,2,1,""],as_space_point_ptr:[4,2,1,""],as_surface_node_ptr:[4,2,1,""],as_surface_point_ptr:[4,2,1,""],as_surface_ptr:[4,2,1,""],as_switch_shader_ptr:[4,2,1,""],as_texture_node_ptr:[4,2,1,""],as_texture_ptr:[4,2,1,""],copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],name:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlObjectType":{name:[4,3,1,""]},"alias_api.AlOrthographicCamera":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],name:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlParamAction":{add_keyframe:[4,2,1,""],add_keyframe_range:[4,2,1,""],apply_iterator_to_keyframes:[4,2,1,""],copy_wrapper:[4,2,1,""],delete_keyframe_range:[4,2,1,""],first_keyframe:[4,2,1,""],last_keyframe:[4,2,1,""],number_of_keyframes:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlPerspectiveCamera":{angle_of_view:[4,3,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],eye:[4,2,1,""],focus_length:[4,3,1,""],name:[4,3,1,""],set_world_eye:[4,2,1,""],set_world_up:[4,2,1,""],set_world_view:[4,2,1,""],type:[4,2,1,""],up:[4,2,1,""],view:[4,2,1,""],world_eye:[4,2,1,""],world_up:[4,2,1,""],world_view:[4,2,1,""]},"alias_api.AlPickable":{is_picked:[4,2,1,""],pick:[4,2,1,""],unpick:[4,2,1,""]},"alias_api.AlPlaneAttributes":{center_point:[4,2,1,""],coefficients:[4,2,1,""],copy_wrapper:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlPoint":{copy_wrapper:[4,2,1,""],type:[4,2,1,""],worldPosition:[4,2,1,""]},"alias_api.AlPointType":{name:[4,3,1,""]},"alias_api.AlRadialLocator":{attached_to:[4,2,1,""],center:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],diameter_create:[4,2,1,""],left_justify:[4,2,1,""],offset:[4,2,1,""],parameter:[4,2,1,""],radius:[4,2,1,""],set_left_justify:[4,2,1,""],set_offset:[4,2,1,""],set_parameter:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlReferenceFile":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],file_name:[4,3,1,""],get_alternatives:[4,2,1,""],name:[4,3,1,""],path:[4,3,1,""],source_path:[4,3,1,""],source_wirefile:[4,3,1,""],status:[4,2,1,""],type:[4,2,1,""],uuid:[4,3,1,""]},"alias_api.AlReferenceFileSet":{add_reference:[4,2,1,""],add_reference_file_to_alternative:[4,2,1,""],copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],get_references:[4,2,1,""],name:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlReferenceLayer":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],get_colour:[4,2,1,""],get_owner:[4,2,1,""],is_visible:[4,2,1,""],symmetric_normal:[4,2,1,""],symmetric_origin:[4,2,1,""],symmetry_state:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlRevSurfAttributes":{copy_wrapper:[4,2,1,""],end_angle:[4,2,1,""],start_angle:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSet":{apply_iterator_to_members:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],first_member:[4,2,1,""],is_empty:[4,2,1,""],is_exclusive:[4,2,1,""],name:[4,3,1,""],next_set:[4,2,1,""],number_of_members:[4,2,1,""],prev_set:[4,2,1,""],set_exclusive:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSetMember":{copy_wrapper:[4,2,1,""],next_set_member:[4,2,1,""],object:[4,2,1,""],prev_set_member:[4,2,1,""],remove_from_set:[4,2,1,""],set:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSettable":{add_to_set:[4,2,1,""],apply_iterator_to_sets:[4,2,1,""],first_set:[4,2,1,""],is_set_member:[4,2,1,""],next_set:[4,2,1,""],prev_set:[4,2,1,""],remove_from_all_sets:[4,2,1,""],remove_from_set:[4,2,1,""]},"alias_api.AlShader":{add_texture:[4,2,1,""],apply_iterator_to_textures:[4,2,1,""],copy_object:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],fields:[4,2,1,""],first_texture:[4,2,1,""],get_assigned_nodes:[4,2,1,""],is_assigned:[4,2,1,""],is_used:[4,2,1,""],mapped_fields:[4,2,1,""],name:[4,3,1,""],next_texture:[4,2,1,""],parameter:[4,2,1,""],remove_texture:[4,2,1,""],set_parameter:[4,2,1,""],shading_model:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlShadingFields":{name:[4,3,1,""]},"alias_api.AlShell":{assign_shader:[4,2,1,""],copy_wrapper:[4,2,1,""],first_shader:[4,2,1,""],get_layered_shader:[4,2,1,""],get_switch_shader:[4,2,1,""],layer_shader:[4,2,1,""],next_shader:[4,2,1,""],shell_node:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlShellNode":{copy_wrapper:[4,2,1,""],shell:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSpacePoint":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlStatusCode":{name:[4,3,1,""]},"alias_api.AlSurface":{assign_shader:[4,2,1,""],copy_wrapper:[4,2,1,""],create_sphere:[4,2,1,""],delete_object:[4,2,1,""],first_shader:[4,2,1,""],get_curves_on_surface:[4,2,1,""],get_layered_shader:[4,2,1,""],get_shaders:[4,2,1,""],get_switch_shader:[4,2,1,""],is_construction_history_resulting_surface:[4,2,1,""],layer_shader:[4,2,1,""],name:[4,3,1,""],next_shader:[4,2,1,""],surface_node:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSurfaceNode":{copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],has_history:[4,2,1,""],patch_precision:[4,2,1,""],set_patch_precision:[4,2,1,""],surface:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSurfacePoint":{attached_to:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlSwitchShader":{add_shader:[4,2,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],get_active_shader:[4,2,1,""],get_first_inactive_shader:[4,2,1,""],get_next_inactive_shader:[4,2,1,""],is_used:[4,2,1,""],name:[4,3,1,""],remove_shader:[4,2,1,""],set_active_shader:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlTM":{assign:[4,2,1,""],decompose:[4,2,1,""],diagonal:[4,2,1,""],get_tm:[4,2,1,""],identity:[4,2,1,""],inverse:[4,2,1,""],rotate:[4,2,1,""],rotate_x:[4,2,1,""],rotate_y:[4,2,1,""],rotate_z:[4,2,1,""],scale:[4,2,1,""],scale_nonp:[4,2,1,""],set_tm:[4,2,1,""],trans_normal:[4,2,1,""],trans_point:[4,2,1,""],trans_vector:[4,2,1,""],translate:[4,2,1,""],transpose:[4,2,1,""],zero:[4,2,1,""]},"alias_api.AlTangentType":{name:[4,3,1,""]},"alias_api.AlTessellateTypes":{name:[4,3,1,""]},"alias_api.AlTexture":{add_texture:[4,2,1,""],copy_wrapper:[4,2,1,""],field_type:[4,2,1,""],fields:[4,2,1,""],filename:[4,2,1,""],first_texture:[4,2,1,""],mapped_fields:[4,2,1,""],name:[4,3,1,""],next_texture:[4,2,1,""],parameter:[4,2,1,""],remove_texture:[4,2,1,""],set_filename:[4,2,1,""],set_parameter:[4,2,1,""],texture_node:[4,2,1,""],texture_type:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlTextureNode":{copy_wrapper:[4,2,1,""],delete_object:[4,2,1,""],texture:[4,2,1,""],type:[4,2,1,""]},"alias_api.AlTripleComponent":{name:[4,3,1,""]},"alias_api.AlWindow":{AlViewType:[4,1,1,""],camera:[4,3,1,""],copy_wrapper:[4,2,1,""],create:[4,2,1,""],delete_object:[4,2,1,""],get_resolution:[4,2,1,""],grid_size:[4,3,1,""],type:[4,2,1,""]},"alias_api.AlWindow.AlViewType":{name:[4,3,1,""]},"alias_api.LinearUnit":{name:[4,3,1,""]},"alias_api.Menu":{add_command:[4,2,1,""],add_menu:[4,2,1,""],clean:[4,2,1,""],remove:[4,2,1,""]},"alias_api.MessageResult":{attributes_1_name:[4,3,1,""],bool_value_1:[4,3,1,""],camera_1_name:[4,3,1,""],cloud_1_name:[4,3,1,""],curve_on_surface_1_name:[4,3,1,""],dag_node_1_name:[4,3,1,""],dag_node_2_name:[4,3,1,""],int_value_1:[4,3,1,""],int_value_2:[4,3,1,""],light_1_name:[4,3,1,""],locator_1_name:[4,3,1,""],message_type:[4,3,1,""],reference_file_1_name:[4,3,1,""],reference_file_1_path:[4,3,1,""],reference_file_set_1_name:[4,3,1,""],shader:[4,3,1,""],shader_1_name:[4,3,1,""],str_value_1:[4,3,1,""],surface_1_name:[4,3,1,""],texture_1_name:[4,3,1,""],tm_1:[4,3,1,""]},"alias_api.ReferenceFileStatus":{name:[4,3,1,""]},"alias_api.Stage":{name:[4,3,1,""],path:[4,3,1,""]},"alias_api.SymmetryState":{name:[4,3,1,""]},"alias_api.TraverseDagInputData":{layers:[4,3,1,""],layersInclusive:[4,3,1,""],nodeNamesInclusive:[4,3,1,""],nodeTypesInclusive:[4,3,1,""],node_names:[4,3,1,""],node_types:[4,3,1,""],shaders:[4,3,1,""],shadersInclusive:[4,3,1,""]},"alias_api.TraverseDagOutputData":{count:[4,3,1,""],curves_on_surface:[4,3,1,""],nodes:[4,3,1,""],status:[4,3,1,""]},"alias_api.Type":{name:[4,3,1,""]},"alias_api.UngroupOption":{name:[4,3,1,""]},"alias_api.Variant":{name:[4,3,1,""],path:[4,3,1,""]},"alias_api.Vec3":{cross:[4,2,1,""],magnitude:[4,2,1,""],normalize:[4,2,1,""],to_list:[4,2,1,""],x:[4,3,1,""],y:[4,3,1,""],z:[4,3,1,""]},"alias_api.VectorAlTangentType":{append:[4,2,1,""],clear:[4,2,1,""],count:[4,2,1,""],extend:[4,2,1,""],insert:[4,2,1,""],pop:[4,2,1,""],remove:[4,2,1,""]},alias_api:{AlAction:[4,1,1,""],AlActionExtrapType:[4,1,1,""],AlAngleLocator:[4,1,1,""],AlAnimatable:[4,1,1,""],AlAnnotationLocator:[4,1,1,""],AlArcAttributes:[4,1,1,""],AlAttributes:[4,1,1,""],AlCamera:[4,1,1,""],AlCameraNode:[4,1,1,""],AlChannel:[4,1,1,""],AlChannelDataType:[4,1,1,""],AlCloud:[4,1,1,""],AlCluster:[4,1,1,""],AlClusterMember:[4,1,1,""],AlClusterNode:[4,1,1,""],AlClusterable:[4,1,1,""],AlConicAttributes:[4,1,1,""],AlConicType:[4,1,1,""],AlConstructionEntity:[4,1,1,""],AlConstructionPlane:[4,1,1,""],AlCoordinateSystem:[4,1,1,""],AlCopyOptions:[4,1,1,""],AlCurve:[4,1,1,""],AlCurveAttributes:[4,1,1,""],AlCurveCV:[4,1,1,""],AlCurveFormType:[4,1,1,""],AlCurveNode:[4,1,1,""],AlCurveNodeJoinErrors:[4,1,1,""],AlCurveOnSurface:[4,1,1,""],AlCurveOnSurfacePoint:[4,1,1,""],AlCurvePoint:[4,1,1,""],AlDagNode:[4,1,1,""],AlDeviationLocator:[4,1,1,""],AlDisplayModeType:[4,1,1,""],AlDistanceLocator:[4,1,1,""],AlEnvironment:[4,1,1,""],AlFace:[4,1,1,""],AlFaceNode:[4,1,1,""],AlFileType:[4,1,1,""],AlGroupNode:[4,1,1,""],AlHashable:[4,1,1,""],AlIKHandle:[4,1,1,""],AlIKHandleNode:[4,1,1,""],AlIterator:[4,1,1,""],AlKeyframe:[4,1,1,""],AlLayer:[4,1,1,""],AlLayeredShader:[4,1,1,""],AlLight:[4,1,1,""],AlLightNode:[4,1,1,""],AlLineAttributes:[4,1,1,""],AlLinkItem:[4,1,1,""],AlList:[4,1,1,""],AlLocator:[4,1,1,""],AlMesh:[4,1,1,""],AlMeshNode:[4,1,1,""],AlMessageType:[4,1,1,""],AlMinmaxLocator:[4,1,1,""],AlObject:[4,1,1,""],AlObjectType:[4,1,1,""],AlOrthographicCamera:[4,1,1,""],AlParamAction:[4,1,1,""],AlPerspectiveCamera:[4,1,1,""],AlPickable:[4,1,1,""],AlPlaneAttributes:[4,1,1,""],AlPoint:[4,1,1,""],AlPointType:[4,1,1,""],AlRadialLocator:[4,1,1,""],AlReferenceFile:[4,1,1,""],AlReferenceFileSet:[4,1,1,""],AlReferenceLayer:[4,1,1,""],AlRetrieveOptions:[4,1,1,""],AlRevSurfAttributes:[4,1,1,""],AlSet:[4,1,1,""],AlSetMember:[4,1,1,""],AlSettable:[4,1,1,""],AlShader:[4,1,1,""],AlShadingFields:[4,1,1,""],AlShell:[4,1,1,""],AlShellNode:[4,1,1,""],AlSpacePoint:[4,1,1,""],AlStatusCode:[4,1,1,""],AlStoreOptions:[4,1,1,""],AlSurface:[4,1,1,""],AlSurfaceNode:[4,1,1,""],AlSurfacePoint:[4,1,1,""],AlSwitchShader:[4,1,1,""],AlTM:[4,1,1,""],AlTangentType:[4,1,1,""],AlTessellateTypes:[4,1,1,""],AlTexture:[4,1,1,""],AlTextureNode:[4,1,1,""],AlTripleComponent:[4,1,1,""],AlWindow:[4,1,1,""],AliasCompatibilityException:[4,4,1,""],AliasOpenModelException:[4,4,1,""],AliasPythonException:[4,4,1,""],LinearUnit:[4,1,1,""],Menu:[4,1,1,""],MenuItem:[4,1,1,""],MessageResult:[4,1,1,""],ReferenceFileStatus:[4,1,1,""],Stage:[4,1,1,""],SymmetryState:[4,1,1,""],TraverseDagInputData:[4,1,1,""],TraverseDagOutputData:[4,1,1,""],Type:[4,1,1,""],UngroupOption:[4,1,1,""],Variant:[4,1,1,""],Vec3:[4,1,1,""],VectorAlTangentType:[4,1,1,""],add_message_handler:[4,5,1,""],adjust_window:[4,5,1,""],al_are_equal:[4,5,1,""],al_is_valid:[4,5,1,""],apply_iterator_to_dag_nodes:[4,5,1,""],apply_iterator_to_shaders:[4,5,1,""],assign_children_to_parent_layer:[4,5,1,""],assign_nodes_to_layer:[4,5,1,""],cleanup_geometry_model:[4,5,1,""],clear_pick_list:[4,5,1,""],clear_queued_events:[4,5,1,""],convert_face_node_to_trimmed_surface_node:[4,5,1,""],convert_to_trimmed_surface_node:[4,5,1,""],copy_object:[4,5,1,""],copy_object_cleanup:[4,5,1,""],create_alternative:[4,5,1,""],create_construction_plane:[4,5,1,""],create_group_for_layer:[4,5,1,""],create_layer:[4,5,1,""],create_layer_folder:[4,5,1,""],create_layered_shader:[4,5,1,""],create_orthographic_camera:[4,5,1,""],create_perspective_camera:[4,5,1,""],create_reference:[4,5,1,""],create_reference_alternative:[4,5,1,""],create_shader:[4,5,1,""],create_stage:[4,5,1,""],create_switch_shader:[4,5,1,""],create_texture_node:[4,5,1,""],current_window:[4,5,1,""],delete_all:[4,5,1,""],delete_all_construction_entities:[4,5,1,""],delete_all_construction_history:[4,5,1,""],delete_all_locators:[4,5,1,""],delete_construction_history:[4,5,1,""],delete_dag_nodes_by_name:[4,5,1,""],delete_history:[4,5,1,""],delete_layers_by_name:[4,5,1,""],delete_null_nodes:[4,5,1,""],delete_sets_by_name:[4,5,1,""],do_updates:[4,5,1,""],expand_instances:[4,5,1,""],export_by_layer:[4,5,1,""],export_by_layer_sequentially:[4,5,1,""],find_dag_node_by_name:[4,5,1,""],find_top_level_dag_node_by_name:[4,5,1,""],first_construction_entity:[4,5,1,""],first_dag_node:[4,5,1,""],first_environment:[4,5,1,""],first_layer:[4,5,1,""],first_layered_shader:[4,5,1,""],first_locator:[4,5,1,""],first_pick_item:[4,5,1,""],first_set:[4,5,1,""],first_shader:[4,5,1,""],first_switch_shader:[4,5,1,""],flatten_group_nodes:[4,5,1,""],get_alternative_by_name:[4,5,1,""],get_alternatives:[4,5,1,""],get_annotation_locator_strings:[4,5,1,""],get_annotation_locators:[4,5,1,""],get_bounding_box_from_hanger:[4,5,1,""],get_children:[4,5,1,""],get_construction_plane_by_name:[4,5,1,""],get_current_path:[4,5,1,""],get_current_pick_item:[4,5,1,""],get_current_stage:[4,5,1,""],get_dag_nodes_by_name:[4,5,1,""],get_empty_layers:[4,5,1,""],get_empty_sets:[4,5,1,""],get_layer_by_name:[4,5,1,""],get_layer_by_number:[4,5,1,""],get_layered_shader_by_name:[4,5,1,""],get_layered_shader_by_node:[4,5,1,""],get_layered_shaders:[4,5,1,""],get_layers:[4,5,1,""],get_layers_by_name:[4,5,1,""],get_layers_using_multiple_shaders:[4,5,1,""],get_locator_by_name:[4,5,1,""],get_locators:[4,5,1,""],get_locators_by_name:[4,5,1,""],get_main_window_id:[4,5,1,""],get_nesting_groups:[4,5,1,""],get_perspective_camera_by_name:[4,5,1,""],get_perspective_cameras:[4,5,1,""],get_pick_item_dag_nodes:[4,5,1,""],get_pick_items:[4,5,1,""],get_product_information:[4,5,1,""],get_reference_by_name:[4,5,1,""],get_reference_by_path:[4,5,1,""],get_reference_by_uuid:[4,5,1,""],get_references:[4,5,1,""],get_references_by_name:[4,5,1,""],get_sets_by_name:[4,5,1,""],get_shader_by_name:[4,5,1,""],get_shaders:[4,5,1,""],get_shaders_by_name:[4,5,1,""],get_shaders_by_node:[4,5,1,""],get_stages:[4,5,1,""],get_switch_shader_by_name:[4,5,1,""],get_switch_shader_by_node:[4,5,1,""],get_switch_shaders:[4,5,1,""],get_top_dag_nodes:[4,5,1,""],get_variants:[4,5,1,""],has_annotation_locator:[4,5,1,""],has_construction_history:[4,5,1,""],has_history:[4,5,1,""],has_queued_events:[4,5,1,""],has_reference:[4,5,1,""],has_variants:[4,5,1,""],import_file:[4,5,1,""],import_reference:[4,5,1,""],import_subdiv:[4,5,1,""],import_subdivision:[4,5,1,""],initialize_universe:[4,5,1,""],is_construction_layer:[4,5,1,""],is_copy_of_vred_shader:[4,5,1,""],is_empty_file:[4,5,1,""],is_queuing_events:[4,5,1,""],is_stage_empty:[4,5,1,""],linear_scale:[4,5,1,""],linear_units:[4,5,1,""],log_message:[4,5,1,""],log_to_errlog:[4,5,1,""],log_to_prompt:[4,5,1,""],log_to_prompt_no_history:[4,5,1,""],log_to_stderr:[4,5,1,""],log_to_stdout:[4,5,1,""],next_construction_entity:[4,5,1,""],next_layer:[4,5,1,""],next_locator:[4,5,1,""],next_pick_item:[4,5,1,""],next_shader:[4,5,1,""],next_switch_shader:[4,5,1,""],node_first_shader:[4,5,1,""],node_switch_shader:[4,5,1,""],open_file:[4,5,1,""],pick:[4,5,1,""],pick_all_layers:[4,5,1,""],pick_all_locators:[4,5,1,""],pick_by_name:[4,5,1,""],pick_layers:[4,5,1,""],pick_locators:[4,5,1,""],pick_nodes:[4,5,1,""],pick_nodes_assigned_to_layers:[4,5,1,""],pick_nodes_assigned_to_shaders:[4,5,1,""],pop_pick_list:[4,5,1,""],prev_pick_item:[4,5,1,""],push_pick_list:[4,5,1,""],queue_events:[4,5,1,""],redraw_screen:[4,5,1,""],remove_message_handler:[4,5,1,""],remove_message_handlers:[4,5,1,""],remove_reference:[4,5,1,""],remove_references:[4,5,1,""],reset:[4,5,1,""],reset_pivots:[4,5,1,""],reset_stages:[4,5,1,""],retrieve:[4,5,1,""],retrieve_options:[4,5,1,""],save_file:[4,5,1,""],save_file_as:[4,5,1,""],save_layers:[4,5,1,""],search_dag:[4,5,1,""],search_node_has_history:[4,5,1,""],search_node_has_non_origin_pivot:[4,5,1,""],search_node_has_non_zero_transform:[4,5,1,""],search_node_is_instance:[4,5,1,""],search_node_is_template:[4,5,1,""],search_node_layer_does_not_match_parent_layer:[4,5,1,""],search_node_unused_curves_on_surface:[4,5,1,""],search_node_unused_curves_on_surface_with_history:[4,5,1,""],set_layer_symmetry:[4,5,1,""],set_parent_window:[4,5,1,""],set_retrieve_options:[4,5,1,""],set_store_options:[4,5,1,""],store:[4,5,1,""],store_active:[4,5,1,""],store_current_window:[4,5,1,""],store_options:[4,5,1,""],tessellate_adaptive:[4,5,1,""],tessellate_chord_height_deviation:[4,5,1,""],tessellate_chord_height_deviation_accurate:[4,5,1,""],tessellate_chord_height_deviation_fast:[4,5,1,""],tessellate_number:[4,5,1,""],tessellate_render_settings:[4,5,1,""],tessellate_uniform:[4,5,1,""],traverse_dag:[4,5,1,""],ungroup:[4,5,1,""],unpick:[4,5,1,""],unpick_all_layers:[4,5,1,""],unpick_all_locators:[4,5,1,""],update_reference:[4,5,1,""],zero_transform:[4,5,1,""],zero_transform_top_level:[4,5,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","property","Python property"],"4":["py","exception","Python exception"],"5":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:property","4":"py:exception","5":"py:function"},terms:{"0":[0,1,2,3,4],"00":4,"001":4,"01":4,"02":4,"03":4,"1":4,"10":4,"100":4,"1024":4,"106":4,"11":4,"12":4,"1280":4,"13":4,"16":4,"1st":4,"2":4,"20":4,"2022":4,"21":4,"22":4,"23":4,"28":4,"2d":4,"2nd":4,"3":4,"30":4,"31":4,"32":4,"33":4,"3d":4,"3rd":4,"4":[0,1,2,3,4],"4x4":4,"4x4x4":4,"5":[0,1,2,3,4],"5th":4,"5x4":4,"6":4,"63":4,"64":4,"6th":4,"6x5x4":4,"7":4,"7th":4,"7x4":4,"7x4x4":4,"8":4,"9":4,"90":4,"abstract":4,"boolean":4,"case":4,"char":4,"class":[0,4],"default":[1,4],"do":4,"enum":4,"export":4,"final":4,"float":4,"function":[0,1,4],"import":4,"int":4,"long":4,"new":[2,4],"null":4,"public":4,"return":4,"short":4,"static":4,"switch":4,"throw":4,"true":4,"try":4,A:4,AND:4,As:4,At:4,But:4,By:4,For:4,IS:4,If:4,In:4,Is:4,It:4,NOT:4,ON:4,On:4,One:4,THE:4,TO:4,That:4,The:4,Then:4,There:4,These:4,To:4,With:4,__ptr64:4,a0:4,a1:4,abandon:4,abil:4,abl:4,abnorm:4,about:4,abov:4,absent:4,acc:4,accept:4,access:4,accomplish:4,accord:4,account:4,accur:4,accuraci:4,achiev:4,aci:4,acquir:4,across:4,act:4,action:4,actiontyp:4,activ:4,actual:4,acycl:4,ad:4,adapt:4,add:4,add_child_nod:4,add_children:4,add_command:4,add_curve_on_surfac:4,add_fac:4,add_joint:4,add_key_fram:4,add_keyfram:4,add_keyframe_rang:4,add_menu:4,add_message_handl:4,add_point:4,add_refer:4,add_reference_file_to_altern:4,add_separ:4,add_shad:4,add_sibling_nod:4,add_textur:4,add_to_clust:4,add_to_set:4,addimageplan:4,addit:4,addition:4,address:4,adjust:4,adjust_end_span:4,adjust_window:4,affect:4,affected_transformation_matrix:4,affin:4,after:4,afterward:4,again:4,aggreg:4,aggregr:4,aid:4,aimconstrainttyp:4,aka:4,al:4,al_are_equ:4,al_is_valid:4,al_object1:4,al_object2:4,al_object:4,alact:4,alactionextraptyp:4,alangleloc:4,alanim:4,alanimat:4,alannotationloc:4,alarcattribut:4,alattribut:4,alcamera:4,alcamerafield:4,alcameranod:4,alchannel:4,alchanneldatatyp:4,alcloud:4,alclust:4,alcluster:4,alclustermemb:4,alclusternod:4,alconicattribut:4,alconictyp:4,alconstructionent:4,alconstructionplan:4,alconstructionvector:4,alcoordinatesystem:4,alcopyopt:4,alcurv:4,alcurveattribut:4,alcurvecv:4,alcurveformtyp:4,alcurvenod:4,alcurvenodejoinerror:4,alcurveonsurfac:4,alcurveonsurfacepoint:4,alcurvepoint:4,aldagnod:4,aldagnodeext:4,aldagnodefield:4,aldeviationloc:4,aldictionari:4,aldisplaymod:4,aldisplaymodetyp:4,aldistanceloc:4,alenviron:4,alfac:4,alfacenod:4,alfiletyp:4,alfoo:4,algroupnod:4,alhash:4,alia:[0,1,4],alias:4,alias_api:[2,4],aliascompatibilityexcept:4,aliasopenmodelexcept:4,aliaspythonexcept:4,alikhandl:4,alikhandlenod:4,aliter:4,aliteratorwithpar:4,aljoint:4,alkeyfram:4,all:4,allay:4,allayeredshad:4,allight:4,allightnod:4,allineattribut:4,allinkitem:4,allist:4,alloc:4,allow:4,almesh:4,almeshnod:4,almessagetyp:4,alminmaxloc:4,almost:4,almotionact:4,alobject:4,alobjecttyp:4,along:4,alongu:4,alongv:4,alorthographiccamera:4,alorthographiccameraptr:4,aloutputtyp:4,alparamact:4,alparamitem:4,alperspectivecamera:4,alperspectivecameraptr:4,alpick:4,alpicklist:4,alplaneattribut:4,alpoint:4,alpointloc:4,alpointtyp:4,alpolysetvertex:4,alpymath:4,alradialloc:4,alreadi:4,alreadycr:4,alreadytrim:4,alreferencefil:4,alreferencefileset:4,alreferencelay:4,alrend:4,alrenderinfo:4,alretrieveopt:4,alrevsurfattribut:4,alset:4,alsetmemb:4,alsett:4,alshad:4,alshadingfield:4,alshel:4,alshellnod:4,also:4,alspacepoint:4,alstatuscod:4,alstoreopt:4,alsurfac:4,alsurfacecv:4,alsurfacenod:4,alsurfacepoint:4,alswitchshad:4,altangenttyp:4,altern:4,altessellatetyp:4,altextur:4,altexturenod:4,although:4,altm:4,altrimregion:4,altriplecompon:4,altyp:4,alunivers:4,alviewtyp:4,alwai:4,alwindow:4,ambient:4,ambientlighttyp:4,among:4,amount:4,amtrix:4,an:4,analyt:4,ancestor:4,anchor:4,angl:4,angle_of_view:4,angleloc:4,anglelocatortyp:4,angu:4,angular:4,ani:4,anim:4,anima:4,animat:4,animated_item:4,animchannel:4,animplayback:4,animt:4,anit_alia:4,annot:4,annotationloc:4,annotationlocatortyp:4,anoath:4,anonym:4,anoth:4,anti:4,anti_alia:4,api:[0,1,4],appear:4,append:4,appli:4,applic:4,applied_act:4,applied_action_compon:4,appliedact:4,apply_iterator_to_channel:4,apply_iterator_to_children:4,apply_iterator_to_cloud:4,apply_iterator_to_clust:4,apply_iterator_to_cv:4,apply_iterator_to_dag_nod:4,apply_iterator_to_keyfram:4,apply_iterator_to_memb:4,apply_iterator_to_set:4,apply_iterator_to_shad:4,apply_iterator_to_textur:4,apply_warp:4,apply_warp_o:4,applyiter:4,applyiteratortoset:4,approach:4,appropri:4,approxim:4,ar:4,arbitrari:4,arc:4,arc_len:4,arc_length:4,arcattributetyp:4,area:4,arealighttyp:4,arg0:4,arg1:4,arg2:4,arg3:4,arg:4,arg_len:4,argument:4,around:4,arrai:4,arrow:4,as_action_ptr:4,as_angle_locator_ptr:4,as_animatable_ptr:4,as_annotation_locator_ptr:4,as_arc_attributes_ptr:4,as_attributes_ptr:4,as_camera_node_ptr:4,as_camera_ptr:4,as_channel_ptr:4,as_cloud_ptr:4,as_cluster_member_ptr:4,as_cluster_node_ptr:4,as_cluster_ptr:4,as_clusterable_ptr:4,as_conic_attributes_ptr:4,as_construction_entity_ptr:4,as_construction_plane_ptr:4,as_curve_attributes_ptr:4,as_curve_cv_ptr:4,as_curve_on_surface_point_ptr:4,as_curve_on_surface_ptr:4,as_curve_point_ptr:4,as_curve_ptr:4,as_dag_node_ptr:4,as_deviation_locator_ptr:4,as_distance_locator_ptr:4,as_envronment_ptr:4,as_face_node_ptr:4,as_face_ptr:4,as_group_node_ptr:4,as_ik_handle_node_ptr:4,as_ik_handle_ptr:4,as_keyframe_ptr:4,as_layer_ptr:4,as_layered_shader_ptr:4,as_light_node_ptr:4,as_light_ptr:4,as_line_attributes_ptr:4,as_locator_ptr:4,as_mesh_node_ptr:4,as_mesh_ptr:4,as_minmax_locator_ptr:4,as_orthographic_camera_ptr:4,as_param_action_ptr:4,as_perspective_camera_ptr:4,as_plane_attributes_ptr:4,as_point_ptr:4,as_radial_locator_ptr:4,as_rev_surf_attributes_ptr:4,as_set_member_ptr:4,as_set_ptr:4,as_settable_ptr:4,as_shader_ptr:4,as_shell_node_ptr:4,as_shell_ptr:4,as_space_point_ptr:4,as_surface_node_ptr:4,as_surface_point_ptr:4,as_surface_ptr:4,as_switch_shader_ptr:4,as_texture_node_ptr:4,as_texture_ptr:4,assert:4,assign:4,assign_child:4,assign_children_to_parent_lay:4,assign_layered_shad:4,assign_nodes_to_lay:4,assign_par:4,assign_select:4,assign_shad:4,assign_sibling_on_left:4,assign_sibling_on_right:4,assign_switch_shad:4,assign_top_nod:4,associ:4,assum:4,attach:4,attached_to:4,attempt:4,attr:4,attribteu:4,attribut:4,attributes_1_nam:4,attributesdelet:4,attributetyp:4,automat:4,avail:4,avoid:4,awai:4,ax:4,axi:4,b:4,back:4,background:4,backgroundbackdrop_:4,backgroundcolorb:4,backgroundcolorg:4,backgroundcolorr:4,backgroundsequence_:4,bad:4,badclust:4,baddata:4,ballback:4,ballbottom:4,ballelev:4,balleyespac:4,ballfront:4,ballimage_:4,ballinclin:4,ballleft:4,ballreflect:4,ballright:4,ballskyradiu:4,balltop:4,bar:4,barski:4,bartel:4,base:4,base_curv:4,base_filenam:4,base_param:4,base_paramu:4,basecurv:4,basi:4,basic:4,beatti:4,becam:4,becaus:4,becom:4,been:4,befor:4,begin:4,behav:4,behavior:4,behaviour:4,being:4,belong:4,below:4,best:4,better:4,between:4,bind:[0,1,4],bitmap:4,blendcurvetyp:4,blendpointtyp:4,blind_data_ids_to_copi:4,blinn:4,blinndiffus:4,blinneccentr:4,blinngloss_:4,blinnreflect:4,blinnreflection_:4,blinnspecularb:4,blinnspecularg:4,blinnspecularity_:4,blinnspecularr:4,blinnspecularrolloff:4,block:4,bmp:4,bone:4,bool:4,bool_value_1:4,born:4,both:4,bothsid:4,bottom:4,bound:4,boundari:4,bounding_box:4,boundingbox:4,box:4,boxlighttyp:4,broken:4,brought:4,bspline:4,build:4,built:4,bulgeuwidth:4,bulgevwidth:4,bunch:4,c4:4,c4x:4,c:[0,1,4],c_a:4,c_b:4,c_c:4,c_d:4,c_e:4,c_f:4,cach:4,calcul:4,calculate_start_and_end_andl:4,call:4,callabl:4,callback:4,callback_func:4,callback_id:4,callbcack:4,camera:4,camera_1_nam:4,cameraeyetyp:4,cameramodifi:4,cameratyp:4,camerauptyp:4,cameraviewtyp:4,can:4,cannot:4,cannotdelet:4,canonymous_block:4,canva:4,capac:4,carc:4,care:4,cascad:4,cast:4,categorytyp:4,catiav5:4,caus:4,center:4,center_point:4,centimet:4,certain:4,chain:4,chang:[2,4],channel:4,channel_refer:4,channel_typ:4,channeltyp:4,characterspacetyp:4,charactertyp:4,charsnippettyp:4,chartransitiontyp:4,check:4,checkercolor1b:4,checkercolor1g:4,checkercolor1r:4,checkercolor2b:4,checkercolor2g:4,checkercolor2r:4,checkercontrast:4,child:4,child_lay:4,child_layer_numb:4,child_nod:4,children:4,choic:4,choos:4,chord:4,chromefloorcolorb:4,chromefloorcolorg:4,chromefloorcolorr:4,chromegridcolorb:4,chromegridcolorg:4,chromegridcolorr:4,chromegriddepth:4,chromegriddepthmult:4,chromegriddepthoffset:4,chromegridwidth:4,chromegridwidthmult:4,chromegridwidthoffset:4,chromehorizoncolorb:4,chromehorizoncolorg:4,chromehorizoncolorr:4,chromelightcolorb:4,chromelightcolorg:4,chromelightcolorr:4,chromelightdepth:4,chromelightdepthmult:4,chromelightdepthoffset:4,chromelightwidth:4,chromelightwidthmulti:4,chromelightwidthoffset:4,chromerealfloor:4,chromeskycolorb:4,chromeskycolorg:4,chromeskycolorr:4,chromezenithcolorb:4,chromezenithcolorg:4,chromezenithcolorr:4,circl:4,circular:4,ckeep_camera:4,clamp:4,class_:4,clean:4,cleanup_geometry_model:4,clear:4,clear_pick_list:4,clear_queued_ev:4,clearcoarmaterial_:4,clearcoatact:4,clearcoatbia:4,clearcoatindex:4,clearcoatmaterialcod:4,clearcoatscal:4,clmembermodifi:4,clockwis:4,close:4,closest:4,clothbrightnessspread:4,clothgapcolorb:4,clothgapcolorg:4,clothgapcolorr:4,clothrandom:4,clothuthreadcolorb:4,clothuthreadcolorg:4,clothuthreadcolorr:4,clothuthreadwidth:4,clothuwav:4,clothvthreadcolorb:4,clothvthreadcolorg:4,clothvthreadcolorr:4,clothvthreadwidth:4,clothvwav:4,clothwidthspread:4,cloud:4,cloud_1_nam:4,clouddelet:4,cloudtyp:4,cluster:4,cluster_nod:4,clustermemb:4,clustermembertyp:4,clusternodetyp:4,clustertyp:4,clustobj:4,cnetdelet:4,co:4,coalesc:4,code:4,coeffici:4,coincid:4,col:4,collaps:4,collect:4,collinear:4,color:4,colour:4,column:4,comb:4,comb_dens:4,comb_displai:4,comb_scal:4,comb_threshold:4,combin:4,command:4,commandfre:4,commandinstal:4,commandreftyp:4,commandtyp:4,commanduninstal:4,comment:4,common:4,commonbump_:4,commonchromaticaberr:4,commoncolorb:4,commoncolorg:4,commoncolorr:4,commonconcentratio_:4,commoncontrast_:4,commondisplacement_:4,commonemitparticles_:4,commonfillcolorb:4,commonfillcolorg:4,commonfillcolorr:4,commonfogact:4,commonglowintens:4,commonhideglowsourc:4,commonincandescentb:4,commonincandescentg:4,commonincandescentr:4,commonlinethick:4,commonmatteobject:4,commonopacitydepth:4,commonpropsdens:4,commonpropsdragcoeff:4,commonpropselast:4,commonpropsfrict:4,commonpropspropmass:4,commonpsysatomspersec:4,commonpsysattract:4,commonpsysbendu:4,commonpsysbendv:4,commonpsysbloblight:4,commonpsysblobmap_:4,commonpsysblobthreshold:4,commonpsysblurlength:4,commonpsysblurqu:4,commonpsysbolbnois:4,commonpsysbolbnoisefrequ:4,commonpsysbranchangl:4,commonpsysbuoy:4,commonpsyscollis:4,commonpsyscollisionmethod:4,commonpsyscollisions_:4,commonpsyscolorb:4,commonpsyscolorg:4,commonpsyscolorr:4,commonpsyscurl:4,commonpsyscycl:4,commonpsysdens:4,commonpsysdiffusion_:4,commonpsysdiffusionmethod:4,commonpsysdiffusionrate_:4,commonpsyselast:4,commonpsysemiss:4,commonpsysendfram:4,commonpsysendframe_:4,commonpsysfrict:4,commonpsysglowintens:4,commonpsysgrowmethod:4,commonpsyshairlengthmap_:4,commonpsyshairlengthmax:4,commonpsyshairlengthmin:4,commonpsyshairseg:4,commonpsyshairstiff:4,commonpsyshitmethod_:4,commonpsysincandescenc:4,commonpsysincandescenceb:4,commonpsysincandescenceg:4,commonpsyslifespanmax:4,commonpsyslifespanmin:4,commonpsysmass:4,commonpsysmotiontyp:4,commonpsysmotiontype_:4,commonpsysnoiseaspect:4,commonpsysnumchildren:4,commonpsysparentshad:4,commonpsysparticle_file_:4,commonpsyspresent_:4,commonpsysrandom:4,commonpsysrendertyp:4,commonpsyss:4,commonpsyssizerang:4,commonpsysspe:4,commonpsysspeeddecai:4,commonpsysspeedrang:4,commonpsyssplittim:4,commonpsysstartfram:4,commonpsysstartframe_:4,commonpsyssurfaceshad:4,commonpsystimerandom:4,commonpsystransluc:4,commonpsystransparencyb:4,commonpsystransparencyg:4,commonpsystransparencymethod:4,commonpsystransparencyr:4,commonpsysunus:4,commonpsysusefile_:4,commonpsysuseparticlefil:4,commonreflectbackground:4,commonreflectionlimit:4,commonrefractionjitt:4,commonrefractionlimit:4,commonrefractionsampl:4,commonrefractiveindex:4,commonrefractivematerial_:4,commonrespectreflectionmap:4,commonshadingmap_:4,commonshadowlevellimit:4,commonsurfacewidth:4,commontexturealphamult:4,commontexturealphaoffset:4,commontextureblend:4,commontextureblurmult:4,commontexturebluroffset:4,commontexturechordlength:4,commontexturecolorremap_:4,commontextureinvert:4,commontexturemirror:4,commontexturenotus:4,commontextureoverlap_:4,commontexturergbmultb:4,commontexturergbmultg:4,commontexturergbmultr:4,commontexturergboffsetb:4,commontexturergboffsetg:4,commontexturergboffsetr:4,commontexturerot:4,commontexturesmearmap_:4,commontexturestagg:4,commontextureucoverag:4,commontextureunus:4,commontextureuoffset:4,commontextureurepeat:4,commontextureutransl:4,commontextureuwrap:4,commontexturevcoverag:4,commontexturevoffset:4,commontexturevrepeat:4,commontexturevtransl:4,commontexturevwrap:4,commontexturewrap:4,commontransluc:4,commontranslucencedepth:4,commontransparencyb:4,commontransparencydepth:4,commontransparencyg:4,commontransparencyr:4,commontransparencyshad:4,commonupatchlin:4,commonusebackgroundcolor:4,commonusefillercolor:4,commonvpatchlin:4,commonvredmaterialtag_:4,compar:4,compat:4,complet:4,compo:4,compon:4,composit:4,compressedsbd:4,comput:4,condit:4,conelighttyp:4,conic:4,conicattributetyp:4,conjunct:4,consid:4,consist:4,constant:4,constrain:4,constrainttyp:4,construct:4,constructionentitytyp:4,constructionfuturetype1:4,constructionfuturetype2:4,constructionplan:4,constructionplanetyp:4,constructionvectortyp:4,constructor:[1,4],conta:4,contacttyp:4,contain:4,content:4,continu:4,continut:4,contract:4,control:4,control_point:4,conveni:4,convers:4,convert:4,convert_face_node_to_trimmed_surface_nod:4,convert_to_trimmed_surfac:4,convert_to_trimmed_surface_nod:4,convienc:4,coordin:4,copi:4,copy_anim:4,copy_clust:4,copy_object:4,copy_object_cleanup:4,copy_transform:4,copy_wrapp:4,copynod:4,copyobjectcleanup:4,core:4,corner:4,correct:4,correspond:4,coscreat:4,cosdelet:4,cosmodifi:4,cosvis:4,coudln:4,could:4,count:4,count_tol:4,counter:4,counterclockwis:4,creat:4,create_altern:4,create_arc:4,create_con:4,create_construction_plan:4,create_ellips:4,create_fold:4,create_group_for_lay:4,create_hyperbola:4,create_lay:4,create_layer_fold:4,create_layered_shad:4,create_lin:4,create_orthographic_camera:4,create_parabola:4,create_perspective_camera:4,create_point:4,create_refer:4,create_reference_altern:4,create_scan_data:4,create_shad:4,create_spher:4,create_stag:4,create_switch_shad:4,create_symmetric_geometri:4,create_texture_nod:4,createinst:4,creation:4,cross:4,cube:4,cubebackimage_:4,cubebottomimage_:4,cubecrossimage_:4,cubefinitesize_:4,cubefrontimage_:4,cubeleftimage_:4,cuberightimage_:4,cubetopimage_:4,cur_lay:4,cur_loc:4,cur_shad:4,cur_textur:4,current:4,current_window:4,curv:4,curvatur:4,curvaturedisplay_:4,curvaturemax:4,curvaturemin:4,curvaturerepeat:4,curvaturescale_:4,curvaturetype_:4,curve1:4,curve2:4,curve_nod:4,curve_on_surfac:4,curve_on_surface_1_nam:4,curve_tol:4,curveattributetyp:4,curveclos:4,curvecvtyp:4,curveformtyp:4,curvenodetyp:4,curveonsurfacepointtyp:4,curveonsurfacetyp:4,curvepointtyp:4,curves_on_surfac:4,curvetyp:4,custom:4,cv:4,cv_list:4,cvlist:4,cvs_affected_posit:4,cvs_affected_position_incl_multipl:4,cvs_unaffected_posit:4,cvs_unaffected_position_incl_multipl:4,cvs_world_posit:4,cvs_world_position_incl_multipl:4,cvsunaffectedposit:4,cvsworldposit:4,cyberwar:4,cycl:4,cylind:4,cylinderlighttyp:4,cz:4,d0:4,d1:4,d2:4,d3:4,d:4,dag:4,dag_nod:4,dag_node_1_nam:4,dag_node_2_nam:4,dagdispmodifi:4,daginsert:4,dagnamemodifi:4,dagnod:4,dagnodeapplytransform:4,dagnodecolourmodifi:4,dagnodedelet:4,dagnodeinstanc:4,dagnodemodifi:4,dagnodemodifiedconstraint:4,dagnodemodifiedgeometri:4,dagnodemodifiedshaderassign:4,dagnodeprereplacegeometri:4,dagnodereplacegeometri:4,dagnodetyp:4,dagnodeundelet:4,dagnodevis:4,dash:4,data:4,dave:4,debug:4,decompos:4,decreas:4,default_trim:4,defin:4,definit:4,deform:4,deg:4,degener:4,degre:4,degress:4,delet:4,delete_al:4,delete_all_construction_ent:4,delete_all_construction_histori:4,delete_all_loc:4,delete_anim:4,delete_construction_histori:4,delete_curr:4,delete_dag_nodes_by_nam:4,delete_degenerate_geo:4,delete_histori:4,delete_keyframe_rang:4,delete_layers_by_nam:4,delete_null_nod:4,delete_object:4,delete_sets_by_nam:4,delete_unus:4,deleteal:4,deleteanim:4,deletehistori:1,deletenod:4,deleteobejct:4,deletestagefailur:4,deleteunus:1,denot:4,densiti:4,depend:4,deprec:4,deriv:4,derivedobject:4,descend:4,describ:4,descript:4,design:4,desir:4,destroi:4,destruct:4,destructor:4,detail:[1,4],determin:4,develop:4,deviat:4,deviation_compon:4,deviationloc:4,deviationlocatortyp:4,diagon:4,diameter_cr:4,dict:4,did:4,didn:4,differ:4,differenti:4,dim:4,dimens:4,direct:4,directionlighttyp:4,directli:4,directori:4,disabl:4,displac:4,displai:4,display_typ:4,displaygeomcv:4,displaygeomeditpoint:4,displaygeomhul:4,displaygeomkeypoint:4,dist:4,distanc:4,distanceloc:4,distancelocatortyp:4,distribut:4,do_up:4,do_upd:4,doc:4,document:4,doe:4,doesn:4,don:4,done:4,doubl:4,doupdat:4,down:4,downcast:4,downsid:4,draw:4,draw_inst:4,drawn:4,due:4,dump:4,duplic:4,duplicatecurv:4,dure:4,dwg:4,dxf:4,dynaitdens:4,dynback:4,dynbackoffset:4,dynceil:4,dynceilingoffset:4,dynfloor:4,dynflooroffset:4,dynforcescal:4,dynfront:4,dynfrontoffset:4,dyngrav:4,dynleft:4,dynleftoffset:4,dynright:4,dynrightoffset:4,dyntimescal:4,dynturbanim:4,dynturbgranular:4,dynturbintens:4,dynturbpersist:4,dynturbroug:4,dynturbspaceresolut:4,dynturbspread:4,dynturbtimeresolut:4,dynturbtyp:4,dynturbvari:4,dynwallfrict:4,e:4,eaach:4,each:4,earli:4,easi:4,easili:4,edf:4,edg:4,edit:4,editpoint:4,effect:4,effector:4,effici:4,eg:4,eight:4,either:4,element:4,ellips:4,ellipt:4,els:4,elsewher:4,embed:4,embed_image_refer:4,embedimagerefer:4,empti:4,enabl:4,encapsul:4,encount:4,end:4,end_angl:4,end_i:4,end_point:4,end_x:4,end_z:4,endofalstatuscod:4,endofglobalcod:4,endpoint:4,enough:4,ensur:4,entir:4,entiti:4,environ:4,environmenttyp:4,epsf:4,equal:4,equat:4,equival:4,eror:4,err:4,error:4,etc:4,etih:4,eval:4,evalu:4,evaluatetyp:4,even:4,event:4,everi:4,everyth:4,everywher:4,ex:4,exact:4,exactli:4,examin:4,exampl:4,exce:4,except:[0,4],exclud:4,exclus:4,execut:4,exist:4,exit:4,expand:[1,4],expand_inst:4,expect:4,expert:4,explicitli:4,export_by_lay:4,export_by_layer_sequenti:4,export_content_to_fil:4,exportbylay:4,exportbylayersequenti:4,expr:4,expraxinsertbadref:4,expraxinsertcircref:4,expraxinsertselfref:4,exprbadvari:4,exprchannel:4,express:4,expression_str:4,exprmodifi:4,exprnotdagobject:4,exprnotvalidcv:4,exprnotvalidnam:4,exprnotvalidparamet:4,exprnotvalidrel:4,exprparseerror:4,ext:4,extend:4,extend_curv:4,extent:4,extra:4,extract:4,extracttyp:4,extrap_typ:4,extrap_type_post:4,extrap_type_pr:4,extrapol:4,extrem:4,ey:4,f3d:4,f:4,face:4,face_nod:4,face_to_surf:4,facenod:4,facenodetyp:4,facetyp:4,fact:4,factor:4,fail:4,failr:4,failur:4,fairli:4,fall:4,fals:4,fast:4,faster:4,fbx:4,featur:4,feet:4,few:4,field:4,field_nam:4,field_typ:4,figur:4,file:4,file_nam:4,file_path:4,file_typ:4,fileframeextens:4,fileimage_:4,filenam:4,filenotfound:4,filepath:4,filertyp:4,filetyp:4,fileuseextens:4,filter:4,find:4,find_channel:4,find_dag_node_by_nam:4,find_top_level_dag_node_by_nam:4,finish:4,fire:4,first:4,first_act:4,first_attribut:4,first_channel:4,first_cloud:4,first_clust:4,first_construction_ent:4,first_cv:4,first_dag_nod:4,first_environ:4,first_fac:4,first_i:4,first_keyfram:4,first_lay:4,first_layered_shad:4,first_linked_object:4,first_loc:4,first_memb:4,first_pick_item:4,first_set:4,first_shad:4,first_switch_shad:4,first_textur:4,first_trim_region:4,first_window:4,first_x:4,first_z:4,firstattribut:4,firstdagnod:4,firstmessag:4,firstshad:4,fix:4,flag:4,flat:4,flatten:4,flatten_group_nod:4,fld_shading_common_texture_:4,fld_shading_water_:4,flip:4,focu:4,focus_length:4,fogamult:4,fogaoffset:4,fogcolorb:4,fogcolorg:4,fogcolorr:4,fogcolumn:4,fogdensitymap_:4,fogdepthb:4,fogdepthg:4,fogdepthr:4,fogfogtyp:4,fogmaxdist:4,fogmazaltitud:4,fogminaltitud:4,fogmindist:4,folder:4,folder_nam:4,follow:4,forc:4,form:4,format:4,formerli:4,forward:4,found:4,four:4,fractalamplitud:4,fractalanim:4,fractallevelmax:4,fractallevelmin:4,fractalratio:4,fractalthreshold:4,fractaltim:4,fragment:4,frame:4,free:4,from:4,front:4,full:4,func:4,funciton:4,further:4,furthermor:4,futurepointtype1:4,futurepointtype2:4,futurepointtype3:4,futurepointtype4:4,futurepointtype5:4,g:4,garbag:4,gemoetri:4,gener:4,geomcv:4,geomeditpoint:4,geometr:4,geometri:4,geometryheight:4,geometryrot:4,geometryscal:4,geometrysourcetextur:4,geometrytyp:4,geomhul:4,geomkeypoint:4,get:4,get_active_shad:4,get_altern:4,get_alternative_by_nam:4,get_annotation_loc:4,get_annotation_locator_str:4,get_assigned_nod:4,get_bounding_box_from_hang:4,get_children:4,get_colour:4,get_construction_plane_by_nam:4,get_current_path:4,get_current_pick_item:4,get_current_stag:4,get_curves_on_surfac:4,get_cv:4,get_dag_nodes_by_nam:4,get_empty_lay:4,get_empty_set:4,get_first_inactive_shad:4,get_first_shad:4,get_lay:4,get_layer_by_nam:4,get_layer_by_numb:4,get_layered_shad:4,get_layered_shader_by_nam:4,get_layered_shader_by_nod:4,get_layers_by_nam:4,get_layers_using_multiple_shad:4,get_loc:4,get_locator_by_nam:4,get_locators_by_nam:4,get_main_window_id:4,get_nesting_group:4,get_next_inactive_shad:4,get_next_shad:4,get_own:4,get_perspective_camera:4,get_perspective_camera_by_nam:4,get_pick_item:4,get_pick_item_dag_nod:4,get_product_inform:4,get_refer:4,get_reference_by_nam:4,get_reference_by_path:4,get_reference_by_uuid:4,get_references_by_nam:4,get_resolut:4,get_sets_by_nam:4,get_shad:4,get_shader_by_nam:4,get_shaders_by_nam:4,get_shaders_by_nod:4,get_stag:4,get_surface_orient:4,get_switch_shad:4,get_switch_shader_by_nam:4,get_switch_shader_by_nod:4,get_tm:4,get_top_dag_nod:4,get_vari:4,give:4,given:4,global:4,global_param:4,global_param_list:4,global_transformation_matrix:4,go:4,goal:4,gone:4,granitecells:4,granitecolor1b:4,granitecolor1g:4,granitecolor1r:4,granitecolor2b:4,granitecolor2g:4,granitecolor2r:4,granitecolor3b:4,granitecolor3g:4,granitecolor3r:4,granitecreas:4,granitedens:4,granitefillercolorb:4,granitefillercolorg:4,granitefillercolorr:4,granitemixratio:4,graniterandom:4,granitespotty:4,granitethreshold:4,graph:4,graphic:4,greater:4,grid:4,grid_siz:4,gridcontrast:4,gridfillercolorb:4,gridfillercolorg:4,gridfillercolorr:4,gridlinecolorb:4,gridlinecolorg:4,gridlinecolorr:4,griduwidth:4,gridvwidth:4,groundplaneheight_:4,groundplanepreview_:4,groundplanereflection_:4,groundplanereflectionblur_:4,groundplanereflectionblurdepth_:4,groundplanereflectiondepth_:4,groundplanereflectivity_:4,groundplaneshadowblur_:4,groundplaneshadowposition_:4,groundplaneshadows_:4,groundplaneshadowtransparency_:4,group:4,group_nam:4,group_nod:4,group_node_callback:4,groupnod:4,groupnodetyp:4,grow:4,h:4,ha:[1,4],had:4,hand:4,handl:4,handler:4,hanger:4,happen:4,has_annotation_loc:4,has_construction_histori:4,has_histori:4,has_linked_object:4,has_queued_ev:4,has_refer:4,has_vari:4,hash:4,hatch:4,have:4,head:4,height:4,henc:4,here:4,hermit:4,hide:4,hierarch:4,hierarchi:4,hierarchymodifi:4,higer:4,highlighthldirectioni:4,highlighthldirectionx:4,highlighthldirectionz:4,highlightmax:4,highlightmin:4,highlightrepeat:4,histor:4,histori:4,hold:4,homogen:4,horizont:4,how:4,howev:4,hte:4,hwnd:4,hyperbol:4,hyperbola:4,i:4,iblreflectionmap_:4,iblreflectionmaprotation_:4,id:4,ident:4,identifi:4,ie:4,ig:4,iges_fil:4,ignor:4,ignore_nam:4,ignore_numb:4,ik:4,ik_handl:4,ikhandlenodetyp:4,ikhandletyp:4,illeg:4,illumin:4,illustr:4,imag:4,imagepath:4,immedi:4,implement:4,impli:4,implicitli:4,import_cloud_fil:4,import_fil:4,import_refer:4,import_subdiv:4,import_subdivis:4,importcloudfil:4,improv:4,in_tang:4,in_tangent_typ:4,in_trim:4,inaccur:4,inact:4,inch:4,incl_multipl:4,includ:4,include_fold:4,include_installed_imag:4,include_non_fold:4,include_world:4,includeinstalledimag:4,inclus:4,incorrect:4,increas:4,increment:4,increment_degre:4,independ:4,index:4,indic:4,individu:4,ineffect:4,infinit:4,inform:4,inherit:4,init:4,init_project_env:4,initi:4,initialize_univers:4,input:4,input_data:4,insert:4,insta:4,instal:4,instanc:4,instance_copi:4,instanti:4,instead:4,instsanc:4,insufficientmemori:4,int_value_1:4,int_value_2:4,intan:4,intang:4,integ:4,intend:4,interact:4,interest:4,interfac:4,interfer:4,intern:4,interpol:4,intersect:4,introduc:4,introduct:4,invalid:4,invalidargu:4,invalidcompon:4,invalidcurv:4,invalidkeypoint:4,invalidobject:4,invalidwindowtyp:4,invalidwirefil:4,inventor:4,invers:4,inverse_global_transformation_matrix:4,invis:4,invok:4,is_a_construction_plan:4,is_ancestor_an_inst:4,is_assign:4,is_cluster_memb:4,is_construction_history_resulting_surfac:4,is_construction_lay:4,is_copy_of_vred_shad:4,is_display_mode_set:4,is_empti:4,is_empty_fil:4,is_exclus:4,is_eye_nod:4,is_fold:4,is_instanc:4,is_instance_nod:4,is_lock:4,is_look_at_nod:4,is_pick:4,is_position_nod:4,is_queuing_ev:4,is_set_memb:4,is_stage_empti:4,is_up_nod:4,is_us:4,is_view_nod:4,is_vis:4,isinstanc:4,isn:4,iso:4,itang:4,item:4,iter:4,itr:4,its:4,itself:4,jama:4,jamai:4,jamia:4,join:4,joint:4,jointmodifi:4,jointtyp:4,jpeg:4,jpg:4,jt:4,just:4,justif:4,justifi:4,k:4,kanimchannel:4,kcentimet:4,kclose:4,keep:4,keep_anim:4,keep_background:4,keep_renderglob:4,keep_unitstoler:4,keep_window:4,kei:4,kexprchannel:4,kextrap_ident:4,kextrap_invalid:4,keyfram:4,keyframetyp:4,kfeet:4,kfld_shading_blinn_:4,kfld_shading_common_:4,killer:4,kilomet:4,kinch:4,kind:4,kinemat:4,kinvalid_compon:4,kkilomet:4,klayer:4,klayerandset:4,kmeter:4,kmicroinch:4,kmicron:4,kmil:4,kmile:4,kmillimet:4,kmulticlust:4,knolayerorset:4,knot:4,knot_valu:4,knot_vector:4,knotvalu:4,know:4,known:4,kopen:4,kparamet:4,kperiod:4,kset:4,ktangentunchang:4,ktesselate_quadrilater:4,ktesselate_triangl:4,kunknownchannel:4,kuseflag:4,kwarg:4,kworld:4,ky_compon:4,kyup:4,kzup:4,l:4,label:4,lambertdiffus:4,last:4,last_clust:4,last_cust:4,last_keyfram:4,last_set:4,lastclust:4,lastmessag:4,later:4,layer:[1,4],layer_id:4,layer_list:4,layer_nam:4,layer_numb:4,layer_or_set:4,layer_shad:4,layerad:4,layerassign:4,layerattributechang:4,layerdelet:4,layeredshadertyp:4,layers_inclus:1,layersen:4,layersinclus:4,layersreord:4,layerstatemodifi:4,layersymmetrymodifi:4,layertyp:4,layervisibilitymodifi:4,layout:4,lead:4,leader:4,leaf:4,leaf_node_callback:4,leaf_nodes_onli:4,least:4,leathercellcolorb:4,leathercellcolorg:4,leathercellcolorr:4,leathercells:4,leathercreas:4,leathercreasecolorb:4,leathercreasecolorg:4,leathercreasecolorr:4,leatherdens:4,leatherrandom:4,leatherspoty:4,leatherthreshold:4,leav:4,left:4,left_justifi:4,left_justify_max_dist:4,left_justify_min_dist:4,len:4,length:4,lenseffectfilmgrain:4,lenseffectfilterb:4,lenseffectfilterg:4,lenseffectfilterr:4,less:4,let:4,level:4,lexic:4,li:4,librari:4,lie:4,light:4,light_1_nam:4,light_nod:4,lightlookatnodetyp:4,lightmodifi:4,lightnodetyp:4,lighttunnelbandfring:4,lighttunnelbandwidth:4,lighttunnelcolorr:4,lighttunnelen:4,lighttunnelintens:4,lighttunnelnumberband:4,lighttunnelvis:4,lighttyp:4,lightupnodetyp:4,like:4,limit:4,line:4,linear:4,linear_scal:4,linear_unit:4,linearlighttyp:4,linearunit:4,lineattributetyp:4,link:4,linkag:4,list:4,listmodifiednod:4,littl:4,live:4,local:4,local_leader_posit:4,local_param:4,local_param_list:4,local_rotate_bi:4,local_rotation_angl:4,local_rotation_ax:4,local_transformation_matrix:4,local_translate_bi:4,local_transormation_matrix:4,locat:4,locator_1_nam:4,locatorad:4,locatordelet:4,locatormodifi:4,locatortyp:4,lock:4,log:4,log_messag:4,log_to_errlog:4,log_to_prompt:4,log_to_prompt_no_histori:4,log_to_stderr:4,log_to_stdout:4,longer:4,look:4,look_at_nod:4,loop:4,lose:4,lost:4,lot:4,lower:4,m1:4,m2:4,m:4,made:4,magnitud:4,mai:4,main:4,maintain:4,major:4,major_axi:4,make:4,make_cub:4,manag:4,mandatori:4,mani:4,manipul:4,manner:4,manual:4,map:4,mapped_field:4,masterlightaocontrast:4,masterlightcolorb:4,masterlightcolorr:4,masterlightintens:4,match:4,materlightcolorg:4,matric:4,matrix:4,max:4,max_point:4,max_valu:4,maximum:4,maximum_dist:4,maxiumum:4,mdi:4,mean:4,measur:4,mechan:4,meet:4,member:4,membership:4,memebr:4,memori:4,menu:4,menuitem:4,merg:4,mesh:4,mesh_nod:4,meshnodetyp:4,meshtyp:4,messag:4,message_typ:4,messageresult:4,meter:4,method:4,mid_point:4,middl:4,mile:4,millimet:4,min:4,min_point:4,min_valu:4,minimum:4,minimum_dist:4,minmax:4,minmaxloc:4,minmaxlocatortyp:4,minor:4,minor_axi:4,mirror:4,mode:4,model:4,modelig:4,modif:4,modifi:4,modul:2,more:4,most:4,mostli:4,motion:4,motionactiontyp:4,mountainamplitud:4,mountainboundaryrough:4,mountainrockcolorr:4,mountainrockrough:4,mountainsnowaltitud:4,mountainsnowcolorb:4,mountainsnowcolorg:4,mountainsnowcolorr:4,mountainsnowdropoff:4,mountainsnowlevelmax:4,mountainsnowmaxslop:4,mountainsnowrough:4,move:4,moveup:4,msg:4,much:4,multi:4,multipl:4,multipli:4,multiplictii:4,must:4,mutipl:4,mutual:4,n:4,naiv:4,name:4,namechangedtouniqueon:4,natur:4,necess:4,necessari:4,necessarili:4,need:4,neg:4,neighbor:4,neither:4,nest:4,never:4,new_com:4,new_knot_span:4,new_multipl:4,new_path:4,new_po:4,new_stag:4,new_stat:4,new_tim:4,new_val:4,newcom:4,newer:4,newli:4,newtim:4,newval:4,next:4,next_act:4,next_attribut:4,next_channel:4,next_cloud:4,next_clust:4,next_cluster_d:4,next_cluster_memb:4,next_cluster_member_d:4,next_construction_ent:4,next_curve_on_surfac:4,next_fac:4,next_inst:4,next_lay:4,next_linked_object:4,next_loc:4,next_nod:4,next_pick_item:4,next_set:4,next_set_memb:4,next_shad:4,next_switch_shad:4,next_textur:4,nextshad:4,noattribut:4,nocon:4,node:4,node_callback:4,node_first_shad:4,node_nam:[1,4],node_names_inclus:1,node_switch_shad:4,node_typ:[1,4],node_types_inclus:1,nodenam:4,nodenameinclus:4,nodenamesinclus:4,nodetyp:4,nodetypesinclus:4,noiseamplitud:4,noiseanim:4,noisethreshold:4,noisetim:4,non:4,nonambientlighttyp:4,none:4,nopar:4,noprojectenviron:4,nor:4,normal1:4,normal2:4,normal:4,normal_i:4,normal_x:4,normal_z:4,notavail:4,note:4,noth:4,notic:4,notifi:4,now:4,num_applied_act:4,num_channel_refer:4,num_control_pt:4,num_copi:4,num_knot:4,num_of_blind_data_ids_to_copi:4,num_triangl:4,numappliedact:4,number:4,number_of_control_point:4,number_of_cv:4,number_of_cvs_incl_multipl:4,number_of_keyfram:4,number_of_knot:4,number_of_memb:4,number_of_span:4,number_of_triangl:4,number_of_vertic:4,numberofcontrolpoint:4,numberofknot:4,numchannelrefer:4,numofcv:4,numofcvsinclmultipl:4,numspan:4,numvertic:4,nurb:4,nx:4,o:4,obect:4,obj:4,object:4,objectalreadypres:4,objectancestorinset:4,objectdescendentinset:4,objectinanotherset:4,objectinexclusiveset:4,objectinset:4,objectnotamemb:4,objectnotfound:4,obtain:4,occur:4,off:4,offset:4,ok:4,old:4,old_path:4,omit:4,on_or_off:4,onc:4,one:4,onei:4,ones:4,onli:4,onto:4,open:4,open_fil:4,openalia:4,openmodel:4,oper:4,opposit:4,optim:4,option:[1,4],order:4,ordin:4,ordinari:4,organ:4,orient:4,orientationconstrainttyp:4,origin:4,ortho:4,orthograph:4,orthographiccameratyp:4,oscil:4,ot:4,oth:4,other:4,otherwis:4,out:4,out_tang:4,out_tangent_typ:4,outan:4,outer:4,outlin:4,output:4,outputtyp:4,outsid:4,outtan:4,outtang:4,over:4,overal:4,overlap:4,overload:4,overrid:4,overridden:4,overview:2,overwrit:4,own:4,owner:4,p:4,pacakg:4,pack:4,packag:4,parabol:4,parabola:4,param0:4,param1:4,param:4,param_nam:4,paramact:4,paramactiontyp:4,paramet:[1,4],parameter:4,parameter_nam:4,parameter_target_curv:4,parametr:4,parametric_valu:4,paramnam:4,parent:4,parent_lay:4,parent_nod:4,parent_node_nam:4,parm:4,pars:4,part:4,partial:4,particular:4,pass:4,patch:4,patch_precis:4,path:4,pattern:4,per:4,percent_effect:4,percentag:4,perform:4,perhap:4,period:4,periodic_to_non_period:4,perpendicular:4,perspect:4,perspectivecameratyp:4,phongdiffus:4,phonggloss_:4,phongreflect:4,phongreflection_:4,phongshiny:4,phongspecularb:4,phongspecularg:4,phongspecularity_:4,phongspecularr:4,pi:4,pick:4,pick_all_lay:4,pick_all_loc:4,pick_by_nam:4,pick_lay:4,pick_loc:4,pick_nod:4,pick_nodes_assigned_to_lay:4,pick_nodes_assigned_to_shad:4,pickabl:4,picked_dags_onli:4,picked_onli:4,picklistmodifi:4,piec:4,pile:4,pivot:4,pixel:4,place:4,planar:4,plane:4,planeattributetyp:4,pleas:4,plotrefresh:4,plu:4,plugin:4,po:4,point:4,pointconstrainttyp:4,pointer:4,pointlighttyp:4,pointtyp:4,pole:4,polygon:4,polygontyp:4,polyset:4,polysetnodetyp:4,polysettyp:4,polysetvertextyp:4,poon:4,pop:4,pop_pick_list:4,posit:4,possibl:4,post:4,postretriev:4,poststor:4,postupd:4,practic:4,pre:4,preced:4,preceed:4,precis:4,prefer:4,prematur:4,prerefresh:4,preretriev:4,present:4,preserv:4,preserve_posit:4,prestor:4,preupdat:4,prev:4,prev_channel:4,prev_clust:4,prev_cluster_d:4,prev_cluster_memb:4,prev_cluster_member_d:4,prev_curve_on_surfac:4,prev_fac:4,prev_inst:4,prev_lay:4,prev_nod:4,prev_pick_item:4,prev_set:4,prev_set_memb:4,prevent:4,previnst:4,previou:4,previous:4,previs:4,primarili:4,print:4,prior:4,process:4,produc:4,product:4,project:4,prompt:4,properli:4,properti:4,proport:4,proportion:4,prorend:4,provid:4,pset:4,pt:4,ptr:4,pure:4,purpos:4,push:4,push_pick_list:4,put:4,pw:4,py:4,python:[0,1,4],quad:4,quadrupl:4,queri:4,question:4,queu:4,queue:4,queue_ev:4,quit:4,r00:4,r01:4,r02:4,r10:4,r11:4,r12:4,r20:4,r21:4,r22:4,r:4,radial:4,radialloc:4,radiallocatortyp:4,radian:4,radiu:4,rais:4,ramphuenois:4,ramphuenoisefrequ:4,rampintensity_:4,rampinterpol:4,rampnois:4,rampnoisefrequ:4,rampposition_:4,ramprampcolor_:4,rampsatnois:4,rampsatnoisefrequ:4,ramptyp:4,rampuwav:4,rampvalnois:4,rampvalnoisefrequ:4,rampvwav:4,ran:4,rang:4,rather:4,ration:4,re:4,reach:4,read:4,readi:4,real:4,real_knot_vector:4,real_number_of_knot:4,realli:4,reason:4,recalcul:4,receiv:4,recogn:4,recommend:4,recomput:4,recreat:4,recurs:4,redefin:4,redraw:4,redraw_flag:4,redraw_screen:4,redrawscreen:4,redund:4,ref_fil:4,refer:2,referenc:4,reference_fil:4,reference_file_1_nam:4,reference_file_1_path:4,reference_file_set_1_nam:4,referencefilead:4,referencefiledelet:4,referencefilemodifi:4,referencefilesetad:4,referencefilesetdelet:4,referencefilesetmodifi:4,referencefilesettyp:4,referencefilestatu:4,referencefiletyp:4,referencelayermodifi:4,referencelayertyp:4,referenceobjecttyp:4,reflect:4,refresh:4,regard:4,regener:4,region:4,regist:4,rel:4,relat:4,relationship:4,relev:4,reli:4,remain:4,remaind:4,remcomput:4,remo:4,remov:4,remove_blind_data:4,remove_com:4,remove_fac:4,remove_from_all_clust:4,remove_from_all_set:4,remove_from_clust:4,remove_from_set:4,remove_joint:4,remove_message_handl:4,remove_refer:4,remove_shad:4,remove_textur:4,remove_warp:4,removefac:4,renam:4,renamestagefailur:4,render:4,reorder:4,reorient:4,repeatedli:4,replac:4,report:4,repres:4,represent:4,represetn:4,request:4,requir:4,reset:[1,4],reset_pivot:4,reset_stag:4,resolut:4,respect:4,respons:4,rest:4,restor:4,restrict:4,result:4,retcod:4,retriev:4,retrieve_opt:4,retrieveopt:4,return_cod:4,return_par:4,returnpar:1,reus:4,revers:4,reverse_curv:4,revolut:4,revolv:4,revsurfattributetyp:4,right:4,root:4,ross:4,rotat:4,rotate_i:4,rotate_pivot:4,rotate_x:4,rotate_z:4,routin:4,row:4,rtype:4,run:4,run_cleanup:4,runcleanup:4,rx:4,ry:4,rype:4,rz:4,s:[2,4],safe:4,salreadycr:4,same:4,sampl:4,sample_channel:4,satisfi:4,save:4,save_fil:4,save_file_a:4,save_invis:4,save_lay:4,sbd:4,scale:4,scale_nonp:4,scale_pivot:4,scan:4,scene:4,scloudamplitud:4,scloudcenterthreshold:4,scloudcolor1b:4,scloudcolor1g:4,scloudcolor1r:4,scloudcolor2b:4,scloudcolor2g:4,scloudcolor2r:4,scloudcontrast:4,scloudedgethreshold:4,scloudlevelmax:4,scloudlevelmin:4,scloudratio:4,scloudsoftedg:4,scloudtransparencyrang:4,scloudxrippl:4,scloudyrippl:4,scloudzrippl:4,scratch:4,screen:4,sdl:4,search:4,search_across:4,search_below:4,search_dag:4,search_node_has_histori:4,search_node_has_non_origin_pivot:[1,4],search_node_has_non_zero_transform:4,search_node_is_inst:[1,4],search_node_is_templ:4,search_node_layer_does_not_match_parent_lay:[1,4],search_node_unused_curves_on_surfac:[1,4],search_node_unused_curves_on_surface_with_histori:[1,4],second:4,second_i:4,second_x:4,second_z:4,section:4,see:4,seed:4,seen:4,segment:4,select:4,self:4,send:4,send_geometry_modified_messag:4,sens:4,separ:4,sequenc:4,sequenti:4,session:4,set:4,set_active_shad:4,set_blind_data:4,set_com:4,set_comb_dens:4,set_comb_displai:4,set_comb_scal:4,set_comb_threshold:4,set_control_point:4,set_copy_anim:4,set_copy_clust:4,set_cvs_unaffected_posit:4,set_cvs_unaffected_position_incl_multipl:4,set_display_mod:4,set_end_point:4,set_exclus:4,set_extrap_type_post:4,set_extrap_type_pr:4,set_filenam:4,set_global_param:4,set_in_tang:4,set_instance_copi:4,set_knot_valu:4,set_knot_vector:4,set_lay:4,set_layer_symmetri:4,set_layers_en:4,set_left_justifi:4,set_left_justify_max_dist:4,set_left_justify_min_dist:4,set_length:4,set_loc:4,set_local_leader_posit:4,set_local_param:4,set_local_rotation_angl:4,set_local_rotation_ax:4,set_lock:4,set_multipl:4,set_num_copi:4,set_offset:4,set_out_tang:4,set_paramet:4,set_parent_window:4,set_patch_precis:4,set_percent_effect:4,set_persistent_id:4,set_radiu:4,set_real_knot_vector:4,set_retrieve_opt:4,set_rot:4,set_rotate_pivot:4,set_scal:4,set_scale_pivot:4,set_show_arrow:4,set_start_point:4,set_store_opt:4,set_surface_orient:4,set_sweep_from_end_point:4,set_sweep_from_start_point:4,set_symmetric_norm:4,set_symmetric_origin:4,set_tangent_typ:4,set_time_offset:4,set_tm:4,set_transl:4,set_true_displai:4,set_unaffected_posit:4,set_valu:4,set_vis:4,set_world_ey:4,set_world_leader_posit:4,set_world_posit:4,set_world_space_offset:4,set_world_transl:4,set_world_up:4,set_world_view:4,setcopyoptionflag:4,setlock:4,setmembertyp:4,setparamet:4,setretrieveopt:4,setstagefailur:4,settangenttyp:4,settyp:4,setworldposit:4,sever:4,sf3d:4,sfailur:4,sfilelevelmax:4,sfilelevelmin:4,sfileproject:4,sfileratio:4,sfilesourcetexture_:4,sfilestagg:4,sfilexamplitud:4,sfilexrippl:4,sfileyamplitud:4,sfileyrippl:4,sfilezrippl:4,sfractalamplitud:4,sfractallevelmaz:4,sfractallevelmin:4,sfractalratio:4,sfractalthreshold:4,sfractalxrippl:4,sfractalyrippl:4,sfractalzrippl:4,shade:4,shader:[1,4],shader_1_nam:4,shader_nam:4,shaderad:4,shaderdelet:4,shaderglowautoexposure_:4,shaderglowglowcolorb:4,shaderglowglowcolorg:4,shaderglowglowcolorr:4,shaderglowgloweccentr:4,shaderglowglowintens:4,shaderglowglowopac:4,shaderglowglowradialnois:4,shaderglowglowspread:4,shaderglowglowstarlevel:4,shaderglowglowtyp:4,shaderglowhalocolorb:4,shaderglowhalocolorg:4,shaderglowhalocolorr:4,shaderglowhaloeccentr:4,shaderglowhalointens:4,shaderglowhalolensflar:4,shaderglowhaloradialnois:4,shaderglowhalospread:4,shaderglowhalostarlevel:4,shaderglowhalotyo:4,shaderglowqu:4,shaderglowradialnoisefrequ:4,shaderglowrot:4,shaderglowstarpoint:4,shaderglowthredhold:4,shadermodifi:4,shaders_inclus:1,shadersinclus:4,shadertyp:4,shading_model:4,shadingfield:4,shadingfielditem:4,shall:4,shape:4,share:4,shear:4,shell:4,shell_nod:4,shellnodetyp:4,shelltyp:4,shortest:4,should:4,show:4,show_arrow:4,shown:4,shrink:4,shrink_closed_surf:4,sibl:4,side:4,similar:4,similarli:4,similiar:4,simpl:4,simpler:4,simpli:4,sinc:4,singl:4,sinsufficientmemori:4,sinvalidargu:4,sinvalidobject:4,six:4,size:4,skeleton:4,skip:4,skip_lay:4,skyairdens:4,skycloudaltitud:4,skycloudbrightnessb:4,skycloudbrightnessg:4,skycloudbrightnessr:4,skyclouddens:4,skycloudhalos:4,skycloudpow:4,skycloudsampl:4,skycloudtexture_:4,skycloudthreshold:4,skydustdens:4,skyfloorsampl:4,skyfloortextur:4,skyfloortextureb:4,skyfloortextureg:4,skyhasfloor:4,skyskybrightnessb:4,skyskybrightnessg:4,skyskybrightnessr:4,skyskyradiu:4,skyskysampl:4,skyskythick:4,skysunazimuth:4,skysunblur:4,skysunbrightnessb:4,skysunbrightnessg:4,skysunbrightnessr:4,skysunelev:4,skysunhalobrightnessb:4,skysunhalobrightnessg:4,skysunhalobrightnessr:4,skysuns:4,skysunsetbrightnessb:4,skysunsetbrightnessg:4,skysunsetbrightnessr:4,skytotalbright:4,slc:4,slow:4,small:4,smarbleamplitud:4,smarblecontrast:4,smarblediffus:4,smarblefillercolorb:4,smarblefillercolorg:4,smarblefillercolorr:4,smarblelevelmax:4,smarblelevelmin:4,smarbleratio:4,smarbleviencolorb:4,smarbleviencolorg:4,smarbleviencolorr:4,smarblevienwidth:4,smarblexrippl:4,smarbleyrippl:4,smarblezrippl:4,snowcolorb:4,snowcolorg:4,snowcolorr:4,snowdepthdecai:4,snowsurfacecolorb:4,snowsurfacecolorg:4,snowsurfacecolorr:4,snowthick:4,snowthreshold:4,so:4,sole:4,solid:4,solut:4,solv:4,solver:4,some:4,somewher:4,soon:4,sourc:4,source_path:4,source_wirefil:4,sourcewirenotfound:4,space:4,spacepointtyp:4,span:4,special:4,specif:4,specifi:4,specifii:4,speed:4,sphere:4,sphereflip:4,spherelighttyp:4,sphereshearu:4,sphereshearv:4,spheresourcetexture_:4,spheric:4,spline:4,split:4,split_c1_break:4,split_closed_basi:4,split_multiknot:4,split_spher:4,spot:4,spotlighttyp:4,squar:4,srockcolor1b:4,srockcolor1g:4,srockcolor1r:4,srockcolor2b:4,srockcolor2g:4,srockcolor2r:4,srockdiffus:4,srockgrains:4,srockmixratio:4,ssuccess:4,stack:4,stage:4,stageact:4,stagecr:4,stagedelet:4,stagemerg:4,stale:4,standard:4,start:4,start_angl:4,start_i:4,start_point:4,start_x:4,start_z:4,state:4,statu:4,statuscod:4,std:4,stdin:4,stencilcolorkeyb:4,stencilcolorkeyg:4,stencilcolorkeyr:4,stenciledgeblend:4,stencilhuerang:4,stencilimage_:4,stencilkeymask:4,stencilmask_:4,stencilmaskblur:4,stencilmasklevel:4,stencilpositivekei:4,stencilsatrang:4,stencilthreshold:4,stencilvalrang:4,step:4,step_fil:4,still:4,stitch:4,stl:4,stop:4,storabl:4,store:4,store_act:4,store_current_window:4,store_opt:4,str:4,str_value_1:4,straight:4,straightforward:4,stream:4,streamtyp:4,string:4,structur:4,subclass:4,subdiv:4,subdivid:4,subdivis:4,subecrossorientation_:4,subsequ:4,subset:4,substitut:4,subunit:4,succe:4,succed:4,succeed:4,succesfulli:4,success:4,successfulli:4,summari:2,suppli:4,support:4,surfac:4,surface_1_nam:4,surface_nod:4,surfacecurvetyp:4,surfacecvtyp:4,surfacenodetyp:4,surfacepointtyp:4,surfaceto:4,surfacetyp:4,sweep:4,switchshad:4,switchshadertyp:4,swoodag:4,swoodcenteru:4,swoodcenterv:4,swoodfillercolorb:4,swoodfillercolorg:4,swoodfillercolorr:4,swoodgraincolorb:4,swoodgraincolorg:4,swoodgraincolorr:4,swoodgraincontrast:4,swoodgrainspac:4,swoodlayers:4,swoodlevelmax:4,swoodlevelmin:4,swoodrandom:4,swoodratio:4,swoodveincolorb:4,swoodveincolorg:4,swoodveincolorr:4,swoodveinspread:4,swoodxamplitud:4,swoodxrippl:4,swoodyamplitud:4,swoodyrippl:4,swoodzrippl:4,sx:4,sy:4,symmetr:4,symmetri:4,symmetric_norm:4,symmetric_origin:4,symmetry_st:4,symmetryst:4,synwallelast:4,system:4,sz:4,sz_expr_text:4,szexprtext:4,t1:4,t2:4,t:4,taht:4,tailor:4,take:4,tangent:4,tangent_typ:4,tangentfast:4,tangentfix:4,tangentflat:4,tangentinout:4,tangentlinear:4,tangentslow:4,tangentsmooth:4,tangentstep:4,tangentunchang:4,tansform:4,target:4,target_curv:4,target_dirnam:4,targetcurv:4,task:4,teh:4,tell:4,templat:4,temporarili:4,termin:4,tessel:4,tessellate_adapt:4,tessellate_chord_height_devi:4,tessellate_chord_height_deviation_accur:4,tessellate_chord_height_deviation_fast:4,tessellate_numb:4,tessellate_render_set:4,tessellate_uniform:4,tessellatequad:4,tessellatetriangl:4,test:4,text:4,textual:4,textur:4,texture_1_nam:4,texture_nam:4,texture_nod:4,texture_typ:4,textureact:4,texturead:4,texturedelet:4,texturemodifi:4,texturenodetyp:4,texturetyp:4,th:4,than:4,thati:4,thei:4,them:4,themselv:4,theori:4,therefor:4,therein:4,thi:4,thing:4,third:4,those:4,though:4,three:4,threshold:4,through:4,throughout:4,thu:4,thumnail:4,tif:4,tiff:4,time:4,time_offset:4,timewarp:4,tm:4,tm_1:4,to_list:4,togeth:4,toggl:4,toler:4,toleranc:4,tonemappingexposure_:4,tonemappinggamma_:4,tonemappingsaturation_:4,tool:4,top:4,top_level_onli:4,topolog:4,toruslighttyp:4,total:4,touch:4,toward:4,track:4,tranform:4,trans_norm:4,trans_point:4,trans_vector:4,transfer:4,transform:4,translat:4,transparencymaterialcod:4,transpos:4,tranvers:4,travers:4,traverse_dag:4,traversedaginputdata:[1,4],traversedagoutputdata:4,treat:4,tree:4,tri:4,triangl:4,trigger:4,trim:4,trim_curv:4,trim_to_surf:4,trimboundarytyp:4,trimcurvetyp:4,trimregiontyp:4,trimsurfac:4,triplet:4,true_displai:4,tsm:4,tupl:4,turn:4,twice:4,two:4,tx0:4,tx:4,ty0:4,ty:4,tye:4,type:4,typecast:4,tz0:4,tz:4,u:4,unabl:4,unaffect:4,unaffected_posit:4,unchang:4,under:4,underneath:4,understand:4,uneffect:4,ungroup:4,ungroup_opt:4,ungroupopt:4,uniform:4,uniformuv:4,uninstanc:4,union:4,uniqu:4,unique_ptr:4,unit:4,univers:4,universeact:4,universecr:4,universedelet:4,universemerg:4,unknown:4,unknownchannel:4,unless:4,unlik:4,unlock:4,unnecessari:4,unpick:4,unpick_all_lay:4,unpick_all_loc:4,unrecogn:4,unsaf:4,unset:4,unsign:4,until:4,untrim:4,untrimsurfac:4,unus:4,unusedtyp:4,up:4,up_nod:4,updat:[2,4],update_draw_info:4,update_refer:4,upperbound:4,uptod:4,us:4,usag:4,use_sequenti:4,useconstructionplan:4,user:4,user_typ:4,usual:4,util:4,uuid:4,uv:4,v4:4,v:4,vacuou:4,valid:4,valu:4,variant:4,variou:4,vdaf:4,vdai:4,vec3:4,vector:4,vectoraltangenttyp:4,veri:4,versa:4,version:[1,4],vertex:4,vertic:4,via:4,vice:4,view:4,view_typ:4,viewfram:4,viewinvalid:4,viewoth:4,virtual:4,visibl:4,visible_in_layer_bar:4,visit:4,volumefrom:4,volumelighttyp:4,volumepixsequence_:4,volumeto:4,vred:4,w:4,wa:4,wai:4,wait:4,walk:4,want:4,warn:4,warp:4,wasn:4,water:4,wateramplitud:4,waterfrequ:4,waternumwav:4,waterreflectionboundari:4,waterrippleamplitud:4,waterrippledrops:4,waterripplefrequ:4,waterripplegroupveloc:4,waterripplephaseveloc:4,waterripplespreadr:4,waterripplespreadstart:4,waterrippletim:4,waterrippleuorigin:4,waterripplevorigin:4,watersmooth:4,watersubfrequ:4,waterumax:4,waterumin:4,watervmax:4,watervmin:4,waterwavetim:4,waterwaveveloc:4,waterwindu:4,waterwindv:4,we:4,weight:4,well:4,were:4,what:[2,4],whatev:4,when:4,whenev:4,where:4,wherea:4,whether:4,which:4,whose:4,width:4,window:4,windowtyp:4,wire:4,wirefil:4,wish:4,within:4,without:4,work:4,workflow:4,world:4,world_coordin:4,world_ey:4,world_leader_posit:4,world_posit:4,world_spac:4,world_space_offset:4,world_up:4,world_view:4,worldcoordin:4,worldposit:4,worldspac:4,would:4,wrapper:4,write:4,written:4,x:4,x_axi:4,x_compon:4,xy:4,y1:4,y2:4,y:4,y_axi:4,y_compon:4,yard:4,yet:4,you:4,your:4,yup:4,z:4,z_axi:4,z_compon:4,z_displac:4,zero:4,zero_transform:4,zero_transform_top_level:4,zup:4},titles:["alias_api","What\u2019s Changed","Alias Python API","Module Overview","Reference"],titleterms:{"new":1,alia:2,alias_api:0,api:2,chang:1,modul:3,overview:3,python:2,refer:4,s:1,summari:1,updat:1,what:1}}) \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..7577acb1 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..9484fa67 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: 'v2.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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&&"function"!=typeof e.item},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.6.0",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+~]|"+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&&e.namespaceURI,n=e&&(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="",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="";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},j=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":{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:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(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)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"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,D=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\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="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_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",""]);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\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(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").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 _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.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(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.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,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.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").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):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]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/logo.png b/_static/logo.png new file mode 100644 index 00000000..41a70b9c Binary files /dev/null and b/_static/logo.png differ diff --git a/_static/logo@2x.png b/_static/logo@2x.png new file mode 100644 index 00000000..d7df097b Binary files /dev/null and b/_static/logo@2x.png differ diff --git a/_static/logo_sg@2x.png b/_static/logo_sg@2x.png new file mode 100644 index 00000000..35225eec Binary files /dev/null and b/_static/logo_sg@2x.png differ diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +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: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/alias_python_api.html b/alias_python_api.html new file mode 100644 index 00000000..e69b49c0 --- /dev/null +++ b/alias_python_api.html @@ -0,0 +1,179 @@ + + + + + + + + + Alias Python API — tk-framework-alias v2.0.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Alias Python API

+

The Alias Python API is a Python module that provides communication with Alias. It provides the python bindings for the Alias C++ API. The API is used to interact with Alias from Python. See the Reference for what functionality is available in the API.

+
+

Reference

+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Autodesk.

+
+ + + +
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..3d6cbbe9 --- /dev/null +++ b/genindex.html @@ -0,0 +1,166 @@ + + + + + + + + Index — tk-framework-alias v2.0.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Autodesk.

+
+ + + +
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..6e0a744e --- /dev/null +++ b/index.html @@ -0,0 +1,182 @@ + + + + + + + + + Toolkit Framework for Alias — tk-framework-alias v2.0.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Toolkit Framework for Alias

+
+

Overview

+

The Flow Production Tracking Toolkit (FPTR) Framework for Alias provides support for integrating FPTR into Alias. It is used alongside the FPTR Engine for Alias (tk-alias) to allow running FPTR Toolkit Apps from within Alias. This framework provides the necessary Alias distribution files to run FPTR in all the supported versions of Alias.

+
+
+

Contents

+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Autodesk.

+
+ + + +
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..df29a8fd Binary files /dev/null and b/objects.inv differ diff --git a/search.html b/search.html new file mode 100644 index 00000000..5150b488 --- /dev/null +++ b/search.html @@ -0,0 +1,181 @@ + + + + + + + + Search — tk-framework-alias v2.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, Autodesk.

+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..eed73915 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["alias_python_api", "index"], "filenames": ["alias_python_api.rst", "index.rst"], "titles": ["Alias Python API", "Toolkit Framework for Alias"], "terms": {"The": [0, 1], "i": [0, 1], "modul": 0, "provid": [0, 1], "commun": 0, "It": [0, 1], "bind": 0, "c": 0, "us": [0, 1], "interact": 0, "from": [0, 1], "see": 0, "what": 0, "function": 0, "avail": 0, "2023": 0, "2024": 0, "0": 0, "2025": 0, "1": 0, "flow": 1, "product": 1, "track": 1, "fptr": 1, "support": 1, "integr": 1, "alongsid": 1, "engin": 1, "tk": 1, "allow": 1, "run": 1, "app": 1, "within": 1, "thi": 1, "necessari": 1, "distribut": 1, "file": 1, "all": 1, "version": 1, "python": 1, "api": 1, "refer": 1}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"alia": [0, 1], "python": 0, "api": 0, "refer": 0, "toolkit": 1, "framework": 1, "overview": 1, "content": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "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.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Alias Python API": [[0, "alias-python-api"]], "Reference": [[0, "reference"]], "Toolkit Framework for Alias": [[1, "toolkit-framework-for-alias"]], "Overview": [[1, "overview"]], "Contents": [[1, "contents"]]}, "indexentries": {}}) \ No newline at end of file