Added: tinkerpop/site/docs/4.0.0-beta.1/dev/future/index.html
URL: 
http://svn.apache.org/viewvc/tinkerpop/site/docs/4.0.0-beta.1/dev/future/index.html?rev=1923192&view=auto
==============================================================================
--- tinkerpop/site/docs/4.0.0-beta.1/dev/future/index.html (added)
+++ tinkerpop/site/docs/4.0.0-beta.1/dev/future/index.html Fri Jan 17 22:45:40 
2025
@@ -0,0 +1,1465 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.18">
+<title>TinkerPop Future</title>
+<style>
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+/* ========================================================================== 
HTML5 display definitions 
========================================================================== */
+/** Correct `block` display not defined in IE 8/9. */
+@import 
url(http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.1/css/font-awesome.css);
+article, aside, details, figcaption, figure, footer, header, hgroup, main, 
nav, section, summary { display: block; }
+
+/** Correct `inline-block` display not defined in IE 8/9. */
+audio, canvas, video { display: inline-block; }
+
+/** Prevent modern browsers from displaying `audio` without controls. Remove 
excess height in iOS 5 devices. */
+audio:not([controls]) { display: none; height: 0; }
+
+/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` 
element in IE, Safari, and Firefox < 22. */
+[hidden], template { display: none; }
+
+script { display: none !important; }
+
+/* ========================================================================== 
Base ========================================================================== 
*/
+/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust 
after orientation change, without disabling user zoom. */
+html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ 
-webkit-text-size-adjust: 100%; /* 2 */ }
+
+/** Remove default margin. */
+body { margin: 0; }
+
+/* ========================================================================== 
Links 
========================================================================== */
+/** Remove the gray background color from active links in IE 10. */
+a { background: transparent; }
+
+/** Address `outline` inconsistency between Chrome and other browsers. */
+a:focus { outline: thin dotted; }
+
+/** Improve readability when focused and also mouse hovered in all browsers. */
+a:active, a:hover { outline: 0; }
+
+/* ========================================================================== 
Typography 
========================================================================== */
+/** Address variable `h1` font-size and margin within `section` and `article` 
contexts in Firefox 4+, Safari 5, and Chrome. */
+h1 { font-size: 2em; margin: 0.67em 0; }
+
+/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
+abbr[title] { border-bottom: 1px dotted; }
+
+/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
+b, strong { font-weight: bold; }
+
+/** Address styling not present in Safari 5 and Chrome. */
+dfn { font-style: italic; }
+
+/** Address differences between Firefox and other browsers. */
+hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
+
+/** Address styling not present in IE 8/9. */
+mark { background: #ff0; color: #000; }
+
+/** Correct font family set oddly in Safari 5 and Chrome. */
+code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
+
+/** Improve readability of pre-formatted text in all browsers. */
+pre { white-space: pre-wrap; }
+
+/** Set consistent quote types. */
+q { quotes: "\201C" "\201D" "\2018" "\2019"; }
+
+/** Address inconsistent and variable font size in all browsers. */
+small { font-size: 80%; }
+
+/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: 
baseline; }
+
+sup { top: -0.5em; }
+
+sub { bottom: -0.25em; }
+
+/* ========================================================================== 
Embedded content 
========================================================================== */
+/** Remove border when inside `a` element in IE 8/9. */
+img { border: 0; }
+
+/** Correct overflow displayed oddly in IE 9. */
+svg:not(:root) { overflow: hidden; }
+
+/* ========================================================================== 
Figures 
========================================================================== */
+/** Address margin not present in IE 8/9 and Safari 5. */
+figure { margin: 0; }
+
+/* ========================================================================== 
Forms 
========================================================================== */
+/** Define consistent border, margin, and padding. */
+fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 
0.75em; }
+
+/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so 
people aren't caught out if they zero out fieldsets. */
+legend { border: 0; /* 1 */ padding: 0; /* 2 */ }
+
+/** 1. Correct font family not being inherited in all browsers. 2. Correct 
font size not being inherited in all browsers. 3. Address margins set 
differently in Firefox 4+, Safari 5, and Chrome. */
+button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 
100%; /* 2 */ margin: 0; /* 3 */ }
+
+/** Address Firefox 4+ setting `line-height` on `input` using `!important` in 
the UA stylesheet. */
+button, input { line-height: normal; }
+
+/** Address inconsistent `text-transform` inheritance for `button` and 
`select`. All other form control elements do not inherit `text-transform` 
values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 
Correct `select` style inheritance in Firefox 4+ and Opera. */
+button, select { text-transform: none; }
+
+/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 
and `video` controls. 2. Correct inability to style clickable `input` types in 
iOS. 3. Improve usability and consistency of cursor style between image-type 
`input` and others. */
+button, html input[type="button"], input[type="reset"], input[type="submit"] { 
-webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }
+
+/** Re-set default cursor for disabled elements. */
+button[disabled], html input[disabled] { cursor: default; }
+
+/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess 
padding in IE 8/9. */
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ 
padding: 0; /* 2 */ }
+
+/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. 
Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` 
to future-proof). */
+input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: 
content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }
+
+/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS 
X. */
+input[type="search"]::-webkit-search-cancel-button, 
input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
+
+/** Remove inner padding and border in Firefox 4+. */
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+
+/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and 
alignment in all browsers. */
+textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }
+
+/* ========================================================================== 
Tables 
========================================================================== */
+/** Remove most spacing between table cells. */
+table { border-collapse: collapse; border-spacing: 0; }
+
+meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; 
width: 768px; }
+
+meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; 
width: 1280px; }
+
+meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; 
width: 1440px; }
+
+*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: 
border-box; box-sizing: border-box; }
+
+html, body { font-size: 100%; }
+
+body { background: white; color: #222222; padding: 0; margin: 0; font-family: 
"Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: 
normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
+
+a:hover { cursor: pointer; }
+
+img, object, embed { max-width: 100%; height: auto; }
+
+object, embed { height: 100%; }
+
+img { -ms-interpolation-mode: bicubic; }
+
+#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, 
.map_canvas embed, .map_canvas object { max-width: none !important; }
+
+.left { float: left !important; }
+
+.right { float: right !important; }
+
+.text-left { text-align: left !important; }
+
+.text-right { text-align: right !important; }
+
+.text-center { text-align: center !important; }
+
+.text-justify { text-align: justify !important; }
+
+.hide { display: none; }
+
+.antialiased, body { -webkit-font-smoothing: antialiased; }
+
+img { display: inline-block; vertical-align: middle; }
+
+textarea { height: auto; min-height: 50px; }
+
+select { width: 100%; }
+
+p.lead, .paragraph.lead > p, #preamble > .sectionbody > 
.paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
+
+.subheader, #content #toctitle, .admonitionblock td.content > .title, 
.exampleblock > .title, .imageblock > .title, .listingblock > .title, 
.literalblock > .title, .mathblock > .title, .openblock > .title, .paragraph > 
.title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, 
.verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, 
.ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { 
line-height: 1.4; color: #6c818f; font-weight: 300; margin-top: 0.2em; 
margin-bottom: 0.5em; }
+
+/* Typography resets */
+div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > 
.title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; 
direction: ltr; }
+
+/* Default Link Styles */
+a { color: #444444; text-decoration: underline; line-height: inherit; }
+a:hover, a:focus { color: #111111; }
+a img { border: none; }
+
+/* Default paragraph styles */
+p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 
1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
+p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
+
+/* Default header styles */
+h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { 
font-family: ff-meta-web-pro-1, ff-meta-web-pro-2, Arial, "Helvetica Neue", 
sans-serif; font-weight: bold; font-style: normal; color: #465158; 
text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; 
line-height: 1.2125em; }
+h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > 
.title small, h4 small, h5 small, h6 small { font-size: 60%; color: #909ea7; 
line-height: 0; }
+
+h1 { font-size: 2.125em; }
+
+h2 { font-size: 1.6875em; }
+
+h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
+
+h4 { font-size: 1.125em; }
+
+h5 { font-size: 1.125em; }
+
+h6 { font-size: 1em; }
+
+hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 
0 1.1875em; height: 0; }
+
+/* Helpful Typography Defaults */
+em, i { font-style: italic; line-height: inherit; }
+
+strong, b { font-weight: bold; line-height: inherit; }
+
+small { font-size: 60%; line-height: inherit; }
+
+code { font-family: "Consolas", "Deja Vu Sans Mono", "Bitstream Vera Sans 
Mono", monospace; font-weight: normal; color: #444444; }
+
+/* Lists */
+ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; 
list-style-position: outside; font-family: inherit; }
+
+ul, ol { margin-left: 0; }
+ul.no-bullet, ol.no-bullet { margin-left: 0; }
+
+/* Unordered Lists */
+ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* 
Override nested font-size change */ }
+ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
+ul.square { list-style-type: square; }
+ul.circle { list-style-type: circle; }
+ul.disc { list-style-type: disc; }
+ul.no-bullet { list-style: none; }
+
+/* Ordered Lists */
+ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
+
+/* Definition Lists */
+dl dt { margin-bottom: 0.3em; font-weight: bold; }
+dl dd { margin-bottom: 0.75em; }
+
+/* Abbreviations */
+abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; 
border-bottom: 1px dotted #dddddd; cursor: help; }
+
+abbr { text-transform: none; }
+
+/* Blockquotes */
+blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+blockquote cite { display: block; font-size: 0.8125em; color: #748590; }
+blockquote cite:before { content: "\2014 \0020"; }
+blockquote cite a, blockquote cite a:visited { color: #748590; }
+
+blockquote, blockquote p { line-height: 1.5; color: #909ea7; }
+
+/* Microformats */
+.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid 
#dddddd; padding: 0.625em 0.75em; }
+.vcard li { margin: 0; display: block; }
+.vcard .fn { font-weight: bold; font-size: 0.9375em; }
+
+.vevent .summary { font-weight: bold; }
+.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: 
none; padding: 0 0.0625em; }
+
+@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, 
.sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
+  h1 { font-size: 2.75em; }
+  h2 { font-size: 2.3125em; }
+  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
+  h4 { font-size: 1.4375em; } }
+/* Print styles.  Inlined to avoid required HTTP connection: 
www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 
Boilerplate (html5boilerplate.com)
+*/
+.print-only { display: none !important; }
+
+@media print { * { background: transparent !important; color: #000 !important; 
/* Black prints faster: h5bp.com/s */ box-shadow: none !important; text-shadow: 
none !important; }
+  a, a:visited { text-decoration: underline; }
+  a[href]:after { content: " (" attr(href) ")"; }
+  abbr[title]:after { content: " (" attr(title) ")"; }
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; 
}
+  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+  thead { display: table-header-group; /* h5bp.com/t */ }
+  tr, img { page-break-inside: avoid; }
+  img { max-width: 100% !important; }
+  @page { margin: 0.5cm; }
+  p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; 
widows: 3; }
+  h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: 
avoid; }
+  .hide-on-print { display: none !important; }
+  .print-only { display: block !important; }
+  .hide-for-print { display: none !important; }
+  .show-for-print { display: inherit !important; } }
+/* Tables */
+table { background: white; margin-bottom: 1.25em; border: solid 0 #dddddd; }
+table thead, table tfoot { background: none; font-weight: bold; }
+table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { 
padding: 1px 8px 1px 5px; font-size: 1em; color: #222222; text-align: left; }
+table tr th, table tr td { padding: 1px 8px 1px 5px; font-size: 1em; color: 
#222222; }
+table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
+table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table 
tfoot tr td { display: table-cell; line-height: 1.5; }
+
+.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { 
content: " "; display: table; }
+.clearfix:after, .float-group:after { clear: both; }
+
+*:not(pre) > code { font-size: 0.95em; padding: 0; white-space: nowrap; 
background-color: #f2f2f2; border: 0 solid #dddddd; -webkit-border-radius: 6px; 
border-radius: 6px; text-shadow: none; }
+
+pre, pre > code { line-height: 1.2; color: inherit; font-family: "Consolas", 
"Deja Vu Sans Mono", "Bitstream Vera Sans Mono", monospace; font-weight: 
normal; }
+
+.keyseq { color: #333333; }
+
+kbd:not(.keyseq) { display: inline-block; color: black; font-size: 0.75em; 
line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; 
-webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 
rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 
0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 
0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }
+
+.keyseq kbd:first-child { margin-left: 0; }
+
+.keyseq kbd:last-child { margin-right: 0; }
+
+.menuseq, .menu { color: black; }
+
+b.button:before, b.button:after { position: relative; top: -1px; font-weight: 
normal; }
+
+b.button:before { content: "["; padding: 0 3px 0 2px; }
+
+b.button:after { content: "]"; padding: 0 2px 0 3px; }
+
+p a > code:hover { color: #373737; }
+
+#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; 
margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 
1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
+#header:before, #header:after, #content:before, #content:after, 
#footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " 
"; display: table; }
+#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
+
+#header { margin-bottom: 2.5em; }
+#header > h1 { color: #111111; font-weight: bold; border-bottom: 1px solid 
#dddddd; margin-bottom: -28px; padding-bottom: 32px; }
+#header span { color: #909ea7; }
+#header #revnumber { text-transform: capitalize; }
+#header br { display: none; }
+#header br + span { padding-left: 3px; }
+#header br + span:before { content: "\2013 \0020"; }
+#header br + span.author { padding-left: 0; }
+#header br + span.author:before { content: ", "; }
+
+#toc { border-bottom: 1px solid #dddddd; padding-bottom: 1.25em; }
+#toc > ul { margin-left: 0.25em; }
+#toc ul.sectlevel0 > li > a { font-style: italic; }
+#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+#toc ul { list-style-type: none; }
+
+#toctitle { color: #6c818f; }
+
+@media only screen and (min-width: 768px) { body.toc2 { padding-left: 15em; 
padding-right: 0; }
+  #toc.toc2 { position: fixed; width: 15em; left: 0; top: 0; border-right: 1px 
solid #dddddd; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; 
overflow: auto; }
+  #toc.toc2 #toctitle { margin-top: 0; font-size: 1.2em; }
+  #toc.toc2 > ul { font-size: .90em; }
+  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
+  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
+  body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid 
#dddddd; left: auto; right: 0; } }
+@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; 
padding-right: 0; }
+  #toc.toc2 { width: 20em; }
+  #toc.toc2 #toctitle { font-size: 1.375em; }
+  #toc.toc2 > ul { font-size: 0.95em; }
+  #toc.toc2 ul ul { padding-left: 1.25em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
+#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; 
-webkit-border-radius: 6px; border-radius: 6px; }
+#content #toc > :first-child { margin-top: 0; }
+#content #toc > :last-child { margin-bottom: 0; }
+#content #toc a { text-decoration: none; }
+
+#content #toctitle { font-weight: bold; font-family: ff-meta-web-pro-1, 
ff-meta-web-pro-2, Arial, "Helvetica Neue", sans-serif; font-size: 1em; 
padding-left: 0.125em; }
+
+#footer { max-width: 100%; background-color: black; padding: 1.25em; }
+
+#footer-text { color: white; line-height: 1.35; }
+
+.sect1 { padding-bottom: 1.25em; }
+
+.sect1 + .sect1 { border-top: 1px solid #dddddd; }
+
+#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, 
.sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 
> a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; 
text-decoration: none; visibility: hidden; text-align: center; font-weight: 
normal; }
+#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, 
#toctitle > a.anchor:before, .sidebarblock > .content > .title > 
a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > 
a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; 
display: block; margin-top: 0.05em; }
+#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > 
a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, 
.sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, 
#toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, 
h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > 
a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; 
}
+#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, 
.sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > 
a.link { color: #465158; text-decoration: none; }
+#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > 
a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > 
a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #3b444a; }
+
+.imageblock, .literalblock, .listingblock, .mathblock, .verseblock, 
.videoblock { margin-bottom: 1.25em; }
+
+.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > 
.title, .listingblock > .title, .literalblock > .title, .mathblock > .title, 
.openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > 
.title, .tableblock > .title, .verseblock > .title, .videoblock > .title, 
.dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > 
.title { text-align: left; font-weight: bold; }
+
+.tableblock > caption { text-align: left; font-weight: bold; white-space: 
nowrap; overflow: visible; max-width: 0; }
+
+table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { 
font-size: inherit; }
+
+.admonitionblock > table { border: 0; background: none; width: 100%; }
+.admonitionblock > table td.icon { text-align: center; width: 80px; }
+.admonitionblock > table td.icon img { max-width: none; }
+.admonitionblock > table td.icon .title { font-weight: bold; text-transform: 
uppercase; }
+.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 
1.25em; border-left: 1px solid #dddddd; color: #909ea7; }
+.admonitionblock > table td.content > :last-child > :last-child { 
margin-bottom: 0; }
+
+.exampleblock > .content { border-style: solid; border-width: 1px; 
border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: 
white; -webkit-border-radius: 6px; border-radius: 6px; }
+.exampleblock > .content > :first-child { margin-top: 0; }
+.exampleblock > .content > :last-child { margin-bottom: 0; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6, .exampleblock > .content p { color: #333333; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
+.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, 
.exampleblock > .content h3.subheader, .exampleblock > .content 
.subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, 
.exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, 
.exampleblock > .content h6.subheader { line-height: 1.4; }
+
+.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; 
box-shadow: 0 1px 8px #d9d9d9; }
+
+.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; 
-webkit-border-radius: 6px; border-radius: 6px; }
+.sidebarblock > :first-child { margin-top: 0; }
+.sidebarblock > :last-child { margin-bottom: 0; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6, .sidebarblock p { color: #333333; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; }
+.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock 
h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > 
.subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, 
.sidebarblock h6.subheader { line-height: 1.4; }
+.sidebarblock > .content > .title { color: #6c818f; margin-top: 0; 
line-height: 1.5; }
+
+.exampleblock > .content > :last-child > :last-child, .exampleblock > .content 
.olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul 
> li:last-child > :last-child, .exampleblock > .content .qlist > ol > 
li:last-child > :last-child, .sidebarblock > .content > :last-child > 
:last-child, .sidebarblock > .content .olist > ol > li:last-child > 
:last-child, .sidebarblock > .content .ulist > ul > li:last-child > 
:last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child 
{ margin-bottom: 0; }
+
+.literalblock pre:not([class]), .listingblock pre:not([class]) { background: 
#eeeeee; }
+.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock 
pre[class] { border-width: 1px; border-style: solid; border-color: #cccccc; 
-webkit-border-radius: 6px; border-radius: 6px; padding: 0.5em; word-wrap: 
break-word; }
+.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock 
pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: 
pre; word-wrap: normal; }
+.literalblock pre > code, .literalblock pre[class] > code, .listingblock pre > 
code, .listingblock pre[class] > code { display: block; }
+@media only screen { .literalblock pre, .literalblock pre[class], 
.listingblock pre, .listingblock pre[class] { font-size: 0.76em; } }
+@media only screen and (min-width: 768px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.855em; } 
}
+@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.95em; } }
+
+.listingblock pre.highlight { padding: 0; }
+.listingblock pre.highlight > code { padding: 0.5em; }
+
+.listingblock > .content { position: relative; }
+
+.listingblock:hover code[class*=" language-"]:before { text-transform: 
uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; 
right: 0.375em; }
+
+.listingblock:hover code.asciidoc:before { content: "asciidoc"; }
+.listingblock:hover code.clojure:before { content: "clojure"; }
+.listingblock:hover code.css:before { content: "css"; }
+.listingblock:hover code.groovy:before { content: "groovy"; }
+.listingblock:hover code.html:before { content: "html"; }
+.listingblock:hover code.java:before { content: "java"; }
+.listingblock:hover code.javascript:before { content: "javascript"; }
+.listingblock:hover code.python:before { content: "python"; }
+.listingblock:hover code.ruby:before { content: "ruby"; }
+.listingblock:hover code.sass:before { content: "sass"; }
+.listingblock:hover code.scss:before { content: "scss"; }
+.listingblock:hover code.xml:before { content: "xml"; }
+.listingblock:hover code.yaml:before { content: "yaml"; }
+
+.listingblock.terminal pre .command:before { content: attr(data-prompt); 
padding-right: 0.5em; color: #999; }
+
+.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; }
+
+table.pyhltable { border: 0; margin-bottom: 0; }
+
+table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; }
+
+table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
+
+.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; 
padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }
+
+.highlight.pygments .lineno { display: inline-block; margin-right: .25em; }
+
+table.pyhltable .linenodiv { background-color: transparent !important; 
padding-right: 0 !important; }
+
+.quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; 
border: 0; }
+.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
+.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; 
font-size: 0.8125em; color: #748590; }
+.quoteblock .attribution br { display: none; }
+.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }
+
+table thead th, table tfoot th { font-weight: bold; }
+
+table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; 
-webkit-border-radius: 6px; border-radius: 6px; border-top: 0 solid #dddddd; 
border-bottom: 0 solid #dddddd; }
+
+table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; 
border-right: 0; }
+
+table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; 
border-bottom: 0; }
+
+table.tableblock td .paragraph:last-child p > p:last-child, table.tableblock 
th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; }
+
+th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; }
+
+th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; }
+
+th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; 
}
+
+th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; }
+
+th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: 
bottom; }
+
+th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: 
middle; }
+
+tbody tr th { display: table-cell; line-height: 1.5; background: none; }
+
+tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #222222; 
font-weight: bold; }
+
+td > div.verse { white-space: pre; }
+
+ol { margin-left: 0.25em; }
+
+ul li ol { margin-left: 0; }
+
+dl dd { margin-left: 1.125em; }
+
+dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
+
+ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist 
.olist, .olist .ulist { margin-bottom: 0.625em; }
+
+ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; }
+
+ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; }
+
+ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, 
ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
margin-right: 0.25em; }
+
+ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
position: relative; top: 1px; }
+
+ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 
0; padding: 0; list-style: none; overflow: hidden; }
+ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: 
block; }
+ul.inline > li > * { display: block; }
+
+.unstyled dl dt { font-weight: normal; font-style: normal; }
+
+ol.arabic { list-style-type: decimal; }
+
+ol.decimal { list-style-type: decimal-leading-zero; }
+
+ol.loweralpha { list-style-type: lower-alpha; }
+
+ol.upperalpha { list-style-type: upper-alpha; }
+
+ol.lowerroman { list-style-type: lower-roman; }
+
+ol.upperroman { list-style-type: upper-roman; }
+
+ol.lowergreek { list-style-type: lower-greek; }
+
+.hdlist > table, .colist > table { border: 0; background: none; }
+.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; 
}
+
+td.hdlist1 { padding-right: .75em; font-weight: bold; }
+
+td.hdlist1, td.hdlist2 { vertical-align: top; }
+
+.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
+
+.colist > table tr > td:first-of-type { padding: 0 .75em; line-height: 1; }
+.colist > table tr > td:last-of-type { padding: 0.25em 0; }
+
+.qanda > ol > li > p > em:only-child { color: #373737; }
+
+.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; 
-webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }
+
+.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 
1.25em 0; }
+.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 
1.25em 0.625em; }
+.imageblock > .title { margin-bottom: 0; }
+.imageblock.thumb, .imageblock.th { border-width: 6px; }
+.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
+
+.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; 
display: inline-block; line-height: 0; }
+.image.left { margin-right: 0.625em; }
+.image.right { margin-left: 0.625em; }
+
+a.image { text-decoration: none; }
+
+span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
+span.footnote a, span.footnoteref a { text-decoration: none; }
+
+#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 
0.625em; }
+#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; 
border-width: 1px 0 0 0; }
+#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 
0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
+#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: 
none; }
+#footnotes .footnote:last-of-type { margin-bottom: 0; }
+
+#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 
0; }
+
+.gist .file-data > table { border: none; background: #fff; width: 100%; 
margin-bottom: 0; }
+.gist .file-data > table td.line-data { width: 99%; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+.big { font-size: larger; }
+
+.small { font-size: smaller; }
+
+.underline { text-decoration: underline; }
+
+.overline { text-decoration: overline; }
+
+.line-through { text-decoration: line-through; }
+
+.aqua { color: #00bfbf; }
+
+.aqua-background { background-color: #00fafa; }
+
+.black { color: black; }
+
+.black-background { background-color: black; }
+
+.blue { color: #0000bf; }
+
+.blue-background { background-color: #0000fa; }
+
+.fuchsia { color: #bf00bf; }
+
+.fuchsia-background { background-color: #fa00fa; }
+
+.gray { color: #606060; }
+
+.gray-background { background-color: #7d7d7d; }
+
+.green { color: #006000; }
+
+.green-background { background-color: #007d00; }
+
+.lime { color: #00bf00; }
+
+.lime-background { background-color: #00fa00; }
+
+.maroon { color: #600000; }
+
+.maroon-background { background-color: #7d0000; }
+
+.navy { color: #000060; }
+
+.navy-background { background-color: #00007d; }
+
+.olive { color: #606000; }
+
+.olive-background { background-color: #7d7d00; }
+
+.purple { color: #600060; }
+
+.purple-background { background-color: #7d007d; }
+
+.red { color: #bf0000; }
+
+.red-background { background-color: #fa0000; }
+
+.silver { color: #909090; }
+
+.silver-background { background-color: #bcbcbc; }
+
+.teal { color: #006060; }
+
+.teal-background { background-color: #007d7d; }
+
+.white { color: #bfbfbf; }
+
+.white-background { background-color: #fafafa; }
+
+.yellow { color: #bfbf00; }
+
+.yellow-background { background-color: #fafa00; }
+
+span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; 
}
+
+.admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; 
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
+.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #444444; 
color: #333333; }
+.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 
1px 2px rgba(155, 155, 0, 0.8); color: #111; }
+.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: 
#bf6900; }
+.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: 
#bf3400; }
+.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: 
#bf0000; }
+
+.conum { display: inline-block; color: white !important; background-color: 
black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; 
width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 
20px; font-family: Arial, sans-serif; font-style: normal; position: relative; 
top: -2px; letter-spacing: -1px; }
+.conum * { color: white !important; }
+.conum + b { display: none; }
+.conum:after { content: attr(data-value); }
+.conum:not([data-value]):empty { display: none; }
+
+.listingblock code { white-space: pre; overflow: auto; overflow-wrap: normal; 
/* needed for webkit browsers */ }
+
+#toc ul.sectlevel0 > li > a { font-style: normal; font-weight: bold; }
+
+h4 { color: #6c818f; }
+
+.literalblock > .content > pre, .listingblock > .content > pre { 
-webkit-border-radius: 6px; border-radius: 6px; margin-left: 2em; margin-right: 
2em; }
+
+.admonitionblock { margin-left: 2em; margin-right: 2em; }
+.admonitionblock > table { border: 1px solid #609060; border-top-width: 1.5em; 
background-color: #e9ffe9; border-collapse: separate; -webkit-border-radius: 0; 
border-radius: 0; }
+.admonitionblock > table td.icon { padding-top: .5em; padding-bottom: .5em; }
+.admonitionblock > table td.content { padding: .5em 1em; color: black; 
font-size: .9em; border-left: none; }
+
+.sidebarblock { background-color: #e8ecef; border-color: #ccc; }
+.sidebarblock > .content > .title { color: #444444; }
+
+table.tableblock.grid-all { border-collapse: collapse; -webkit-border-radius: 
0; border-radius: 0; }
+table.tableblock.grid-all th.tableblock, table.tableblock.grid-all 
td.tableblock { border-bottom: 1px solid #aaa; }
+
+#footer { background-color: #465158; padding: 2em; }
+
+#footer-text { color: #eee; font-size: 0.8em; text-align: center; }
+.tabs{position:relative;margin:40px 
auto;width:1024px;max-width:100%;overflow:hidden;padding-top:10px;margin-bottom:60px}.tabs
 
input{position:absolute;z-index:1000;height:50px;left:0;top:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);cursor:pointer;margin:0}.tabs
 input:hover+label{background:#e08f24}.tabs 
label{background:#e9ffe9;color:#1a1a1a;font-size:15px;line-height:50px;height:60px;position:relative;top:0;padding:0
 
20px;float:left;display:block;letter-spacing:1px;text-transform:uppercase;font-weight:bold;text-align:center;box-shadow:2px
 0 2px rgba(0,0,0,0.1),-2px 0 2px 
rgba(0,0,0,0.1);box-sizing:border-box;-webkit-transition:all 150ms ease 
0s;transition:all 150ms ease 0s}.tabs label:hover{cursor:pointer}.tabs 
label:after{content:'';background:#609060;position:absolute;bottom:-2px;left:0;width:100%;height:2px;display:block}.tabs-2
 input{width:50%}.tabs-2 input.tab-selector-1{left:0%}.tabs-2 
input.tab-selector-2{left:50%}.tabs-
 2 label{width:50%}.tabs-3 input{width:33.3333333333%}.tabs-3 
input.tab-selector-1{left:0%}.tabs-3 
input.tab-selector-2{left:33.3333333333%}.tabs-3 
input.tab-selector-3{left:66.6666666667%}.tabs-3 
label{width:33.3333333333%}.tabs-4 input{width:25%}.tabs-4 
input.tab-selector-1{left:0%}.tabs-4 input.tab-selector-2{left:25%}.tabs-4 
input.tab-selector-3{left:50%}.tabs-4 input.tab-selector-4{left:75%}.tabs-4 
label{width:25%}.tabs-5 input{width:20%}.tabs-5 
input.tab-selector-1{left:0%}.tabs-5 input.tab-selector-2{left:20%}.tabs-5 
input.tab-selector-3{left:40%}.tabs-5 input.tab-selector-4{left:60%}.tabs-5 
input.tab-selector-5{left:80%}.tabs-5 label{width:20%}.tabs-6 
input{width:16.6666666667%}.tabs-6 input.tab-selector-1{left:0%}.tabs-6 
input.tab-selector-2{left:16.6666666667%}.tabs-6 
input.tab-selector-3{left:33.3333333333%}.tabs-6 
input.tab-selector-4{left:50%}.tabs-6 
input.tab-selector-5{left:66.6666666667%}.tabs-6 
input.tab-selector-6{left:83.3333333333%}.tabs-6 label{width:16.666666666
 7%}.tabs-7 input{width:14.2857142857%}.tabs-7 
input.tab-selector-1{left:0%}.tabs-7 
input.tab-selector-2{left:14.2857142857%}.tabs-7 
input.tab-selector-3{left:28.5714285714%}.tabs-7 
input.tab-selector-4{left:42.8571428571%}.tabs-7 
input.tab-selector-5{left:57.1428571429%}.tabs-7 
input.tab-selector-6{left:71.4285714286%}.tabs-7 
input.tab-selector-7{left:85.7142857143%}.tabs-7 
label{width:14.2857142857%}.tabs 
label:first-of-type{z-index:4}.tab-label-2{z-index:4}.tab-label-3{z-index:3}.tab-label-4{z-index:2}.tabs
 
input:checked+label{background:#609060;color:#fefefe;z-index:6}.clear-shadow{clear:both}.tabcontent{height:auto;width:100%;float:left;position:relative;z-index:5;background:#eee;top:-10px;box-sizing:border-box}.tabcontent>div{position:relative;float:left;width:0;height:0;box-sizing:border-box;top:0;left:0;z-index:1;opacity:0;background:#eee}.tabcontent
 .CodeRay{background-color:#fefefe}.tabs .tab-selector-1:checked ~ .tabcontent 
.tabcontent-1{z-index:100;-ms-filter:"progid:DXIm
 
ageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-2:checked ~ .tabcontent 
.tabcontent-2{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-3:checked ~ .tabcontent 
.tabcontent-3{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-4:checked ~ .tabcontent 
.tabcontent-4{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-5:checked ~ .tabcontent 
.tabcontent-5{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(o
 
pacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-6:checked ~ .tabcontent 
.tabcontent-6{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-7:checked ~ .tabcontent 
.tabcontent-7{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}
+
+.invisible {color: rgba(0,0,0,0); font-size: 0;}
+</style>
+<!--
+-->
+<!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+    /* We explicitly disable cookie tracking to avoid privacy issues */
+    _paq.push(['disableCookies']);
+    /* tracker methods like "setCustomDimension" should be called before 
"trackPageView" */
+    _paq.push(['trackPageView']);
+    _paq.push(['enableLinkTracking']);
+    (function() {
+        var u="https://analytics.apache.org/";;
+        _paq.push(['setTrackerUrl', u+'matomo.php']);
+        _paq.push(['setSiteId', '27']);
+        var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code -->
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel0">
+<li><a href="#_tinkerpop_future">TinkerPop Future</a></li>
+<li><a href="#roadmap">Roadmap</a>
+<ul class="sectlevel1">
+<li><a href="#_tinkerpop_4_x">TinkerPop 4.x</a>
+<ul class="sectlevel2">
+<li><a href="#_4_0_0_beta_1_release_2024q4">4.0.0-beta.1 Release 
(2024Q4)</a></li>
+<li><a href="#_4_0_2025h1">4.0 (2025H1)</a></li>
+<li><a href="#_4_14_x">4.1&#8230;&#8203;4.x</a></li>
+</ul>
+</li>
+<li><a href="#_tinkerpop_5_x">TinkerPop 5.x</a></li>
+</ul>
+</li>
+<li><a href="#_proposals">Proposals</a></li>
+<li><a href="#_appendix">Appendix</a>
+<ul class="sectlevel1">
+<li><a href="#_tinkerpop_4_x_feature_details">TinkerPop 4.x Feature Details</a>
+<ul class="sectlevel3">
+<li><a href="#http-support">HTTP support - Server</a></li>
+<li><a href="#http-support-glv">HTTP support - GLVs</a></li>
+<li><a href="#io-updates">IO serialization updates</a></li>
+<li><a href="#gremlin-lang-default">Switch default from 
<code>GremlinGroovyScriptEngine</code> to 
<code>GremlinLangScriptEngine</code></a></li>
+<li><a href="#console-rework">Gremlin Console rework</a></li>
+<li><a href="#tx-redesign">Transaction redesign</a></li>
+<li><a href="#bytecode-removal">Bytecode removal</a></li>
+<li><a href="#groovy-removal">Groovy removal in Gremlin Server</a></li>
+<li><a href="#schema-support">Schema support</a></li>
+<li><a href="#multi-label">Multi-label, no label, mutable label 
support</a></li>
+<li><a href="#meta-props-on-edge">Multi/meta properties on edges</a></li>
+<li><a href="#pluggable-explain">Pluggable System for 
explain/profile()</a></li>
+<li><a href="#local-step-improve">Improve <code>local()</code> step</a></li>
+<li><a href="#type-casts">Type conversion with <code>cast()</code> 
step</a></li>
+<li><a href="#geo-vector-patterns">New Gremlin language elements for 
geospatial and vector computation</a></li>
+<li><a href="#match-step-improve">Rework <code>match()</code> step</a></li>
+<li><a href="#has-traversal"><code>has()</code> accepting Traversal</a></li>
+<li><a href="#query-cancel">Query status/query cancellation</a></li>
+<li><a href="#algorithm-steps">Unify algorithm steps</a></li>
+<li><a href="#io-olap">Modernize IO for OLAP</a></li>
+<li><a href="#neo4-removal">Remove <code>neo4j-gremlin</code></a></li>
+<li><a href="#docs-reorg">Documentation reorganization</a></li>
+<li><a href="#sparql-deprecate">Deprecate <code>sparql-gremlin</code></a></li>
+<li><a href="#proxy">Proxy implementation</a></li>
+<li><a href="#io-step-improve"><code>io()</code> step improvements</a></li>
+<li><a href="#matrix-test">Matrix testing</a></li>
+<li><a href="#telemerty">Improved telemetry in driver/server</a></li>
+<li><a href="#type-system">Type System</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="imageblock">
+<div class="content">
+<a class="image" href="https://tinkerpop.apache.org";><img 
src="../../images/apache-tinkerpop-logo.png" alt="apache tinkerpop logo" 
width="500"></a>
+</div>
+</div>
+<div class="paragraph">
+<p><strong>4.0.0-beta.1</strong></p>
+</div>
+</div>
+</div>
+<h1 id="_tinkerpop_future" class="sect0">TinkerPop Future</h1>
+<div class="openblock partintro">
+<div class="content">
+<div class="paragraph">
+<p>This document offers a rough view at what features can be expected from 
future releases and catalogs proposals for
+changes that might be better written and understood in a document form as 
opposed to a dev list post.</p>
+</div>
+<div class="paragraph">
+<p>This document is meant to change and restructure frequently and should 
serve more as a guide rather than directions set
+in stone. As this document represents a future look, the current version is 
always on the <code>master</code> branch and therefore
+the only one that need be maintained.</p>
+</div>
+</div>
+</div>
+<h1 id="roadmap" class="sect0">Roadmap</h1>
+<div class="openblock partintro">
+<div class="content">
+<div class="paragraph">
+<p><span class="image left"><img 
src="../../images/gremlin-explorer-old-photo.png" alt="gremlin explorer old 
photo" width="250"></span>This section provides some expectations as to what 
features
+might be provided in future <a 
href="https://tinkerpop.apache.org/docs/4.0.0-beta.1/dev/developer/#_versioning";>major
 versions</a>. It
+is not a guarantee of a feature landing in a particular version, but it yields 
some sense of what core developers have
+some focus on. The most up-to-date version of this document will always be in 
the
+<a 
href="https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/index.asciidoc";>git
 repository</a>.</p>
+</div>
+<div class="paragraph">
+<p>The sub-sections that follow only outline those release lines that expect 
to include significant new features. Other
+release lines may continue to be active with maintenance work and bug fixes, 
but won&#8217;t be listed here. The items listed
+in each release line represent unreleased changes only. Once an official 
release is made for a line, the roadmap items
+are removed with new items taking their place as they are planned. The release 
line is removed from the roadmap
+completely when it is no longer maintained.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_tinkerpop_4_x">TinkerPop 4.x</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TinkerPop 4 marks the beginning of the move into semantic versioning, as 
discussed in the <a 
href="https://lists.apache.org/thread/g85tbsocmpv5oksq0xs425cgrw8xkdnn";>DISCUSS 
thread</a>.
+Development has begun with the switch from WebSocket to HTTP/1.1 for the 
underlying transport of Gremlin Server, along
+with many new features that have been proposed. Here is a rough outline of 
where new features are expected to land, with
+major breaking features lined for 4.0, and additional features lined up for 
minor versions.
+Additional details on each feature can be found in the Appendix.</p>
+</div>
+<div class="sect2">
+<h3 id="_4_0_0_beta_1_release_2024q4">4.0.0-beta.1 Release (2024Q4)</h3>
+<div class="paragraph">
+<p>As discussed in the <a 
href="https://lists.apache.org/thread/hh58k28qy49lb9k7b9j4mnqvpxj0xf85";>DISCUSS 
thread</a>, we are looking
+to release a beta build of what is done so far to gather feedback.</p>
+</div>
+<div class="paragraph">
+<p>This beta would roughly offer the opportunity to try Gremlin Server HTTP 
with the revised GraphSON and GraphBinary
+serialization formats for TinkerPop 4.0, using Java and Python drivers. These 
drivers will initially continue to support
+GraphSON as it can help with debugging (given its human-readable format)  and 
offers wider serialization options for users
+in these early days, we should expect to just have GraphBinary support for 
drivers in the future for simplicity.</p>
+</div>
+<div class="paragraph">
+<p>This beta release would include the following list of features for 
preview:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#http-support">HTTP support - Server</a></p>
+<div class="ulist">
+<ul>
+<li>
+<p>Replacement of WebSocket with HTTP/1.1 (<a 
href="https://lists.apache.org/thread/vfs1j9ycb8voxwc00gdzfmlg2gghx3n1";>DISCUSS 
thread</a>)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#http-support-glv">HTTP support - GLVs</a> - Switching from 
WebSocket to HTTP in GLVs relies on community contribution in each language</p>
+<div class="ulist">
+<ul>
+<li>
+<p><code>gremlin-java</code></p>
+</li>
+<li>
+<p><code>gremlin-python</code></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#io-updates">IO serialization updates</a> (<a 
href="https://lists.apache.org/thread/q7h5yzd2r064lv82njbmt6lmty4s24y7";>DISCUSS 
thread</a>)</p>
+</li>
+<li>
+<p><a href="#bytecode-removal">Bytecode removal</a> (<a 
href="https://lists.apache.org/thread/7m3govzsqtmmj224xs7k5vv1ycnmocjn";>DISCUSS 
thread</a>)</p>
+</li>
+<li>
+<p><a href="#console-rework">Gremlin Console rework</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_4_0_2025h1">4.0 (2025H1)</h3>
+<div class="paragraph">
+<p>Full GA release of TinkerPop 4.0.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#http-support">HTTP support - Server</a></p>
+<div class="ulist">
+<ul>
+<li>
+<p>Replacement of WebSocket with HTTP/1.1 (<a 
href="https://lists.apache.org/thread/vfs1j9ycb8voxwc00gdzfmlg2gghx3n1";>DISCUSS 
thread</a>)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#http-support-glv">HTTP support - GLVs</a> - Switching from 
WebSocket to HTTP in GLVs relies on community contribution in each language</p>
+<div class="ulist">
+<ul>
+<li>
+<p><code>gremlin-java</code></p>
+</li>
+<li>
+<p><code>gremlin-python</code></p>
+</li>
+<li>
+<p><code>gremlin-javascript</code></p>
+</li>
+<li>
+<p><code>gremlin-dotnet</code></p>
+</li>
+<li>
+<p><code>gremlin-go</code></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#io-updates">IO serialization updates</a> (<a 
href="https://lists.apache.org/thread/q7h5yzd2r064lv82njbmt6lmty4s24y7";>DISCUSS 
thread</a>)</p>
+</li>
+<li>
+<p><a href="#bytecode-removal">Bytecode removal</a> (<a 
href="https://lists.apache.org/thread/7m3govzsqtmmj224xs7k5vv1ycnmocjn";>DISCUSS 
thread</a>)</p>
+</li>
+<li>
+<p><a href="#gremlin-lang-default">Switch default from 
<code>GremlinGroovyScriptEngine</code> to 
<code>GremlinLangScriptEngine</code></a></p>
+</li>
+<li>
+<p><a href="#console-rework">Gremlin Console rework</a></p>
+</li>
+<li>
+<p><a href="#multi-label">Multi-label, no label, mutable label support</a></p>
+</li>
+<li>
+<p><a href="#tx-redesign">Transaction redesign</a> - API</p>
+<div class="ulist">
+<ul>
+<li>
+<p>The design of the API with server/core implementations would be viable for 
the initial release</p>
+</li>
+<li>
+<p>Adding support for these APIs in GLVs sets it up for the implementation in 
the next iteration</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#neo4-removal">Remove <code>neo4j-gremlin</code></a></p>
+</li>
+<li>
+<p><a href="#sparql-deprecate">Deprecate <code>sparql-gremlin</code></a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_4_14_x">4.1&#8230;&#8203;4.x</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tx-redesign">Transaction redesign</a> - Implementation</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Full API implementation in TinkerGraph</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><a href="#io-step-improve"><code>io()</code> step improvements</a></p>
+</li>
+<li>
+<p><a href="#proxy">Proxy implementation</a></p>
+</li>
+<li>
+<p><a href="#geo-vector-patterns">New Gremlin language elements for geospatial 
and vector computation</a></p>
+</li>
+<li>
+<p><a href="#local-step-improve">Improve <code>local()</code> step</a></p>
+</li>
+<li>
+<p><a href="#type-casts">Type conversion with <code>cast()</code> step</a></p>
+</li>
+<li>
+<p><a href="#match-step-improve">Rework <code>match()</code> step</a></p>
+</li>
+<li>
+<p><a href="#has-traversal"><code>has()</code> accepting Traversal</a></p>
+</li>
+<li>
+<p><a href="#algorithm-steps">Unify algorithm steps</a></p>
+</li>
+<li>
+<p><a href="#matrix-test">Matrix testing</a></p>
+</li>
+<li>
+<p><a href="#query-cancel">Query status/query cancellation</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_tinkerpop_5_x">TinkerPop 5.x</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#groovy-removal">Groovy removal in Gremlin Server</a></p>
+</li>
+<li>
+<p><a href="#type-system">Type System</a></p>
+</li>
+<li>
+<p><a href="#schema-support">Schema support</a></p>
+</li>
+<li>
+<p><a href="#pluggable-explain">Pluggable System for explain/profile()</a></p>
+</li>
+<li>
+<p><a href="#io-olap">Modernize IO for OLAP</a></p>
+</li>
+<li>
+<p><a href="#docs-reorg">Documentation reorganization</a></p>
+</li>
+<li>
+<p><a href="#telemerty">Improved telemetry in driver/server</a></p>
+</li>
+<li>
+<p><a href="#meta-props-on-edge">Multi/meta properties on edges</a></p>
+</li>
+</ul>
+</div>
+<hr>
+<div class="paragraph">
+<p><strong>Features originally planned for 3.7.x.</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Add support for traversals as parameters for <code>V()</code>, 
<code>is()</code>, and <code>has()</code> (includes <code>Traversal</code> 
arguments to <code>P</code>)</p>
+</li>
+<li>
+<p>Add subgraph/tree structure in all GLVs</p>
+</li>
+<li>
+<p>Define semantics for query federation across Gremlin servers (depends on 
<code>call()</code> step)</p>
+</li>
+<li>
+<p>Gremlin debug support</p>
+</li>
+<li>
+<p>Case-insensitive search (<a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2673";>TINKERPOP-2673</a>)</p>
+</li>
+<li>
+<p>Mutation steps for <code>clone()</code> of an <code>Element</code> and for 
<code>moveE()</code> for edges.</p>
+</li>
+<li>
+<p>Add a language element to merge <code>Map</code> objects more easily.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<h1 id="_proposals" class="sect0">Proposals</h1>
+<div class="openblock partintro">
+<div class="content">
+<div class="paragraph">
+<p>This section tracks and details future ideas. While the dev list is the 
primary place to talk about new ideas, complex
+topics can be initiated from and/or promoted to this space. While it is fine 
to include smaller bits of content directly
+in <code>future/index.asciidoc</code>, longer, more developed proposals and 
ideas would be better added as individual asciidoc
+files which would then be included as links to the GitHub repository where 
they will be viewable in a formatted state.
+In this way, this section is more just a list of links to proposals rather 
than an expansion of text. Proposals should
+be named according to this pattern "proposal-&lt;name&gt;-&lt;number&gt;" 
where the "name" is just a logical title to help identify
+the proposal and the "number" is the incremented proposal count.</p>
+</div>
+<div class="paragraph">
+<p>The general structure of a proposal is fairly open but should include an 
initial "Status" section which would describe
+the current state of the proposal. A new proposal would likely hae a status 
like "Open for discussion". From there,
+the proposal should include something about the "motivation" for the change 
which describes a bit about what the issue
+is and why a change is needed. Finally, it should explain the details of the 
change itself.</p>
+</div>
+<div class="paragraph">
+<p>At this stage, the proposal can then be submitted as a pull request for 
comment. As part of that pull request, the
+proposal should be added to the table below. Proposals always target the 
<code>master</code> branch.</p>
+</div>
+<div class="paragraph">
+<p>The table below lists various proposals and their disposition. The 
<strong>Targets</strong> column identifies the release or releases
+to which the proposal applies and the <strong>Resolved</strong> column helps 
clarify the state of the proposal itself. Generally
+speaking, the proposal is "resolved" when the core tenants of its contents are 
established. For some proposals that
+might mean "fully implemented", but it might also mean "scheduled and scoped 
with open issues set aside". In that sense,
+the meaning is somewhat subjective. Consulting the "Status" section of the 
proposal itself will provide the complete
+story.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 18.75%;">
+<col style="width: 62.5%;">
+<col style="width: 12.5%;">
+<col style="width: 6.25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Proposal</th>
+<th class="tableblock halign-left valign-top">Description</th>
+<th class="tableblock halign-left valign-top">Targets</th>
+<th class="tableblock halign-center valign-top">Resolved</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a 
href="https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/proposal-equality-1.asciidoc";>Proposal
 1</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Equality, 
Equivalence, Comparability and Orderability Semantics - Documents existing 
Gremlin semantics along with clarifications for ambiguous behaviors and 
recommendations for consistency.</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.6.0</p></td>
+<td class="tableblock halign-center valign-top"><p 
class="tableblock">Y</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a 
href="https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/proposal-arrow-flight-2";>Proposal
 2</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Gremlin 
Arrow Flight.</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">Future</p></td>
+<td class="tableblock halign-center valign-top"><p 
class="tableblock">N</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a 
href="https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/proposal-3-remove-closures";>Proposal
 3</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removing 
the Need for Closures/Lambda in Gremlin</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.7.0</p></td>
+<td class="tableblock halign-center valign-top"><p 
class="tableblock">Y</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a 
href="https://github.com/apache/tinkerpop/blob/master/docs/src/dev/future/proposal-transaction-4";>Proposal
 4</a></p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">TinkerGraph Transaction Support</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">3.7.0</p></td>
+<td class="tableblock halign-center valign-top"><p 
class="tableblock">Y</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<h1 id="_appendix" class="sect0">Appendix</h1>
+<div class="sect1">
+<h2 id="_tinkerpop_4_x_feature_details">TinkerPop 4.x Feature Details</h2>
+<div class="sectionbody">
+<div class="sect3">
+<h4 id="http-support">HTTP support - Server</h4>
+<div class="paragraph">
+<p>Currently under development in the <code>master-http</code> branch. This 
body of work aims to replace the WebSocket protocol in Gremlin Server
+with HTTP/1.1 (<a 
href="https://lists.apache.org/thread/vfs1j9ycb8voxwc00gdzfmlg2gghx3n1";>DISCUSS 
thread</a>).
+For API design, see <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-3065";>TINKERPOP-3065
+Implement a new HTTP API</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="http-support-glv">HTTP support - GLVs</h4>
+<div class="paragraph">
+<p>As server will no longer support WebSocket, each GLVs will also switch to 
HTTP protocol. Connection
+options should be simplified with HTTP compared to WebSocket, and should be 
unified across all GLVs to the best of each
+language&#8217;s library availability. This will also include implementing 
interface for pluggable request interceptor for authentication,
+as raised in the <a 
href="https://lists.apache.org/thread/cpsdd7gjmr1yb6c5kkm6v2bcfpp6fqq5";>DISCUSS 
thread</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="io-updates">IO serialization updates</h4>
+<div class="paragraph">
+<p>TinkerPop&#8217;s serialization IO has not been updated for quite a long 
time, there are serializers that can and should likely be
+removed, and definition updated to make the IO overall more simple and 
maintainable. (<a 
href="https://lists.apache.org/thread/q7h5yzd2r064lv82njbmt6lmty4s24y7";>DISCUSS 
thread</a>)</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="gremlin-lang-default">Switch default from 
<code>GremlinGroovyScriptEngine</code> to 
<code>GremlinLangScriptEngine</code></h4>
+<div class="paragraph">
+<p>Switching the default script processing from 
<code>GremlinGroovyScriptEngine</code> to <code>GremlinLangScriptEngine</code> 
is a step towards removing
+dependency on Groovy in the Gremlin Server. Currently, the TinkerPop testing 
system make heavy use of the Groovy script engine, and
+a major portion of the work will involve updating the tests.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="console-rework">Gremlin Console rework</h4>
+<div class="paragraph">
+<p>As a result of sessions removal and switch to <code>gremlin-lang</code>, 
the Gremlin Console remote mode will be affected, and users
+may notice a difference in the interactive experience on the Console. 
Additional discussions may be needed on the impact and acceptable changes.
+(<a 
href="https://lists.apache.org/thread/rd70smb8jntws1kvz19pyxz23qdgtc2o";>DISCUSS 
thread</a>)</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tx-redesign">Transaction redesign</h4>
+<div class="paragraph">
+<p>As transaction will have to be implemented over HTTP, this is an 
opportunity to improve the usability of the transaction APIs.
+This potentially mean redesigning the transaction model so that it is better 
suited for all graphs, align remote and embedded
+transaction usages, and ensure transaction support in GLVs.
+Such API redesign will be a breaking change that needs to be introduced in the 
initial release of TP4, which can include
+stub implementations only, with full implementation added iteratively in minor 
releases.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="bytecode-removal">Bytecode removal</h4>
+<div class="paragraph">
+<p>One of the purposes that bytecode served was to provide a universal way to 
translate a Traversal. However, with the introduction of
+the <code>gremlin-lang</code> parser this need can be fulfilled differently. 
Any Gremlin script can be converted into a Traversal in a uniform way which 
reduces the
+need for bytecode. Now, we are left with two systems that serve a similar 
purpose, it is probably time to remove one of them during a major
+version upgrade, see (<a 
href="https://lists.apache.org/thread/7m3govzsqtmmj224xs7k5vv1ycnmocjn";>DISCUSS 
thread</a>).</p>
+</div>
+<div class="paragraph">
+<p>Before the full removal can be implemented, a few updates will be needed in 
<code>gremlin-lang</code> to ensure appropriate types are covered.
+Each GLV will also have to be updated to switch from bytecode based to string 
based traversal construction. A proposed plan includes:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Extract interface from Bytecode, and implement string based traversals and 
request options</p>
+</li>
+<li>
+<p>Add support for missing types, such as UUID, Set, Edge, ByteBuffer, etc. in 
<code>gremlin-lang</code> (<a 
href="https://issues.apache.org/jira/browse/TINKERPOP-3023";>TINKERPOP-3023</a>)</p>
+</li>
+<li>
+<p>Add missing types to GLVs and rework traversal generation</p>
+</li>
+<li>
+<p>Ensure Feature tests work properly</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p><strong>I/O serialization update needed</strong></p>
+</div>
+<div class="paragraph">
+<p>One important note for this proposed plan is that currently 
<code>gremlin-lang</code> does not cover all types supported via Bytecode,
+which means either <em>all missing types need to be fully defined and 
implemented in the <code>gremlin-lang</code> parser for parity
+(related to <a href="#type-system">Type System</a>)</em>, or <em>consensus 
have to be reached in the community on if reduced type support
+is acceptable, and if so, which types can be omitted at this point.</em></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="groovy-removal">Groovy removal in Gremlin Server</h4>
+<div class="paragraph">
+<p>Removing Groovy from Gremlin Server implies:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Revising the configuration system to avoid the init script through Groovy. 
This is also an opportunity to simply server set-up.</p>
+</li>
+<li>
+<p>Deprecate <code>GremlinGroovyScriptEngine</code> for 
<code>GremlinLangScriptEngine</code> for script processing</p>
+</li>
+<li>
+<p>Remove/replace all the Groovy based plugin infrastructure from the 
server</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>One main impact of how Groovy allows arbitrary code to be executed on the 
server is security vulnerabilities.
+However, the removal of this system itself has overreaching affects in the 
community that should be discussed.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="schema-support">Schema support</h4>
+<div class="paragraph">
+<p>Schema support relies on a well-defined type system.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="multi-label">Multi-label, no label, mutable label support</h4>
+<div class="paragraph">
+<p>TinkerPop only support single, immutable labels for its Elements. Various 
providers have implemented their own mechanisms
+for multi-label, no label, and/or mutable label support. Many popular 
non-TinkerPop graph models also allow for multiple labels. It is time to 
consider
+bringing these functionalities into parity.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="meta-props-on-edge">Multi/meta properties on edges</h4>
+<div class="paragraph">
+<p>Currently, meta-properties only exists on vertices, this extends to 
allowing meta-properties on edges.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="pluggable-explain">Pluggable System for explain/profile()</h4>
+<div class="paragraph">
+<p>While TinkerPop provides explain() and profile() steps, switching to a 
pluggable architecture would increase flexibility for
+providers who wish to customize the amount and format of information they 
return. (<a 
href="https://lists.apache.org/thread/y8zbyx1jm5whbsw5kmo5vp58l8z815qc";>DISCUSS 
Thread</a>)</p>
+</div>
+<div class="paragraph">
+<p>An extension of this is for explain() to work in remote fashion, see <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2128";>TINKERPOP-2128</a></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="local-step-improve">Improve <code>local()</code> step</h4>
+<div class="paragraph">
+<p>The concept and application of the <code>local()</code> step has been 
somewhat confusing to users, and the addition of the string and list
+manipulation steps in 3.7 further blurred some definitions of local execution 
in a traversal. It is a good time to start considering
+a redesign or improved design of the <code>local()</code> step.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="type-casts">Type conversion with <code>cast()</code> step</h4>
+<div class="paragraph">
+<p>We have introduced <code>asString()</code> and <code>asDate()</code> in 
3.7, this would be to introduce additional casting steps like 
<code>toInt()</code>, which
+should rely on a well-defined type system.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="geo-vector-patterns">New Gremlin language elements for geospatial and 
vector computation</h4>
+<div class="paragraph">
+<p>Similar to how string and list manipulation steps were introduced, there is 
room for creating first-class steps for vector computation
+and geospatial steps (<a 
href="https://lists.apache.org/thread/mxg3kopgj9h9v8j299qjhdhopzpdkfow";>DISCUSS 
Thread</a>).</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="match-step-improve">Rework <code>match()</code> step</h4>
+<div class="paragraph">
+<p>The <code>match()</code> step has been an attempt to introduce a way of 
declarative form of querying in TinkerPop based on pattern matching.
+There exists various issues with the step, and rework is due for 
improvements.</p>
+</div>
+<div class="paragraph">
+<p>Unresolved issues related to current <code>match()</code>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2961";>TINKERPOP-2961 
Missing exceptions for unsolvable match pattern</a></p>
+</li>
+<li>
+<p><a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2528";>TINKERPOP-2528 
Improve match() step to generate traversals that uses indexes</a></p>
+</li>
+<li>
+<p><a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2503";>TINKERPOP-2503 
Implement look-ahead on PathRetractionStrategy</a></p>
+</li>
+<li>
+<p><a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2340";>TINKERPOP-2340 
MatchStep with VertexStep Exceptions</a></p>
+</li>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/TINKERPOP-940";>TINKERPOP-940 
Convert LocalTraversals to MatchSteps in OLAP</a></p>
+</li>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/TINKERPOP-736";>TINKERPOP-736 
Automatic Traversal rewriting</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="has-traversal"><code>has()</code> accepting Traversal</h4>
+<div class="paragraph">
+<p>This is a body of work that was in the roadmap for 3.7.x, which is to add 
support of traversals as parameters to <code>has()</code>,
+which should expand the usability of the Gremlin language.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="query-cancel">Query status/query cancellation</h4>
+<div class="paragraph">
+<p>These are useful features for debugging and improved resource management 
that have been implemented by providers, but would now be
+a good time to bring parity into TinkerPop.</p>
+</div>
+<div class="paragraph">
+<p>Related issue: <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2210";>TINKERPOP-2210 
Support cancellation of remote traversals</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="algorithm-steps">Unify algorithm steps</h4>
+<div class="paragraph">
+<p>Moving the algorithm steps into <code>call()</code> step or generify them 
in some way.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="io-olap">Modernize IO for OLAP</h4>
+<div class="paragraph">
+<p>As name suggests, we should remove old file serialization formats, and 
introduce more modernized format for IO. One possible
+candidate is <a 
href="https://github.com/apache/incubator-graphar";>GraphAR</a>, which is a 
standard data file format for graph data
+storage and retrieval, currently an incubating Apache project.</p>
+</div>
+<div class="paragraph">
+<p>A potential large extension of this work, which may not be included for 
this version yet, is revisiting OLAP in general to resolve
+<a 
href="https://issues.apache.org/jira/browse/TINKERPOP-1298?jql=project%20%3D%20TINKERPOP%20AND%20status%20%3D%20Open%20AND%20text%20~%20%22OLAP%22";>open
 JIRA issues</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="neo4-removal">Remove <code>neo4j-gremlin</code></h4>
+<div class="paragraph">
+<p>As discussed inside (<a 
href="https://lists.apache.org/thread/lxn4s9fs8rzggm0jlnffnphfpqnpn3h8";>DISCUSS 
thread</a>), <code>neo4j-gremlin</code> was deprecated in 3.7
+with the introduction of native transaction in TinkerGraph. TP4 would be the 
place to remove the module.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="docs-reorg">Documentation reorganization</h4>
+<div class="paragraph">
+<p>In addition to the necessary documentation updates needed for new TP4 
feature implementations, this entails more major rework
+to the documentation structure.</p>
+</div>
+<div class="paragraph">
+<p>The current documentation is very thorough in certain areas, but lacking in 
many others. The accumulation of the features and functionalities
+over the past years likely mean that certain information are outdated, and/or 
should be reworded for clarity. While we have a generous
+amount of reference material, there tend to lack implementation guidelines for 
contributors and providers. TP4 is an opportunity to rework
+the documentations to be more thorough, concise, clear, and easy to update 
when new features are implemented.</p>
+</div>
+<div class="paragraph">
+<p>Another implication of this is to revisit the current documentation 
generation process. We have a very complex scripting structure that we use to
+orchestrate the generation of documentations, combined with Maven plugins for 
language specific docs. This process maybe affected by
+any major alterations to documentation structure, which would need some effort 
to revise.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="sparql-deprecate">Deprecate <code>sparql-gremlin</code></h4>
+<div class="paragraph">
+<p>This module of TinkerPop has been largely unmaintained and likely unused 
for many years. Unless we receive fresh interest and contribution,
+it would be the time to deprecate and remove in a future version.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="proxy">Proxy implementation</h4>
+<div class="paragraph">
+<p>Implementing a proxy for Gremlin Server might be a viable alternative to 
implementing clustering in the client, for
+orchestrating multiple Gremlin Server instances, and/or rerouting 
WebSocket/HTTP requests for compatibility.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="io-step-improve"><code>io()</code> step improvements</h4>
+<div class="paragraph">
+<p>Simply <code>io()</code> for data ingestion and export in both embedded and 
remote usage in some way, and add support for CSV format.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="matrix-test">Matrix testing</h4>
+<div class="paragraph">
+<p>This aims to create an automated testing set up, which helps to ensure 
compatibility between drivers and server across minor releases,
+and to make sure API contracts are not broken unintentionally.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="telemerty">Improved telemetry in driver/server</h4>
+<div class="paragraph">
+<p>This is a less well-defined area, aimed at improved metrics collection that 
can better aid debugging for users and providers.
+Work may include adding the ability to debug queries and traversals, adding 
OpenTelemetry support, etc.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="type-system">Type System</h4>
+<div class="paragraph">
+<p>TinkerPop has not had one&#8217;s own type system defined and has been 
relying on the JVM types, which becomes a problem especially in
+GLVs that doesn&#8217;t have corresponding types defined in their language. 
(<a 
href="https://lists.apache.org/thread/rpdq3ywk6vqpyv512to36ot8yqvjo3dv";>DISCUSS 
thread</a>)</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2025-01-17 14:43:29 -0800
+</div>
+</div>
+</body>
+</html>


Reply via email to