Browse Source

update plugin files

REJack 4 years ago
parent
commit
8ed4788d65
60 changed files with 5228 additions and 398 deletions
  1. 1 1
      plugins/codemirror/addon/edit/closebrackets.js
  2. 1 1
      plugins/codemirror/addon/edit/continuelist.js
  3. 7 5
      plugins/codemirror/addon/edit/matchbrackets.js
  4. 8 5
      plugins/codemirror/addon/fold/brace-fold.js
  5. 1 1
      plugins/codemirror/addon/hint/javascript-hint.js
  6. 9 7
      plugins/codemirror/addon/hint/show-hint.js
  7. 2 2
      plugins/codemirror/addon/hint/sql-hint.js
  8. 1 1
      plugins/codemirror/addon/search/match-highlighter.js
  9. 3 3
      plugins/codemirror/codemirror.js
  10. 4 4
      plugins/codemirror/keymap/vim.js
  11. 1 1
      plugins/codemirror/mode/asn.1/asn.1.js
  12. 5 5
      plugins/codemirror/mode/clike/clike.js
  13. 4 4
      plugins/codemirror/mode/css/css.js
  14. 2 2
      plugins/codemirror/mode/cypher/cypher.js
  15. 2 2
      plugins/codemirror/mode/dtd/dtd.js
  16. 7 7
      plugins/codemirror/mode/ebnf/ebnf.js
  17. 1 1
      plugins/codemirror/mode/factor/factor.js
  18. 2 2
      plugins/codemirror/mode/gas/gas.js
  19. 1 1
      plugins/codemirror/mode/haml/haml.js
  20. 1 1
      plugins/codemirror/mode/idl/idl.js
  21. 1 1
      plugins/codemirror/mode/javascript/javascript.js
  22. 11 11
      plugins/codemirror/mode/julia/julia.js
  23. 3 3
      plugins/codemirror/mode/markdown/markdown.js
  24. 1 1
      plugins/codemirror/mode/meta.js
  25. 3 3
      plugins/codemirror/mode/modelica/modelica.js
  26. 4 4
      plugins/codemirror/mode/mscgen/mscgen.js
  27. 1 1
      plugins/codemirror/mode/mumps/mumps.js
  28. 2 2
      plugins/codemirror/mode/oz/oz.js
  29. 3 3
      plugins/codemirror/mode/pegjs/pegjs.js
  30. 2 2
      plugins/codemirror/mode/perl/perl.js
  31. 2 2
      plugins/codemirror/mode/php/php.js
  32. 1 1
      plugins/codemirror/mode/pug/pug.js
  33. 1 1
      plugins/codemirror/mode/puppet/puppet.js
  34. 4 4
      plugins/codemirror/mode/rpm/rpm.js
  35. 1 1
      plugins/codemirror/mode/sass/sass.js
  36. 1 1
      plugins/codemirror/mode/scheme/scheme.js
  37. 1 1
      plugins/codemirror/mode/sieve/sieve.js
  38. 5 5
      plugins/codemirror/mode/soy/soy.js
  39. 5 5
      plugins/codemirror/mode/sql/sql.js
  40. 1 1
      plugins/codemirror/mode/stylus/stylus.js
  41. 1 1
      plugins/codemirror/mode/tiddlywiki/tiddlywiki.js
  42. 2 2
      plugins/codemirror/mode/vbscript/vbscript.js
  43. 1 1
      plugins/codemirror/mode/velocity/velocity.js
  44. 2 2
      plugins/codemirror/mode/verilog/verilog.js
  45. 1 1
      plugins/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js
  46. 4 4
      plugins/codemirror/mode/yaml/yaml.js
  47. 340 0
      plugins/datatables-searchbuilder/css/searchBuilder.bootstrap4.css
  48. 1 0
      plugins/datatables-searchbuilder/css/searchBuilder.bootstrap4.min.css
  49. 4376 0
      plugins/datatables-searchbuilder/js/dataTables.searchBuilder.js
  50. 131 0
      plugins/datatables-searchbuilder/js/dataTables.searchBuilder.min.js
  51. 51 0
      plugins/datatables-searchbuilder/js/searchBuilder.bootstrap4.js
  52. 2 0
      plugins/datatables-searchbuilder/js/searchBuilder.bootstrap4.min.js
  53. 3 3
      plugins/sweetalert2/sweetalert2.all.js
  54. 1 1
      plugins/sweetalert2/sweetalert2.all.min.js
  55. 3 3
      plugins/sweetalert2/sweetalert2.js
  56. 1 1
      plugins/sweetalert2/sweetalert2.min.js
  57. 62 88
      plugins/uplot/uPlot.cjs.js
  58. 62 88
      plugins/uplot/uPlot.esm.js
  59. 66 92
      plugins/uplot/uPlot.iife.js
  60. 2 2
      plugins/uplot/uPlot.iife.min.js

+ 1 - 1
plugins/codemirror/addon/edit/closebrackets.js

@@ -102,7 +102,7 @@
     for (var i = 0; i < ranges.length; i++) {
     for (var i = 0; i < ranges.length; i++) {
       var range = ranges[i]
       var range = ranges[i]
       if (range.head == cm.getCursor()) primary = i
       if (range.head == cm.getCursor()) primary = i
-      var pos = {line: range.head.line, ch: range.head.ch + dir}
+      var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1}
       newRanges.push({anchor: pos, head: pos})
       newRanges.push({anchor: pos, head: pos})
     }
     }
     cm.setSelections(newRanges, primary)
     cm.setSelections(newRanges, primary)

+ 1 - 1
plugins/codemirror/addon/edit/continuelist.js

@@ -90,7 +90,7 @@
           });
           });
         } else {
         } else {
           if (startIndent.length > nextIndent.length) return;
           if (startIndent.length > nextIndent.length) return;
-          // This doesn't run if the next line immediatley indents, as it is
+          // This doesn't run if the next line immediately indents, as it is
           // not clear of the users intention (new indented item or same level)
           // not clear of the users intention (new indented item or same level)
           if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;
           if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;
           skipCount += 1;
           skipCount += 1;

+ 7 - 5
plugins/codemirror/addon/edit/matchbrackets.js

@@ -38,7 +38,7 @@
     if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
     if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
     var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
     var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
 
 
-    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);
+    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config);
     if (found == null) return null;
     if (found == null) return null;
     return {from: Pos(where.line, pos), to: found && found.pos,
     return {from: Pos(where.line, pos), to: found && found.pos,
             match: found && found.ch == match.charAt(0), forward: dir > 0};
             match: found && found.ch == match.charAt(0), forward: dir > 0};
@@ -67,7 +67,8 @@
       if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
       if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
       for (; pos != end; pos += dir) {
       for (; pos != end; pos += dir) {
         var ch = line.charAt(pos);
         var ch = line.charAt(pos);
-        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
+        if (re.test(ch) && (style === undefined ||
+                            (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) {
           var match = matching[ch];
           var match = matching[ch];
           if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
           if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
           else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
           else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
@@ -80,11 +81,12 @@
 
 
   function matchBrackets(cm, autoclear, config) {
   function matchBrackets(cm, autoclear, config) {
     // Disable brace matching in long lines, since it'll cause hugely slow updates
     // Disable brace matching in long lines, since it'll cause hugely slow updates
-    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
+    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000,
+      highlightNonMatching = config && config.highlightNonMatching;
     var marks = [], ranges = cm.listSelections();
     var marks = [], ranges = cm.listSelections();
     for (var i = 0; i < ranges.length; i++) {
     for (var i = 0; i < ranges.length; i++) {
       var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
       var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
-      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {
+      if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) {
         var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
         var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
         marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
         marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
         if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
         if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
@@ -94,7 +96,7 @@
 
 
     if (marks.length) {
     if (marks.length) {
       // Kludge to work around the IE bug from issue #1193, where text
       // Kludge to work around the IE bug from issue #1193, where text
-      // input stops going to the textare whever this fires.
+      // input stops going to the textarea whenever this fires.
       if (ie_lt8 && cm.state.focused) cm.focus();
       if (ie_lt8 && cm.state.focused) cm.focus();
 
 
       var clear = function() {
       var clear = function() {

+ 8 - 5
plugins/codemirror/addon/fold/brace-fold.js

@@ -31,13 +31,16 @@ CodeMirror.registerHelper("fold", "brace", function(cm, start) {
     }
     }
   }
   }
 
 
-  var startToken = "{", endToken = "}", startCh = findOpening("{");
-  if (startCh == null) {
-    startToken = "[", endToken = "]";
-    startCh = findOpening("[");
+  var startBrace = findOpening("{"), startBracket = findOpening("[")
+  var startToken, endToken, startCh
+  if (startBrace != null && (startBracket == null || startBracket > startBrace)) {
+    startCh = startBrace; startToken = "{"; endToken = "}"
+  } else if (startBracket != null) {
+    startCh = startBracket; startToken = "["; endToken = "]"
+  } else {
+    return
   }
   }
 
 
-  if (startCh == null) return;
   var count = 1, lastLine = cm.lastLine(), end, endCh;
   var count = 1, lastLine = cm.lastLine(), end, endCh;
   outer: for (var i = line; i <= lastLine; ++i) {
   outer: for (var i = line; i <= lastLine; ++i) {
     var text = cm.getLine(i), pos = i == line ? startCh : 0;
     var text = cm.getLine(i), pos = i == line ? startCh : 0;

+ 1 - 1
plugins/codemirror/addon/hint/javascript-hint.js

@@ -69,7 +69,7 @@
   function getCoffeeScriptToken(editor, cur) {
   function getCoffeeScriptToken(editor, cur) {
   // This getToken, it is for coffeescript, imitates the behavior of
   // This getToken, it is for coffeescript, imitates the behavior of
   // getTokenAt method in javascript.js, that is, returning "property"
   // getTokenAt method in javascript.js, that is, returning "property"
-  // type and treat "." as indepenent token.
+  // type and treat "." as independent token.
     var token = editor.getTokenAt(cur);
     var token = editor.getTokenAt(cur);
     if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
     if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
       token.end = token.start;
       token.end = token.start;

+ 9 - 7
plugins/codemirror/addon/hint/show-hint.js

@@ -61,8 +61,10 @@
     this.startPos = this.cm.getCursor("start");
     this.startPos = this.cm.getCursor("start");
     this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
     this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
 
 
-    var self = this;
-    cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
+    if (this.options.updateOnCursorActivity) {
+      var self = this;
+      cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
+    }
   }
   }
 
 
   var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
   var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
@@ -75,7 +77,9 @@
       if (!this.active()) return;
       if (!this.active()) return;
       this.cm.state.completionActive = null;
       this.cm.state.completionActive = null;
       this.tick = null;
       this.tick = null;
-      this.cm.off("cursorActivity", this.activityFunc);
+      if (this.options.updateOnCursorActivity) {
+        this.cm.off("cursorActivity", this.activityFunc);
+      }
 
 
       if (this.widget && this.data) CodeMirror.signal(this.data, "close");
       if (this.widget && this.data) CodeMirror.signal(this.data, "close");
       if (this.widget) this.widget.close();
       if (this.widget) this.widget.close();
@@ -117,9 +121,7 @@
       if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
       if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
           pos.ch < identStart.ch || this.cm.somethingSelected() ||
           pos.ch < identStart.ch || this.cm.somethingSelected() ||
           (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
           (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
-        if (this.options.closeOnCursorActivity) {
-          this.close();
-        }
+        this.close();
       } else {
       } else {
         var self = this;
         var self = this;
         this.debounce = requestAnimationFrame(function() {self.update();});
         this.debounce = requestAnimationFrame(function() {self.update();});
@@ -492,9 +494,9 @@
     completeSingle: true,
     completeSingle: true,
     alignWithWord: true,
     alignWithWord: true,
     closeCharacters: /[\s()\[\]{};:>,]/,
     closeCharacters: /[\s()\[\]{};:>,]/,
-    closeOnCursorActivity: true,
     closeOnPick: true,
     closeOnPick: true,
     closeOnUnfocus: true,
     closeOnUnfocus: true,
+    updateOnCursorActivity: true,
     completeOnSingleClick: true,
     completeOnSingleClick: true,
     container: null,
     container: null,
     customKeys: null,
     customKeys: null,

+ 2 - 2
plugins/codemirror/addon/hint/sql-hint.js

@@ -97,7 +97,7 @@
     if (name.charAt(0) == ".") {
     if (name.charAt(0) == ".") {
       name = name.substr(1);
       name = name.substr(1);
     }
     }
-    // replace doublicated identifierQuotes with single identifierQuotes
+    // replace duplicated identifierQuotes with single identifierQuotes
     // and remove single identifierQuotes
     // and remove single identifierQuotes
     var nameParts = name.split(identifierQuote+identifierQuote);
     var nameParts = name.split(identifierQuote+identifierQuote);
     for (var i = 0; i < nameParts.length; i++)
     for (var i = 0; i < nameParts.length; i++)
@@ -109,7 +109,7 @@
     var nameParts = getText(name).split(".");
     var nameParts = getText(name).split(".");
     for (var i = 0; i < nameParts.length; i++)
     for (var i = 0; i < nameParts.length; i++)
       nameParts[i] = identifierQuote +
       nameParts[i] = identifierQuote +
-        // doublicate identifierQuotes
+        // duplicate identifierQuotes
         nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) +
         nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) +
         identifierQuote;
         identifierQuote;
     var escaped = nameParts.join(".");
     var escaped = nameParts.join(".");

+ 1 - 1
plugins/codemirror/addon/search/match-highlighter.js

@@ -16,7 +16,7 @@
 // highlighted only if the selected text is a word. showToken, when enabled,
 // highlighted only if the selected text is a word. showToken, when enabled,
 // will cause the current token to be highlighted when nothing is selected.
 // will cause the current token to be highlighted when nothing is selected.
 // delay is used to specify how much time to wait, in milliseconds, before
 // delay is used to specify how much time to wait, in milliseconds, before
-// highlighting the matches. If annotateScrollbar is enabled, the occurences
+// highlighting the matches. If annotateScrollbar is enabled, the occurrences
 // will be highlighted on the scrollbar via the matchesonscrollbar addon.
 // will be highlighted on the scrollbar via the matchesonscrollbar addon.
 
 
 (function(mod) {
 (function(mod) {

+ 3 - 3
plugins/codemirror/codemirror.js

@@ -5115,7 +5115,7 @@
       (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
       (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
     setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
     setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
 
 
-    if (!(options && options.scroll === false) && doc.cm)
+    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor")
       { ensureCursorVisible(doc.cm); }
       { ensureCursorVisible(doc.cm); }
   }
   }
 
 
@@ -8675,7 +8675,7 @@
     function moveOnce(boundToLine) {
     function moveOnce(boundToLine) {
       var next;
       var next;
       if (unit == "codepoint") {
       if (unit == "codepoint") {
-        var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1));
+        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));
         if (isNaN(ch)) {
         if (isNaN(ch)) {
           next = null;
           next = null;
         } else {
         } else {
@@ -9793,7 +9793,7 @@
 
 
   addLegacyProps(CodeMirror);
   addLegacyProps(CodeMirror);
 
 
-  CodeMirror.version = "5.59.1";
+  CodeMirror.version = "5.59.2";
 
 
   return CodeMirror;
   return CodeMirror;
 
 

+ 4 - 4
plugins/codemirror/keymap/vim.js

@@ -737,7 +737,7 @@
         // TODO: Convert keymap into dictionary format for fast lookup.
         // TODO: Convert keymap into dictionary format for fast lookup.
       },
       },
       // Testing hook, though it might be useful to expose the register
       // Testing hook, though it might be useful to expose the register
-      // controller anyways.
+      // controller anyway.
       getRegisterController: function() {
       getRegisterController: function() {
         return vimGlobalState.registerController;
         return vimGlobalState.registerController;
       },
       },
@@ -3483,7 +3483,7 @@
         },
         },
         isComplete: function(state) {
         isComplete: function(state) {
           if (state.nextCh === '#') {
           if (state.nextCh === '#') {
-            var token = state.lineText.match(/#(\w+)/)[1];
+            var token = state.lineText.match(/^#(\w+)/)[1];
             if (token === 'endif') {
             if (token === 'endif') {
               if (state.forward && state.depth === 0) {
               if (state.forward && state.depth === 0) {
                 return true;
                 return true;
@@ -4322,7 +4322,7 @@
         raw += ' <span style="color: #888">' + desc + '</span>';
         raw += ' <span style="color: #888">' + desc + '</span>';
       return raw;
       return raw;
     }
     }
-    var searchPromptDesc = '(Javascript regexp)';
+    var searchPromptDesc = '(JavaScript regexp)';
     function showPrompt(cm, options) {
     function showPrompt(cm, options) {
       var shortText = (options.prefix || '') + ' ' + (options.desc || '');
       var shortText = (options.prefix || '') + ' ' + (options.desc || '');
       var prompt = makePrompt(options.prefix, options.desc);
       var prompt = makePrompt(options.prefix, options.desc);
@@ -5234,7 +5234,7 @@
     * @param {Cursor} lineEnd Line to stop replacing at.
     * @param {Cursor} lineEnd Line to stop replacing at.
     * @param {RegExp} query Query for performing matches with.
     * @param {RegExp} query Query for performing matches with.
     * @param {string} replaceWith Text to replace matches with. May contain $1,
     * @param {string} replaceWith Text to replace matches with. May contain $1,
-    *     $2, etc for replacing captured groups using Javascript replace.
+    *     $2, etc for replacing captured groups using JavaScript replace.
     * @param {function()} callback A callback for when the replace is done.
     * @param {function()} callback A callback for when the replace is done.
     */
     */
     function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,
     function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,

+ 1 - 1
plugins/codemirror/mode/asn.1/asn.1.js

@@ -190,7 +190,7 @@
     " NetworkAddress BITS BMPString TimeStamp TimeTicks" +
     " NetworkAddress BITS BMPString TimeStamp TimeTicks" +
     " TruthValue RowStatus DisplayString GeneralString" +
     " TruthValue RowStatus DisplayString GeneralString" +
     " GraphicString IA5String NumericString" +
     " GraphicString IA5String NumericString" +
-    " PrintableString SnmpAdminAtring TeletexString" +
+    " PrintableString SnmpAdminString TeletexString" +
     " UTF8String VideotexString VisibleString StringStore" +
     " UTF8String VideotexString VisibleString StringStore" +
     " ISO646String T61String UniversalString Unsigned32" +
     " ISO646String T61String UniversalString Unsigned32" +
     " Integer32 Gauge Gauge32 Counter Counter32 Counter64"),
     " Integer32 Gauge Gauge32 Counter Counter32 Counter64"),

+ 5 - 5
plugins/codemirror/mode/clike/clike.js

@@ -350,8 +350,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
   function cpp11StringHook(stream, state) {
   function cpp11StringHook(stream, state) {
     stream.backUp(1);
     stream.backUp(1);
     // Raw strings.
     // Raw strings.
-    if (stream.match(/(R|u8R|uR|UR|LR)/)) {
-      var match = stream.match(/"([^\s\\()]{0,16})\(/);
+    if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {
+      var match = stream.match(/^"([^\s\\()]{0,16})\(/);
       if (!match) {
       if (!match) {
         return false;
         return false;
       }
       }
@@ -360,8 +360,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
       return tokenRawString(stream, state);
       return tokenRawString(stream, state);
     }
     }
     // Unicode strings/chars.
     // Unicode strings/chars.
-    if (stream.match(/(u8|u|U|L)/)) {
-      if (stream.match(/["']/, /* eat */ false)) {
+    if (stream.match(/^(?:u8|u|U|L)/)) {
+      if (stream.match(/^["']/, /* eat */ false)) {
         return "string";
         return "string";
       }
       }
       return false;
       return false;
@@ -749,7 +749,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
                 "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
                 "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
                 "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
                 "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
                 "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
                 "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
-                "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
+                "gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
                 "gl_ProjectionMatrixInverseTranspose " +
                 "gl_ProjectionMatrixInverseTranspose " +
                 "gl_ModelViewProjectionMatrixInverseTranspose " +
                 "gl_ModelViewProjectionMatrixInverseTranspose " +
                 "gl_TextureMatrixInverseTranspose " +
                 "gl_TextureMatrixInverseTranspose " +

+ 4 - 4
plugins/codemirror/mode/css/css.js

@@ -78,8 +78,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
       return ret("qualifier", "qualifier");
       return ret("qualifier", "qualifier");
     } else if (/[:;{}\[\]\(\)]/.test(ch)) {
     } else if (/[:;{}\[\]\(\)]/.test(ch)) {
       return ret(null, ch);
       return ret(null, ch);
-    } else if (stream.match(/[\w-.]+(?=\()/)) {
-      if (/^(url(-prefix)?|domain|regexp)$/.test(stream.current().toLowerCase())) {
+    } else if (stream.match(/^[\w-.]+(?=\()/)) {
+      if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) {
         state.tokenize = tokenParenthesized;
         state.tokenize = tokenParenthesized;
       }
       }
       return ret("variable callee", "variable");
       return ret("variable callee", "variable");
@@ -108,7 +108,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
 
 
   function tokenParenthesized(stream, state) {
   function tokenParenthesized(stream, state) {
     stream.next(); // Must be '('
     stream.next(); // Must be '('
-    if (!stream.match(/\s*[\"\')]/, false))
+    if (!stream.match(/^\s*[\"\')]/, false))
       state.tokenize = tokenString(")");
       state.tokenize = tokenString(")");
     else
     else
       state.tokenize = null;
       state.tokenize = null;
@@ -781,7 +781,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
         }
         }
       },
       },
       ":": function(stream) {
       ":": function(stream) {
-        if (stream.match(/\s*\{/, false))
+        if (stream.match(/^\s*\{/, false))
           return [null, null]
           return [null, null]
         return false;
         return false;
       },
       },

+ 2 - 2
plugins/codemirror/mode/cypher/cypher.js

@@ -21,11 +21,11 @@
     var tokenBase = function(stream/*, state*/) {
     var tokenBase = function(stream/*, state*/) {
       var ch = stream.next();
       var ch = stream.next();
       if (ch ==='"') {
       if (ch ==='"') {
-        stream.match(/.*?"/);
+        stream.match(/^[^"]*"/);
         return "string";
         return "string";
       }
       }
       if (ch === "'") {
       if (ch === "'") {
-        stream.match(/.*?'/);
+        stream.match(/^[^']*'/);
         return "string";
         return "string";
       }
       }
       if (/[{}\(\),\.;\[\]]/.test(ch)) {
       if (/[{}\(\),\.;\[\]]/.test(ch)) {

+ 2 - 2
plugins/codemirror/mode/dtd/dtd.js

@@ -34,7 +34,7 @@ CodeMirror.defineMode("dtd", function(config) {
       state.tokenize = inBlock("meta", "?>");
       state.tokenize = inBlock("meta", "?>");
       return ret("meta", ch);
       return ret("meta", ch);
     } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag");
     } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag");
-    else if (ch == "|") return ret("keyword", "seperator");
+    else if (ch == "|") return ret("keyword", "separator");
     else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else
     else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else
     else if (ch.match(/[\[\]]/)) return ret("rule", ch);
     else if (ch.match(/[\[\]]/)) return ret("rule", ch);
     else if (ch == "\"" || ch == "'") {
     else if (ch == "\"" || ch == "'") {
@@ -112,7 +112,7 @@ CodeMirror.defineMode("dtd", function(config) {
     indent: function(state, textAfter) {
     indent: function(state, textAfter) {
       var n = state.stack.length;
       var n = state.stack.length;
 
 
-      if( textAfter.match(/\]\s+|\]/) )n=n-1;
+      if( textAfter.charAt(0) === ']' )n--;
       else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){
       else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){
         if(textAfter.substr(0,1) === "<") {}
         if(textAfter.substr(0,1) === "<") {}
         else if( type == "doindent" && textAfter.length > 1 ) {}
         else if( type == "doindent" && textAfter.length > 1 ) {}

+ 7 - 7
plugins/codemirror/mode/ebnf/ebnf.js

@@ -41,10 +41,10 @@
             state.stringType = stream.peek();
             state.stringType = stream.peek();
             stream.next(); // Skip quote
             stream.next(); // Skip quote
             state.stack.unshift(stateType._string);
             state.stack.unshift(stateType._string);
-          } else if (stream.match(/^\/\*/)) { //comments starting with /*
+          } else if (stream.match('/*')) { //comments starting with /*
             state.stack.unshift(stateType.comment);
             state.stack.unshift(stateType.comment);
             state.commentType = commentType.slash;
             state.commentType = commentType.slash;
-          } else if (stream.match(/^\(\*/)) { //comments starting with (*
+          } else if (stream.match('(*')) { //comments starting with (*
             state.stack.unshift(stateType.comment);
             state.stack.unshift(stateType.comment);
             state.commentType = commentType.parenthesis;
             state.commentType = commentType.parenthesis;
           }
           }
@@ -69,10 +69,10 @@
 
 
         case stateType.comment:
         case stateType.comment:
           while (state.stack[0] === stateType.comment && !stream.eol()) {
           while (state.stack[0] === stateType.comment && !stream.eol()) {
-            if (state.commentType === commentType.slash && stream.match(/\*\//)) {
+            if (state.commentType === commentType.slash && stream.match('*/')) {
               state.stack.shift(); // Clear flag
               state.stack.shift(); // Clear flag
               state.commentType = null;
               state.commentType = null;
-            } else if (state.commentType === commentType.parenthesis && stream.match(/\*\)/)) {
+            } else if (state.commentType === commentType.parenthesis && stream.match('*)')) {
               state.stack.shift(); // Clear flag
               state.stack.shift(); // Clear flag
               state.commentType = null;
               state.commentType = null;
             } else {
             } else {
@@ -83,7 +83,7 @@
 
 
         case stateType.characterClass:
         case stateType.characterClass:
           while (state.stack[0] === stateType.characterClass && !stream.eol()) {
           while (state.stack[0] === stateType.characterClass && !stream.eol()) {
-            if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) {
+            if (!(stream.match(/^[^\]\\]+/) || stream.match('.'))) {
               state.stack.shift();
               state.stack.shift();
             }
             }
           }
           }
@@ -168,10 +168,10 @@
           }
           }
         }
         }
 
 
-        if (stream.match(/^\/\//)) {
+        if (stream.match('//')) {
           stream.skipToEnd();
           stream.skipToEnd();
           return "comment";
           return "comment";
-        } else if (stream.match(/return/)) {
+        } else if (stream.match('return')) {
           return "operator";
           return "operator";
         } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) {
         } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) {
           if (stream.match(/(?=[\(.])/)) {
           if (stream.match(/(?=[\(.])/)) {

+ 1 - 1
plugins/codemirror/mode/factor/factor.js

@@ -16,7 +16,7 @@
   "use strict";
   "use strict";
 
 
   CodeMirror.defineSimpleMode("factor", {
   CodeMirror.defineSimpleMode("factor", {
-    // The start state contains the rules that are intially used
+    // The start state contains the rules that are initially used
     start: [
     start: [
       // comments
       // comments
       {regex: /#?!.*/, token: "comment"},
       {regex: /#?!.*/, token: "comment"},

+ 2 - 2
plugins/codemirror/mode/gas/gas.js

@@ -302,11 +302,11 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
       }
       }
 
 
       if (ch === '{') {
       if (ch === '{') {
-        return "braket";
+        return "bracket";
       }
       }
 
 
       if (ch === '}') {
       if (ch === '}') {
-        return "braket";
+        return "bracket";
       }
       }
 
 
       if (/\d/.test(ch)) {
       if (/\d/.test(ch)) {

+ 1 - 1
plugins/codemirror/mode/haml/haml.js

@@ -72,7 +72,7 @@
         }
         }
       }
       }
 
 
-      // donot handle --> as valid ruby, make it HTML close comment instead
+      // do not handle --> as valid ruby, make it HTML close comment instead
       if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) {
       if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) {
         state.tokenize = ruby;
         state.tokenize = ruby;
         return state.tokenize(stream, state);
         return state.tokenize(stream, state);

+ 1 - 1
plugins/codemirror/mode/idl/idl.js

@@ -62,7 +62,7 @@
     'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',
     'empty', 'enable_sysrtn', 'eof', 'eos', 'erase',
     'erf', 'erfc', 'erfcx', 'erode', 'errorplot',
     'erf', 'erfc', 'erfcx', 'erode', 'errorplot',
     'errplot', 'estimator_filter', 'execute', 'exit', 'exp',
     'errplot', 'estimator_filter', 'execute', 'exit', 'exp',
-    'expand', 'expand_path', 'expint', 'extrac', 'extract_slice',
+    'expand', 'expand_path', 'expint', 'extract', 'extract_slice',
     'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',
     'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename',
     'file_chmod', 'file_copy', 'file_delete', 'file_dirname',
     'file_chmod', 'file_copy', 'file_delete', 'file_dirname',
     'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',
     'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info',

+ 1 - 1
plugins/codemirror/mode/javascript/javascript.js

@@ -624,7 +624,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "=>") return cont(typeexpr)
     if (type == "=>") return cont(typeexpr)
   }
   }
   function typeprops(type) {
   function typeprops(type) {
-    if (type == "}") return cont()
+    if (type.match(/[\}\)\]]/)) return cont()
     if (type == "," || type == ";") return cont(typeprops)
     if (type == "," || type == ";") return cont(typeprops)
     return pass(typeprop, typeprops)
     return pass(typeprop, typeprops)
   }
   }

+ 11 - 11
plugins/codemirror/mode/julia/julia.js

@@ -80,7 +80,7 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
   // tokenizers
   // tokenizers
   function tokenBase(stream, state) {
   function tokenBase(stream, state) {
     // Handle multiline comments
     // Handle multiline comments
-    if (stream.match(/^#=/, false)) {
+    if (stream.match('#=', false)) {
       state.tokenize = tokenComment;
       state.tokenize = tokenComment;
       return state.tokenize(stream, state);
       return state.tokenize(stream, state);
     }
     }
@@ -141,10 +141,10 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
     }
     }
 
 
     if (inArray(state)) {
     if (inArray(state)) {
-      if (state.lastToken == "end" && stream.match(/^:/)) {
+      if (state.lastToken == "end" && stream.match(':')) {
         return "operator";
         return "operator";
       }
       }
-      if (stream.match(/^end/)) {
+      if (stream.match('end')) {
         return "number";
         return "number";
       }
       }
     }
     }
@@ -201,7 +201,7 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
     }
     }
 
 
     // Handle Chars
     // Handle Chars
-    if (stream.match(/^'/)) {
+    if (stream.match('\'')) {
       state.tokenize = tokenChar;
       state.tokenize = tokenChar;
       return state.tokenize(stream, state);
       return state.tokenize(stream, state);
     }
     }
@@ -263,7 +263,7 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
         state.scopes.push('(');
         state.scopes.push('(');
         charsAdvanced += match[1].length;
         charsAdvanced += match[1].length;
       }
       }
-      if (currentScope(state) == '(' && stream.match(/^\)/)) {
+      if (currentScope(state) == '(' && stream.match(')')) {
         state.scopes.pop();
         state.scopes.pop();
         charsAdvanced += 1;
         charsAdvanced += 1;
         if (state.scopes.length <= state.firstParenPos) {
         if (state.scopes.length <= state.firstParenPos) {
@@ -295,10 +295,10 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
   }
   }
 
 
   function tokenAnnotation(stream, state) {
   function tokenAnnotation(stream, state) {
-    stream.match(/.*?(?=,|;|{|}|\(|\)|=|$|\s)/);
-    if (stream.match(/^{/)) {
+    stream.match(/.*?(?=[,;{}()=\s]|$)/);
+    if (stream.match('{')) {
       state.nestedParameters++;
       state.nestedParameters++;
-    } else if (stream.match(/^}/) && state.nestedParameters > 0) {
+    } else if (stream.match('}') && state.nestedParameters > 0) {
       state.nestedParameters--;
       state.nestedParameters--;
     }
     }
     if (state.nestedParameters > 0) {
     if (state.nestedParameters > 0) {
@@ -310,13 +310,13 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
   }
   }
 
 
   function tokenComment(stream, state) {
   function tokenComment(stream, state) {
-    if (stream.match(/^#=/)) {
+    if (stream.match('#=')) {
       state.nestedComments++;
       state.nestedComments++;
     }
     }
     if (!stream.match(/.*?(?=(#=|=#))/)) {
     if (!stream.match(/.*?(?=(#=|=#))/)) {
       stream.skipToEnd();
       stream.skipToEnd();
     }
     }
-    if (stream.match(/^=#/)) {
+    if (stream.match('=#')) {
       state.nestedComments--;
       state.nestedComments--;
       if (state.nestedComments == 0)
       if (state.nestedComments == 0)
         state.tokenize = tokenBase;
         state.tokenize = tokenBase;
@@ -347,7 +347,7 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
       return "string";
       return "string";
     }
     }
     if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }
     if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }
-    if (stream.match(/^'/)) { state.tokenize = tokenBase; }
+    if (stream.match('\'')) { state.tokenize = tokenBase; }
     return "error";
     return "error";
   }
   }
 
 

+ 3 - 3
plugins/codemirror/mode/markdown/markdown.js

@@ -223,7 +223,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
 
 
       // Add this list item's content's indentation to the stack
       // Add this list item's content's indentation to the stack
       state.listStack.push(state.indentation);
       state.listStack.push(state.indentation);
-      // Reset inline styles which shouldn't propagate aross list items
+      // Reset inline styles which shouldn't propagate across list items
       state.em = false;
       state.em = false;
       state.strong = false;
       state.strong = false;
       state.code = false;
       state.code = false;
@@ -612,7 +612,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
           return getType(state);
           return getType(state);
         }
         }
       } else if (ch === ' ') {
       } else if (ch === ' ') {
-        if (stream.match(/^~~/, true)) { // Probably surrounded by space
+        if (stream.match('~~', true)) { // Probably surrounded by space
           if (stream.peek() === ' ') { // Surrounded by spaces, ignore
           if (stream.peek() === ' ') { // Surrounded by spaces, ignore
             return getType(state);
             return getType(state);
           } else { // Not surrounded by spaces, back up pointer
           } else { // Not surrounded by spaces, back up pointer
@@ -711,7 +711,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
   }
   }
 
 
   function footnoteLinkInside(stream, state) {
   function footnoteLinkInside(stream, state) {
-    if (stream.match(/^\]:/, true)) {
+    if (stream.match(']:', true)) {
       state.f = state.inline = footnoteUrl;
       state.f = state.inline = footnoteUrl;
       if (modeCfg.highlightFormatting) state.formatting = "link";
       if (modeCfg.highlightFormatting) state.formatting = "link";
       var returnType = getType(state);
       var returnType = getType(state);

+ 1 - 1
plugins/codemirror/mode/meta.js

@@ -44,7 +44,7 @@
     {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
     {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
     {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
     {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
     {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
     {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
-    {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
+    {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
     {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
     {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
     {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
     {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
     {name: "Esper", mime: "text/x-esper", mode: "sql"},
     {name: "Esper", mime: "text/x-esper", mode: "sql"},

+ 3 - 3
plugins/codemirror/mode/modelica/modelica.js

@@ -90,7 +90,7 @@
         return "error";
         return "error";
     }
     }
 
 
-    function tokenUnsignedNuber(stream, state) {
+    function tokenUnsignedNumber(stream, state) {
       stream.eatWhile(isDigit);
       stream.eatWhile(isDigit);
       if (stream.eat('.')) {
       if (stream.eat('.')) {
         stream.eatWhile(isDigit);
         stream.eatWhile(isDigit);
@@ -164,9 +164,9 @@
         else if(ch == '"') {
         else if(ch == '"') {
           state.tokenize = tokenString;
           state.tokenize = tokenString;
         }
         }
-        // UNSIGNED_NUBER
+        // UNSIGNED_NUMBER
         else if(isDigit.test(ch)) {
         else if(isDigit.test(ch)) {
-          state.tokenize = tokenUnsignedNuber;
+          state.tokenize = tokenUnsignedNumber;
         }
         }
         // ERROR
         // ERROR
         else {
         else {

+ 4 - 4
plugins/codemirror/mode/mscgen/mscgen.js

@@ -72,11 +72,11 @@
   CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"});
   CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"});
 
 
   function wordRegexpBoundary(pWords) {
   function wordRegexpBoundary(pWords) {
-    return new RegExp("\\b(" + pWords.join("|") + ")\\b", "i");
+    return new RegExp("^\\b(?:" + pWords.join("|") + ")\\b", "i");
   }
   }
 
 
   function wordRegexp(pWords) {
   function wordRegexp(pWords) {
-    return new RegExp("(" + pWords.join("|") + ")", "i");
+    return new RegExp("^(?:" + pWords.join("|") + ")", "i");
   }
   }
 
 
   function startStateFn() {
   function startStateFn() {
@@ -153,7 +153,7 @@
         return "variable";
         return "variable";
 
 
       /* attribute lists */
       /* attribute lists */
-      if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match(/\[/, true, true)) {
+      if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) {
         pConfig.inAttributeList = true;
         pConfig.inAttributeList = true;
         return "bracket";
         return "bracket";
       }
       }
@@ -161,7 +161,7 @@
         if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {
         if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {
           return "attribute";
           return "attribute";
         }
         }
-        if (pStream.match(/]/, true, true)) {
+        if (pStream.match(']', true, true)) {
           pConfig.inAttributeList = false;
           pConfig.inAttributeList = false;
           return "bracket";
           return "bracket";
         }
         }

File diff suppressed because it is too large
+ 1 - 1
plugins/codemirror/mode/mumps/mumps.js


+ 2 - 2
plugins/codemirror/mode/oz/oz.js

@@ -45,7 +45,7 @@ CodeMirror.defineMode("oz", function (conf) {
     }
     }
 
 
     // Special [] keyword
     // Special [] keyword
-    if (stream.match(/(\[])/)) {
+    if (stream.match('[]')) {
         return "keyword"
         return "keyword"
     }
     }
 
 
@@ -130,7 +130,7 @@ CodeMirror.defineMode("oz", function (conf) {
       return "operator";
       return "operator";
     }
     }
 
 
-    // If nothing match, we skip the entire alphanumerical block
+    // If nothing match, we skip the entire alphanumeric block
     stream.eatWhile(/\w/);
     stream.eatWhile(/\w/);
 
 
     return "variable";
     return "variable";

+ 3 - 3
plugins/codemirror/mode/pegjs/pegjs.js

@@ -39,7 +39,7 @@ CodeMirror.defineMode("pegjs", function (config) {
         stream.next(); // Skip quote
         stream.next(); // Skip quote
         state.inString = true; // Update state
         state.inString = true; // Update state
       }
       }
-      if (!state.inString && !state.inComment && stream.match(/^\/\*/)) {
+      if (!state.inString && !state.inComment && stream.match('/*')) {
         state.inComment = true;
         state.inComment = true;
       }
       }
 
 
@@ -59,7 +59,7 @@ CodeMirror.defineMode("pegjs", function (config) {
         return state.lhs ? "property string" : "string"; // Token style
         return state.lhs ? "property string" : "string"; // Token style
       } else if (state.inComment) {
       } else if (state.inComment) {
         while (state.inComment && !stream.eol()) {
         while (state.inComment && !stream.eol()) {
-          if (stream.match(/\*\//)) {
+          if (stream.match('*/')) {
             state.inComment = false; // Clear flag
             state.inComment = false; // Clear flag
           } else {
           } else {
             stream.match(/^.[^\*]*/);
             stream.match(/^.[^\*]*/);
@@ -76,7 +76,7 @@ CodeMirror.defineMode("pegjs", function (config) {
         stream.next();
         stream.next();
         state.inCharacterClass = true;
         state.inCharacterClass = true;
         return 'bracket';
         return 'bracket';
-      } else if (stream.match(/^\/\//)) {
+      } else if (stream.match('//')) {
         stream.skipToEnd();
         stream.skipToEnd();
         return "comment";
         return "comment";
       } else if (state.braced || stream.peek() === '{') {
       } else if (state.braced || stream.peek() === '{') {

+ 2 - 2
plugins/codemirror/mode/perl/perl.js

@@ -347,7 +347,7 @@ CodeMirror.defineMode("perl",function(){
                 lc                              :1,     // - return lower-case version of a string
                 lc                              :1,     // - return lower-case version of a string
                 lcfirst                         :1,     // - return a string with just the next letter in lower case
                 lcfirst                         :1,     // - return a string with just the next letter in lower case
                 length                          :1,     // - return the number of bytes in a string
                 length                          :1,     // - return the number of bytes in a string
-                'link'                          :1,     // - create a hard link in the filesytem
+                'link'                          :1,     // - create a hard link in the filesystem
                 listen                          :1,     // - register your socket as a server
                 listen                          :1,     // - register your socket as a server
                 local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)
                 local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)
                 localtime                       :1,     // - convert UNIX time into record or string using local time
                 localtime                       :1,     // - convert UNIX time into record or string using local time
@@ -441,7 +441,7 @@ CodeMirror.defineMode("perl",function(){
                 state                           :1,     // - declare and assign a state variable (persistent lexical scoping)
                 state                           :1,     // - declare and assign a state variable (persistent lexical scoping)
                 study                           :1,     // - optimize input data for repeated searches
                 study                           :1,     // - optimize input data for repeated searches
                 'sub'                           :1,     // - declare a subroutine, possibly anonymously
                 'sub'                           :1,     // - declare a subroutine, possibly anonymously
-                'substr'                        :1,     // - get or alter a portion of a stirng
+                'substr'                        :1,     // - get or alter a portion of a string
                 symlink                         :1,     // - create a symbolic link to a file
                 symlink                         :1,     // - create a symbolic link to a file
                 syscall                         :1,     // - execute an arbitrary system call
                 syscall                         :1,     // - execute an arbitrary system call
                 sysopen                         :1,     // - open a file, pipe, or descriptor
                 sysopen                         :1,     // - open a file, pipe, or descriptor

+ 2 - 2
plugins/codemirror/mode/php/php.js

@@ -53,7 +53,7 @@
           [["]", null]]
           [["]", null]]
         ], closing, escapes);
         ], closing, escapes);
       }
       }
-      if (stream.match(/\-\>\w/, false)) {
+      if (stream.match(/^->\w/, false)) {
         // Match object operator
         // Match object operator
         state.tokenize = matchSequence([
         state.tokenize = matchSequence([
           [["->", null]],
           [["->", null]],
@@ -106,7 +106,7 @@
       },
       },
       "<": function(stream, state) {
       "<": function(stream, state) {
         var before;
         var before;
-        if (before = stream.match(/<<\s*/)) {
+        if (before = stream.match(/^<<\s*/)) {
           var quoted = stream.eat(/['"]/);
           var quoted = stream.eat(/['"]/);
           stream.eatWhile(/[\w\.]/);
           stream.eatWhile(/[\w\.]/);
           var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));
           var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));

+ 1 - 1
plugins/codemirror/mode/pug/pug.js

@@ -261,7 +261,7 @@ CodeMirror.defineMode("pug", function (config) {
       }
       }
       return 'variable';
       return 'variable';
     }
     }
-    if (stream.match(/^\+#{/, false)) {
+    if (stream.match('+#{', false)) {
       stream.next();
       stream.next();
       state.mixinCallAfter = true;
       state.mixinCallAfter = true;
       return interpolation(stream, state);
       return interpolation(stream, state);

+ 1 - 1
plugins/codemirror/mode/puppet/puppet.js

@@ -176,7 +176,7 @@ CodeMirror.defineMode("puppet", function () {
     // Match characters that we are going to assume
     // Match characters that we are going to assume
     // are trying to be regex
     // are trying to be regex
     if (ch == '/') {
     if (ch == '/') {
-      stream.match(/.*?\//);
+      stream.match(/^[^\/]*\//);
       return 'variable-3';
       return 'variable-3';
     }
     }
     // Match all the numbers
     // Match all the numbers

+ 4 - 4
plugins/codemirror/mode/rpm/rpm.js

@@ -12,14 +12,14 @@
 "use strict";
 "use strict";
 
 
 CodeMirror.defineMode("rpm-changes", function() {
 CodeMirror.defineMode("rpm-changes", function() {
-  var headerSeperator = /^-+$/;
+  var headerSeparator = /^-+$/;
   var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /;
   var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /;
   var simpleEmail = /^[\w+.-]+@[\w.-]+/;
   var simpleEmail = /^[\w+.-]+@[\w.-]+/;
 
 
   return {
   return {
     token: function(stream) {
     token: function(stream) {
       if (stream.sol()) {
       if (stream.sol()) {
-        if (stream.match(headerSeperator)) { return 'tag'; }
+        if (stream.match(headerSeparator)) { return 'tag'; }
         if (stream.match(headerLine)) { return 'tag'; }
         if (stream.match(headerLine)) { return 'tag'; }
       }
       }
       if (stream.match(simpleEmail)) { return 'string'; }
       if (stream.match(simpleEmail)) { return 'string'; }
@@ -80,12 +80,12 @@ CodeMirror.defineMode("rpm-spec", function() {
 
 
       // Macros like '%make_install' or '%attr(0775,root,root)'
       // Macros like '%make_install' or '%attr(0775,root,root)'
       if (stream.match(/^%[\w]+/)) {
       if (stream.match(/^%[\w]+/)) {
-        if (stream.match(/^\(/)) { state.macroParameters = true; }
+        if (stream.match('(')) { state.macroParameters = true; }
         return "keyword";
         return "keyword";
       }
       }
       if (state.macroParameters) {
       if (state.macroParameters) {
         if (stream.match(/^\d+/)) { return "number";}
         if (stream.match(/^\d+/)) { return "number";}
-        if (stream.match(/^\)/)) {
+        if (stream.match(')')) {
           state.macroParameters = false;
           state.macroParameters = false;
           return "keyword";
           return "keyword";
         }
         }

+ 1 - 1
plugins/codemirror/mode/sass/sass.js

@@ -231,7 +231,7 @@ CodeMirror.defineMode("sass", function(config) {
       }
       }
 
 
       if(ch === "@"){
       if(ch === "@"){
-        if(stream.match(/@extend/)){
+        if(stream.match('@extend')){
           if(!stream.match(/\s*[\w]/))
           if(!stream.match(/\s*[\w]/))
             dedent(state);
             dedent(state);
         }
         }

+ 1 - 1
plugins/codemirror/mode/scheme/scheme.js

@@ -170,7 +170,7 @@ CodeMirror.defineMode("scheme", function () {
                             } else if (stream.match(/^[-+0-9.]/, false)) {
                             } else if (stream.match(/^[-+0-9.]/, false)) {
                                 hasRadix = false;
                                 hasRadix = false;
                                 numTest = isDecimalNumber;
                                 numTest = isDecimalNumber;
-                            // re-consume the intial # if all matches failed
+                            // re-consume the initial # if all matches failed
                             } else if (!hasExactness) {
                             } else if (!hasExactness) {
                                 stream.eat('#');
                                 stream.eat('#');
                             }
                             }

+ 1 - 1
plugins/codemirror/mode/sieve/sieve.js

@@ -43,7 +43,7 @@ CodeMirror.defineMode("sieve", function(config) {
     if (ch == "(") {
     if (ch == "(") {
       state._indent.push("(");
       state._indent.push("(");
       // add virtual angel wings so that editor behaves...
       // add virtual angel wings so that editor behaves...
-      // ...more sane incase of broken brackets
+      // ...more sane in case of broken brackets
       state._indent.push("{");
       state._indent.push("{");
       return null;
       return null;
     }
     }

+ 5 - 5
plugins/codemirror/mode/soy/soy.js

@@ -411,7 +411,7 @@
             return null;
             return null;
 
 
           case "list-literal":
           case "list-literal":
-            if (stream.match(/\]/)) {
+            if (stream.match(']')) {
               state.soyState.pop();
               state.soyState.pop();
               state.lookupVariables = true;
               state.lookupVariables = true;
               popcontext(state);
               popcontext(state);
@@ -517,14 +517,14 @@
             }
             }
             return expression(stream, state);
             return expression(stream, state);
           case "literal":
           case "literal":
-            if (stream.match(/^(?=\{\/literal})/)) {
+            if (stream.match('{/literal}', false)) {
               state.soyState.pop();
               state.soyState.pop();
               return this.token(stream, state);
               return this.token(stream, state);
             }
             }
             return tokenUntil(stream, state, /\{\/literal}/);
             return tokenUntil(stream, state, /\{\/literal}/);
         }
         }
 
 
-        if (stream.match(/^\{literal}/)) {
+        if (stream.match('{literal}')) {
           state.indent += config.indentUnit;
           state.indent += config.indentUnit;
           state.soyState.push("literal");
           state.soyState.push("literal");
           state.context = new Context(state.context, "literal", state.variables);
           state.context = new Context(state.context, "literal", state.variables);
@@ -581,12 +581,12 @@
           state.soyState.push("import");
           state.soyState.push("import");
           state.indent += 2 * config.indentUnit;
           state.indent += 2 * config.indentUnit;
           return "keyword";
           return "keyword";
-        } else if (match = stream.match(/^<\{/)) {
+        } else if (match = stream.match('<{')) {
           state.soyState.push("template-call-expression");
           state.soyState.push("template-call-expression");
           state.indent += 2 * config.indentUnit;
           state.indent += 2 * config.indentUnit;
           state.soyState.push("tag");
           state.soyState.push("tag");
           return "keyword";
           return "keyword";
-        } else if (match = stream.match(/^<\/>/)) {
+        } else if (match = stream.match('</>')) {
           state.indent -= 1 * config.indentUnit;
           state.indent -= 1 * config.indentUnit;
           return "keyword";
           return "keyword";
         }
         }

File diff suppressed because it is too large
+ 5 - 5
plugins/codemirror/mode/sql/sql.js


+ 1 - 1
plugins/codemirror/mode/stylus/stylus.js

@@ -138,7 +138,7 @@
         // Variable
         // Variable
         if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) {
         if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) {
           if (!wordIsTag(stream.current())) {
           if (!wordIsTag(stream.current())) {
-            stream.match(/\./);
+            stream.match('.');
             return ["variable-2", "variable-name"];
             return ["variable-2", "variable-name"];
           }
           }
         }
         }

+ 1 - 1
plugins/codemirror/mode/tiddlywiki/tiddlywiki.js

@@ -114,7 +114,7 @@ CodeMirror.defineMode("tiddlywiki", function () {
         return 'header';
         return 'header';
     }
     }
 
 
-    if (ch == '{' && stream.match(/\{\{/))
+    if (ch == '{' && stream.match('{{'))
       return chain(stream, state, twTokenCode);
       return chain(stream, state, twTokenCode);
 
 
     // rudimentary html:// file:// link matching. TW knows much more ...
     // rudimentary html:// file:// link matching. TW knows much more ...

+ 2 - 2
plugins/codemirror/mode/vbscript/vbscript.js

@@ -32,7 +32,7 @@ CodeMirror.defineMode("vbscript", function(conf, parserConf) {
     var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]");
     var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]");
     var doubleOperators = new RegExp("^((<>)|(<=)|(>=))");
     var doubleOperators = new RegExp("^((<>)|(<=)|(>=))");
     var singleDelimiters = new RegExp('^[\\.,]');
     var singleDelimiters = new RegExp('^[\\.,]');
-    var brakets = new RegExp('^[\\(\\)]');
+    var brackets = new RegExp('^[\\(\\)]');
     var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*");
     var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*");
 
 
     var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for'];
     var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for'];
@@ -183,7 +183,7 @@ CodeMirror.defineMode("vbscript", function(conf, parserConf) {
             return null;
             return null;
         }
         }
 
 
-        if (stream.match(brakets)) {
+        if (stream.match(brackets)) {
             return "bracket";
             return "bracket";
         }
         }
 
 

+ 1 - 1
plugins/codemirror/mode/velocity/velocity.js

@@ -48,7 +48,7 @@ CodeMirror.defineMode("velocity", function() {
             else if (state.inParams)
             else if (state.inParams)
                 return chain(stream, state, tokenString(ch));
                 return chain(stream, state, tokenString(ch));
         }
         }
-        // is it one of the special signs []{}().,;? Seperator?
+        // is it one of the special signs []{}().,;? Separator?
         else if (/[\[\]{}\(\),;\.]/.test(ch)) {
         else if (/[\[\]{}\(\),;\.]/.test(ch)) {
             if (ch == "(" && beforeParams)
             if (ch == "(" && beforeParams)
                 state.inParams = true;
                 state.inParams = true;

+ 2 - 2
plugins/codemirror/mode/verilog/verilog.js

@@ -542,7 +542,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
   };
   };
   var tlvIndentUnit = 3;
   var tlvIndentUnit = 3;
   var tlvTrackStatements = false;
   var tlvTrackStatements = false;
-  var tlvIdentMatch = /^([~!@#\$%\^&\*-\+=\?\/\\\|'"<>]+)([\d\w_]*)/;  // Matches an identifiere.
+  var tlvIdentMatch = /^([~!@#\$%\^&\*-\+=\?\/\\\|'"<>]+)([\d\w_]*)/;  // Matches an identifier.
   // Note that ':' is excluded, because of it's use in [:].
   // Note that ':' is excluded, because of it's use in [:].
   var tlvFirstLevelIndentMatch = /^[! ]  /;
   var tlvFirstLevelIndentMatch = /^[! ]  /;
   var tlvLineIndentationMatch = /^[! ] */;
   var tlvLineIndentationMatch = /^[! ] */;
@@ -719,7 +719,7 @@ CodeMirror.defineMode("verilog", function(config, parserConfig) {
             } else {
             } else {
               // Just swallow one character and try again.
               // Just swallow one character and try again.
               // This enables subsequent identifier match with preceding symbol character, which
               // This enables subsequent identifier match with preceding symbol character, which
-              //   is legal within a statement.  (Eg, !$reset).  It also enables detection of
+              //   is legal within a statement.  (E.g., !$reset).  It also enables detection of
               //   comment start with preceding symbols.
               //   comment start with preceding symbols.
               stream.backUp(stream.current().length - 1);
               stream.backUp(stream.current().length - 1);
               style = "tlv-default";
               style = "tlv-default";

+ 1 - 1
plugins/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js

@@ -36,7 +36,7 @@
       },
       },
       token: function (stream, state) {
       token: function (stream, state) {
         if (state.state == START) {
         if (state.state == START) {
-          if (stream.match(/---/, false)) {
+          if (stream.match('---', false)) {
             state.state = FRONTMATTER
             state.state = FRONTMATTER
             return yamlMode.token(stream, state.inner)
             return yamlMode.token(stream, state.inner)
           } else {
           } else {

+ 4 - 4
plugins/codemirror/mode/yaml/yaml.js

@@ -38,9 +38,9 @@ CodeMirror.defineMode("yaml", function() {
         state.pair = false;
         state.pair = false;
         state.pairStart = false;
         state.pairStart = false;
         /* document start */
         /* document start */
-        if(stream.match(/---/)) { return "def"; }
+        if(stream.match('---')) { return "def"; }
         /* document end */
         /* document end */
-        if (stream.match(/\.\.\./)) { return "def"; }
+        if (stream.match('...')) { return "def"; }
         /* array list item */
         /* array list item */
         if (stream.match(/\s*-\s+/)) { return 'meta'; }
         if (stream.match(/\s*-\s+/)) { return 'meta'; }
       }
       }
@@ -57,12 +57,12 @@ CodeMirror.defineMode("yaml", function() {
         return 'meta';
         return 'meta';
       }
       }
 
 
-      /* list seperator */
+      /* list separator */
       if (state.inlineList > 0 && !esc && ch == ',') {
       if (state.inlineList > 0 && !esc && ch == ',') {
         stream.next();
         stream.next();
         return 'meta';
         return 'meta';
       }
       }
-      /* pairs seperator */
+      /* pairs separator */
       if (state.inlinePairs > 0 && !esc && ch == ',') {
       if (state.inlinePairs > 0 && !esc && ch == ',') {
         state.keyCol = 0;
         state.keyCol = 0;
         state.pair = false;
         state.pair = false;

+ 340 - 0
plugins/datatables-searchbuilder/css/searchBuilder.bootstrap4.css

@@ -0,0 +1,340 @@
+div.dt-datetime {
+  position: absolute;
+  background-color: white;
+  z-index: 2050;
+  border: 1px solid #ccc;
+  box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5);
+  padding: 0 20px 6px 20px;
+  width: 275px;
+}
+div.dt-datetime.inline {
+  position: relative;
+  box-shadow: none;
+}
+div.dt-datetime div.dt-datetime-title {
+  text-align: center;
+  padding: 5px 0px 3px;
+}
+div.dt-datetime table {
+  border-spacing: 0;
+  margin: 12px 0;
+  width: 100%;
+}
+div.dt-datetime table.dt-datetime-table-nospace {
+  margin-top: -12px;
+}
+div.dt-datetime table th {
+  font-size: 0.8em;
+  color: #777;
+  font-weight: normal;
+  width: 14.285714286%;
+  padding: 0 0 4px 0;
+  text-align: center;
+}
+div.dt-datetime table td {
+  font-size: 0.9em;
+  color: #444;
+  padding: 0;
+}
+div.dt-datetime table td.selectable {
+  text-align: center;
+  background: #f5f5f5;
+}
+div.dt-datetime table td.selectable.disabled {
+  color: #aaa;
+  background: white;
+}
+div.dt-datetime table td.selectable.disabled button:hover {
+  color: #aaa;
+  background: white;
+}
+div.dt-datetime table td.selectable.now {
+  background-color: #ddd;
+}
+div.dt-datetime table td.selectable.now button {
+  font-weight: bold;
+}
+div.dt-datetime table td.selectable.selected button {
+  background: #4E6CA3;
+  color: white;
+  border-radius: 2px;
+}
+div.dt-datetime table td.selectable button:hover {
+  background: #ff8000;
+  color: white;
+  border-radius: 2px;
+}
+div.dt-datetime table td.dt-datetime-week {
+  font-size: 0.7em;
+}
+div.dt-datetime table button {
+  width: 100%;
+  box-sizing: border-box;
+  border: none;
+  background: transparent;
+  font-size: inherit;
+  color: inherit;
+  text-align: center;
+  padding: 4px 0;
+  cursor: pointer;
+  margin: 0;
+}
+div.dt-datetime table button span {
+  display: inline-block;
+  min-width: 14px;
+  text-align: right;
+}
+div.dt-datetime table.weekNumber th {
+  width: 12.5%;
+}
+div.dt-datetime div.dt-datetime-calendar table {
+  margin-top: 0;
+}
+div.dt-datetime div.dt-datetime-label {
+  position: relative;
+  display: inline-block;
+  height: 30px;
+  padding: 5px 6px;
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+div.dt-datetime div.dt-datetime-label:hover {
+  border: 1px solid #ddd;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+div.dt-datetime div.dt-datetime-label select {
+  position: absolute;
+  top: 6px;
+  left: 0;
+  cursor: pointer;
+  opacity: 0;
+}
+div.dt-datetime.horizontal {
+  width: 550px;
+}
+div.dt-datetime.horizontal div.dt-datetime-date,
+div.dt-datetime.horizontal div.dt-datetime-time {
+  width: 48%;
+}
+div.dt-datetime.horizontal div.dt-datetime-time {
+  margin-left: 4%;
+}
+div.dt-datetime div.dt-datetime-date {
+  position: relative;
+  float: left;
+  width: 100%;
+}
+div.dt-datetime div.dt-datetime-time {
+  position: relative;
+  float: left;
+  width: 100%;
+  text-align: center;
+}
+div.dt-datetime div.dt-datetime-time > span {
+  vertical-align: middle;
+}
+div.dt-datetime div.dt-datetime-time th {
+  text-align: left;
+}
+div.dt-datetime div.dt-datetime-time div.dt-datetime-timeblock {
+  display: inline-block;
+  vertical-align: middle;
+}
+div.dt-datetime div.dt-datetime-iconLeft,
+div.dt-datetime div.dt-datetime-iconRight,
+div.dt-datetime div.dt-datetime-iconUp,
+div.dt-datetime div.dt-datetime-iconDown {
+  width: 30px;
+  height: 30px;
+  background-position: center;
+  background-repeat: no-repeat;
+  opacity: 0.3;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+div.dt-datetime div.dt-datetime-iconLeft:hover,
+div.dt-datetime div.dt-datetime-iconRight:hover,
+div.dt-datetime div.dt-datetime-iconUp:hover,
+div.dt-datetime div.dt-datetime-iconDown:hover {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background-color: #f0f0f0;
+  opacity: 0.6;
+}
+div.dt-datetime div.dt-datetime-iconLeft button,
+div.dt-datetime div.dt-datetime-iconRight button,
+div.dt-datetime div.dt-datetime-iconUp button,
+div.dt-datetime div.dt-datetime-iconDown button {
+  border: none;
+  background: transparent;
+  text-indent: 30px;
+  height: 100%;
+  width: 100%;
+  cursor: pointer;
+}
+div.dt-datetime div.dt-datetime-iconLeft {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+}
+div.dt-datetime div.dt-datetime-iconRight {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+}
+div.dt-datetime div.dt-datetime-iconUp {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=");
+}
+div.dt-datetime div.dt-datetime-iconDown {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC");
+}
+
+div.dt-datetime-error {
+  clear: both;
+  padding: 0 1em;
+  max-width: 240px;
+  font-size: 11px;
+  line-height: 1.25em;
+  text-align: center;
+  color: #b11f1f;
+}
+
+div.dt-button-collection {
+  overflow: visible !important;
+}
+
+.dtsb-greyscale {
+  border: 1px solid #cecece !important;
+}
+
+div.dtsb-logicContainer .dtsb-greyscale {
+  border: none !important;
+}
+
+div.dtsb-searchBuilder {
+  justify-content: space-evenly;
+  cursor: default;
+  margin-bottom: 1em;
+  text-align: left;
+}
+div.dtsb-searchBuilder button.dtsb-button,
+div.dtsb-searchBuilder select {
+  font-size: 1em;
+}
+div.dtsb-searchBuilder div.dtsb-titleRow {
+  justify-content: space-evenly;
+  margin-bottom: 0.5em;
+}
+div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title {
+  display: inline-block;
+  padding-top: 6px;
+}
+div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll {
+  float: right;
+  margin-bottom: 0.333em;
+}
+div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value, div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data, div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition {
+  display: block;
+}
+div.dtsb-searchBuilder div.dtsb-group {
+  position: relative;
+  clear: both;
+  margin-bottom: 0.8em;
+}
+div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup {
+  margin: 2px;
+  text-align: center;
+  padding: 0;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer {
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+  position: absolute;
+  margin-top: 0.8em;
+  margin-right: 0.8em;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria {
+  margin-bottom: 0.8em;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input {
+  padding: 0.4em;
+  margin-right: 0.8em;
+  max-width: 20em;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic {
+  font-style: normal;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic {
+  font-style: italic;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer {
+  float: right;
+  display: inline-block;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete, div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right, div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left {
+  margin-right: 0.8em;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child, div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child, div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child {
+  margin-right: 0;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria span.dtsp-joiner {
+  margin-right: 0.8em;
+}
+
+div.dtsb-searchBuilder div.dtsb-titleRow {
+  height: 40px;
+}
+div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title {
+  padding-top: 10px;
+}
+div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup {
+  margin-right: 8px;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria .form-control {
+  width: auto;
+  display: inline-block;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition {
+  border-color: #28a745;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data {
+  border-color: #dc3545;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value, div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value {
+  border-color: #007bff;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer {
+  border-radius: 4px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+  align-content: flex-start;
+  align-items: flex-start;
+  margin-top: 10px;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic {
+  border: none;
+  border-radius: 0px;
+  flex-grow: 1;
+  flex-shrink: 0;
+  flex-basis: 40px;
+  margin: 0px;
+}
+div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup {
+  border: none;
+  border-radius: 0px;
+  width: 30px;
+  margin: 0px;
+}

File diff suppressed because it is too large
+ 1 - 0
plugins/datatables-searchbuilder/css/searchBuilder.bootstrap4.min.css


File diff suppressed because it is too large
+ 4376 - 0
plugins/datatables-searchbuilder/js/dataTables.searchBuilder.js


File diff suppressed because it is too large
+ 131 - 0
plugins/datatables-searchbuilder/js/dataTables.searchBuilder.min.js


+ 51 - 0
plugins/datatables-searchbuilder/js/searchBuilder.bootstrap4.js

@@ -0,0 +1,51 @@
+(function () {
+    'use strict';
+
+    (function (factory) {
+        if (typeof define === 'function' && define.amd) {
+            // AMD
+            define(['jquery', 'datatables.net-bs4', 'datatables.net-searchbuilder'], function ($) {
+                return factory($, window, document);
+            });
+        }
+        else if (typeof exports === 'object') {
+            // CommonJS
+            module.exports = function (root, $) {
+                if (!root) {
+                    root = window;
+                }
+                if (!$ || !$.fn.dataTable) {
+                    $ = require('datatables.net-bs4')(root, $).$;
+                }
+                if (!$.fn.dataTable.searchBuilder) {
+                    require('datatables.net-searchbuilder')(root, $);
+                }
+                return factory($, root, root.document);
+            };
+        }
+        else {
+            // Browser
+            factory(jQuery, window, document);
+        }
+    }(function ($, window, document) {
+        var DataTable = $.fn.dataTable;
+        $.extend(true, DataTable.SearchBuilder.classes, {
+            clearAll: 'btn btn-light dtsb-clearAll'
+        });
+        $.extend(true, DataTable.Group.classes, {
+            add: 'btn btn-light dtsb-add',
+            clearGroup: 'btn btn-light dtsb-clearGroup',
+            logic: 'btn btn-light dtsb-logic'
+        });
+        $.extend(true, DataTable.Criteria.classes, {
+            condition: 'form-control dtsb-condition',
+            data: 'form-control dtsb-data',
+            "delete": 'btn btn-light dtsb-delete',
+            left: 'btn btn-light dtsb-left',
+            right: 'btn btn-light dtsb-right',
+            value: 'form-control dtsb-value'
+        });
+        return DataTable.searchPanes;
+    }));
+
+}());

File diff suppressed because it is too large
+ 2 - 0
plugins/datatables-searchbuilder/js/searchBuilder.bootstrap4.min.js


+ 3 - 3
plugins/sweetalert2/sweetalert2.all.js

@@ -1,5 +1,5 @@
 /*!
 /*!
-* sweetalert2 v10.13.0
+* sweetalert2 v10.13.1
 * Released under the MIT License.
 * Released under the MIT License.
 */
 */
 (function (global, factory) {
 (function (global, factory) {
@@ -2650,7 +2650,7 @@
 
 
   var showWarningsForElements = function showWarningsForElements(template) {
   var showWarningsForElements = function showWarningsForElements(template) {
     var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
     var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
-    toArray(template.querySelectorAll('*')).forEach(function (el) {
+    toArray(template.children).forEach(function (el) {
       var tagName = el.tagName.toLowerCase();
       var tagName = el.tagName.toLowerCase();
 
 
       if (allowedElements.indexOf(tagName) === -1) {
       if (allowedElements.indexOf(tagName) === -1) {
@@ -3617,7 +3617,7 @@
     };
     };
   });
   });
   SweetAlert.DismissReason = DismissReason;
   SweetAlert.DismissReason = DismissReason;
-  SweetAlert.version = '10.13.0';
+  SweetAlert.version = '10.13.1';
 
 
   var Swal = SweetAlert;
   var Swal = SweetAlert;
   Swal["default"] = Swal;
   Swal["default"] = Swal;

File diff suppressed because it is too large
+ 1 - 1
plugins/sweetalert2/sweetalert2.all.min.js


+ 3 - 3
plugins/sweetalert2/sweetalert2.js

@@ -1,5 +1,5 @@
 /*!
 /*!
-* sweetalert2 v10.13.0
+* sweetalert2 v10.13.1
 * Released under the MIT License.
 * Released under the MIT License.
 */
 */
 (function (global, factory) {
 (function (global, factory) {
@@ -2650,7 +2650,7 @@
 
 
   var showWarningsForElements = function showWarningsForElements(template) {
   var showWarningsForElements = function showWarningsForElements(template) {
     var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
     var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
-    toArray(template.querySelectorAll('*')).forEach(function (el) {
+    toArray(template.children).forEach(function (el) {
       var tagName = el.tagName.toLowerCase();
       var tagName = el.tagName.toLowerCase();
 
 
       if (allowedElements.indexOf(tagName) === -1) {
       if (allowedElements.indexOf(tagName) === -1) {
@@ -3617,7 +3617,7 @@
     };
     };
   });
   });
   SweetAlert.DismissReason = DismissReason;
   SweetAlert.DismissReason = DismissReason;
-  SweetAlert.version = '10.13.0';
+  SweetAlert.version = '10.13.1';
 
 
   var Swal = SweetAlert;
   var Swal = SweetAlert;
   Swal["default"] = Swal;
   Swal["default"] = Swal;

File diff suppressed because it is too large
+ 1 - 1
plugins/sweetalert2/sweetalert2.min.js


+ 62 - 88
plugins/uplot/uPlot.cjs.js

@@ -4,7 +4,7 @@
 *
 *
 * uPlot.js (μPlot)
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.1)
+* https://github.com/leeoniya/uPlot (v1.6.3)
 */
 */
 
 
 'use strict';
 'use strict';
@@ -336,21 +336,33 @@ function assign(targ) {
 }
 }
 
 
 // nullModes
 // nullModes
-const NULL_IGNORE = 0;  // all nulls are ignored by isGap
-const NULL_GAP    = 1;  // alignment nulls are ignored by isGap (default)
-const NULL_EXPAND = 2;  // nulls are expand to include adjacent alignment nulls
+const NULL_IGNORE = 0;  // all nulls are ignored, converted to undefined (e.g. spanGaps: true)
+const NULL_GAP    = 1;  // nulls are retained, alignment artifacts = undefined values (default)
+const NULL_EXPAND = 2;  // nulls are expanded to include adjacent alignment artifacts (undefined values)
+
+// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
+function nullExpand(yVals, nullIdxs, alignedLen) {
+	for (let i = 0, xi, lastNullIdx = -inf; i < nullIdxs.length; i++) {
+		let nullIdx = nullIdxs[i];
+
+		if (nullIdx > lastNullIdx) {
+			xi = nullIdx - 1;
+			while (xi >= 0 && yVals[xi] == null)
+				yVals[xi--] = null;
+
+			xi = nullIdx + 1;
+			while (xi < alignedLen && yVals[xi] == null)
+				yVals[lastNullIdx = xi++] = null;
+		}
+	}
+}
 
 
 // nullModes is a tables-matched array indicating how to treat nulls in each series
 // nullModes is a tables-matched array indicating how to treat nulls in each series
 function join(tables, nullModes) {
 function join(tables, nullModes) {
-	if (tables.length == 1) {
-		return {
-			data: tables[0],
-			isGap: nullModes ? (u, seriesIdx, dataIdx) => nullModes[0][seriesIdx] != NULL_IGNORE : () => true,
-		};
-	}
+	if (tables.length == 1)
+		return tables[0];
 
 
 	let xVals = new Set();
 	let xVals = new Set();
-	let xNulls = [new Set()];
 
 
 	for (let ti = 0; ti < tables.length; ti++) {
 	for (let ti = 0; ti < tables.length; ti++) {
 		let t = tables[ti];
 		let t = tables[ti];
@@ -359,22 +371,6 @@ function join(tables, nullModes) {
 
 
 		for (let i = 0; i < len; i++)
 		for (let i = 0; i < len; i++)
 			xVals.add(xs[i]);
 			xVals.add(xs[i]);
-
-		for (let si = 1; si < t.length; si++) {
-			let nulls = new Set();
-
-			// cache original nulls for isGap lookup
-			if (nullModes == null || nullModes[ti][si] == NULL_GAP || nullModes[ti][si] == NULL_EXPAND) {
-				let ys = t[si];
-
-				for (let i = 0; i < len; i++) {
-					if (ys[i] == null)
-						nulls.add(xs[i]);
-				}
-			}
-
-			xNulls.push(nulls);
-		}
 	}
 	}
 
 
 	let data = [Array.from(xVals).sort((a, b) => a - b)];
 	let data = [Array.from(xVals).sort((a, b) => a - b)];
@@ -386,8 +382,6 @@ function join(tables, nullModes) {
 	for (let i = 0; i < alignedLen; i++)
 	for (let i = 0; i < alignedLen; i++)
 		xIdxs.set(data[0][i], i);
 		xIdxs.set(data[0][i], i);
 
 
-	let gsi = 1;
-
 	for (let ti = 0; ti < tables.length; ti++) {
 	for (let ti = 0; ti < tables.length; ti++) {
 		let t = tables[ti];
 		let t = tables[ti];
 		let xs = t[0];
 		let xs = t[0];
@@ -395,55 +389,35 @@ function join(tables, nullModes) {
 		for (let si = 1; si < t.length; si++) {
 		for (let si = 1; si < t.length; si++) {
 			let ys = t[si];
 			let ys = t[si];
 
 
-			let yVals = Array(alignedLen).fill(null);
-
-			for (let i = 0; i < ys.length; i++)
-				yVals[xIdxs.get(xs[i])] = ys[i];
-
-			// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
-			if (nullModes && nullModes[ti][si] == NULL_EXPAND) {
-				let nulls = xNulls[gsi];
-				let size = nulls.size;
-				let	i = 0;
-				let xi;
+			let yVals = Array(alignedLen).fill(undefined);
 
 
-				let lastAddedX = -inf;
+			let nullMode = nullModes ? nullModes[ti][si] : NULL_GAP;
 
 
-				for (let xVal of nulls.values()) {
-					if (i++ == size)
-						break;
+			let nullIdxs = [];
 
 
-					if (xVal > lastAddedX) {
-						let xIdx = xIdxs.get(xVal);
+			for (let i = 0; i < ys.length; i++) {
+				let yVal = ys[i];
+				let alignedIdx = xIdxs.get(xs[i]);
 
 
-						xi = xIdx - 1;
-						while (yVals[xi] === null) {
-							nulls.add(data[0][xi]);
-							xi--;
-						}
+				if (yVal == null) {
+					if (nullMode != NULL_IGNORE) {
+						yVals[alignedIdx] = yVal;
 
 
-						xi = xIdx + 1;
-						while (yVals[xi] === null) {
-							nulls.add(lastAddedX = data[0][xi]);
-							xi++;
-						}
+						if (nullMode == NULL_EXPAND)
+							nullIdxs.push(alignedIdx);
 					}
 					}
 				}
 				}
+				else
+					yVals[alignedIdx] = yVal;
 			}
 			}
 
 
-			data.push(yVals);
+			nullExpand(yVals, nullIdxs, alignedLen);
 
 
-			gsi++;
+			data.push(yVals);
 		}
 		}
 	}
 	}
 
 
-	return {
-		data: data,
-		isGap(u, seriesIdx, dataIdx) {
-			let xVal = u._data[0][dataIdx];
-			return xNulls[seriesIdx].has(xVal);
-		},
-	};
+	return data;
 }
 }
 
 
 const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
 const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
@@ -1122,6 +1096,7 @@ const lineMult = 1.5;		// font-size multiplier
 const xAxisOpts = {
 const xAxisOpts = {
 	show: true,
 	show: true,
 	scale: "x",
 	scale: "x",
+	stroke: hexBlack,
 	space: 50,
 	space: 50,
 	gap: 5,
 	gap: 5,
 	size: 50,
 	size: 50,
@@ -1235,6 +1210,7 @@ function numSeriesVal(self, val) {
 const yAxisOpts = {
 const yAxisOpts = {
 	show: true,
 	show: true,
 	scale: "y",
 	scale: "y",
+	stroke: hexBlack,
 	space: 30,
 	space: 30,
 	gap: 5,
 	gap: 5,
 	size: 50,
 	size: 50,
@@ -1269,7 +1245,8 @@ function seriesPoints(self, si) {
 
 
 function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 	let scale = self.scales[self.series[seriesIdx].scale];
 	let scale = self.scales[self.series[seriesIdx].scale];
-	return scale.distr == 3 ? scale.min : 0;
+	let isUpperBandEdge = self.bands && self.bands.some(b => b.series[0] == seriesIdx);
+	return scale.distr == 3 || isUpperBandEdge ? scale.min : 0;
 }
 }
 
 
 const ySeriesOpts = {
 const ySeriesOpts = {
@@ -1279,7 +1256,6 @@ const ySeriesOpts = {
 	show: true,
 	show: true,
 	band: false,
 	band: false,
 	spanGaps: false,
 	spanGaps: false,
-	isGap: (self, seriesIdx, dataIdx) => true,
 	alpha: 1,
 	alpha: 1,
 	points: {
 	points: {
 		show: seriesPoints,
 		show: seriesPoints,
@@ -1515,8 +1491,6 @@ function linear() {
 				drawAcc = drawAccV;
 				drawAcc = drawAccV;
 			}
 			}
 
 
-			const isGap = series.isGap;
-
 			const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 			const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 
 
 			const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
 			const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
@@ -1553,7 +1527,7 @@ function linear() {
 						minY = min(outY, minY);
 						minY = min(outY, minY);
 						maxY = max(outY, maxY);
 						maxY = max(outY, maxY);
 					}
 					}
-					else if (!accGaps && isGap(u, seriesIdx, i))
+					else if (!accGaps && dataY[i] === null)
 						accGaps = true;
 						accGaps = true;
 				}
 				}
 				else {
 				else {
@@ -1574,14 +1548,14 @@ function linear() {
 						minY = maxY = outY;
 						minY = maxY = outY;
 
 
 						// prior pixel can have data but still start a gap if ends with null
 						// prior pixel can have data but still start a gap if ends with null
-						if (x - accX > 1 && dataY[i - dir] == null && isGap(u, seriesIdx, i - dir))
+						if (x - accX > 1 && dataY[i - dir] === null)
 							_addGap = true;
 							_addGap = true;
 					}
 					}
 					else {
 					else {
 						minY = inf;
 						minY = inf;
 						maxY = -inf;
 						maxY = -inf;
 
 
-						if (!accGaps && isGap(u, seriesIdx, i))
+						if (!accGaps && dataY[i] === null)
 							accGaps = true;
 							accGaps = true;
 					}
 					}
 
 
@@ -1655,7 +1629,7 @@ function spline(opts) {
 				let xPos = valToPosX(xVal, scaleX, xDim, xOff);
 				let xPos = valToPosX(xVal, scaleX, xDim, xOff);
 
 
 				if (yVal == null) {
 				if (yVal == null) {
-					if (series.isGap(u, seriesIdx, i)) {
+					if (yVal === null) {
 						addGap(gaps, prevXPos, xPos);
 						addGap(gaps, prevXPos, xPos);
 						inGap = true;
 						inGap = true;
 					}
 					}
@@ -1857,7 +1831,7 @@ function stepped(opts) {
 				let x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 				let x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 
 
 				if (yVal1 == null) {
 				if (yVal1 == null) {
-					if (series.isGap(u, seriesIdx, i)) {
+					if (yVal1 === null) {
 						addGap(gaps, prevXPos, x1);
 						addGap(gaps, prevXPos, x1);
 						inGap = true;
 						inGap = true;
 					}
 					}
@@ -2580,7 +2554,7 @@ function uPlot(opts, data, then) {
 			s.paths  = s.paths || linearPath || retNull;
 			s.paths  = s.paths || linearPath || retNull;
 			s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 			s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 
 
-			s.stroke = fnOrSelf(s.stroke || hexBlack);
+			s.stroke = fnOrSelf(s.stroke || null);
 			s.fill   = fnOrSelf(s.fill || null);
 			s.fill   = fnOrSelf(s.fill || null);
 			s._stroke = s._fill = s._paths = null;
 			s._stroke = s._fill = s._paths = null;
 
 
@@ -2654,7 +2628,12 @@ function uPlot(opts, data, then) {
 			axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 			axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 			axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 			axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 
 
+			axis.stroke       = fnOrSelf(axis.stroke);
+			axis.grid.stroke  = fnOrSelf(axis.grid.stroke);
+			axis.ticks.stroke = fnOrSelf(axis.ticks.stroke);
+
 			let av = axis.values;
 			let av = axis.values;
+
 			axis.values = (
 			axis.values = (
 				isTime ? (
 				isTime ? (
 					isArr(av) ?
 					isArr(av) ?
@@ -2716,11 +2695,6 @@ function uPlot(opts, data, then) {
 	let viaAutoScaleX = false;
 	let viaAutoScaleX = false;
 
 
 	function setData(_data, _resetScales) {
 	function setData(_data, _resetScales) {
-		if (!isArr(_data) && isObj(_data)) {
-			_data.isGap && series.forEach(s => { s.isGap = _data.isGap; });
-			_data = _data.data;
-		}
-
 		_data = _data || [];
 		_data = _data || [];
 		_data[0] = _data[0] || [];
 		_data[0] = _data[0] || [];
 
 
@@ -3081,13 +3055,13 @@ function uPlot(opts, data, then) {
 		ctx.rect(lft, top, wid, hgt);
 		ctx.rect(lft, top, wid, hgt);
 		ctx.clip();
 		ctx.clip();
 
 
-		if (clip != null)
-			ctx.clip(clip);
+		clip && ctx.clip(clip);
+
+		let isUpperEdge = fillBands(si, _fill);
 
 
-		if (!fillBands(si, _fill) && _fill != null)
-			ctx.fill(fill);
+		!isUpperEdge && _fill   && fill   && ctx.fill(fill);
 
 
-		width && ctx.stroke(stroke);
+		width        && _stroke && stroke && ctx.stroke(stroke);
 
 
 		ctx.restore();
 		ctx.restore();
 
 
@@ -3290,7 +3264,7 @@ function uPlot(opts, data, then) {
 			let x        = ori == 1 ? finalPos : 0;
 			let x        = ori == 1 ? finalPos : 0;
 
 
 			ctx.font         = axis.font[0];
 			ctx.font         = axis.font[0];
-			ctx.fillStyle    = axis.stroke || hexBlack;									// rgba?
+			ctx.fillStyle    = axis.stroke(self, i);									// rgba?
 			ctx.textAlign    = axis.align == 1 ? LEFT :
 			ctx.textAlign    = axis.align == 1 ? LEFT :
 			                   axis.align == 2 ? RIGHT :
 			                   axis.align == 2 ? RIGHT :
 			                   angle > 0 ? LEFT :
 			                   angle > 0 ? LEFT :
@@ -3366,7 +3340,7 @@ function uPlot(opts, data, then) {
 					basePos,
 					basePos,
 					tickSize,
 					tickSize,
 					roundDec(ticks.width * pxRatio, 3),
 					roundDec(ticks.width * pxRatio, 3),
-					ticks.stroke,
+					ticks.stroke(self, i),
 					ticks.dash,
 					ticks.dash,
 					ticks.cap,
 					ticks.cap,
 				);
 				);
@@ -3384,7 +3358,7 @@ function uPlot(opts, data, then) {
 					ori == 0 ? plotTop : plotLft,
 					ori == 0 ? plotTop : plotLft,
 					ori == 0 ? plotHgt : plotWid,
 					ori == 0 ? plotHgt : plotWid,
 					roundDec(grid.width * pxRatio, 3),
 					roundDec(grid.width * pxRatio, 3),
-					grid.stroke,
+					grid.stroke(self, i),
 					grid.dash,
 					grid.dash,
 					grid.cap,
 					grid.cap,
 				);
 				);

+ 62 - 88
plugins/uplot/uPlot.esm.js

@@ -4,7 +4,7 @@
 *
 *
 * uPlot.js (μPlot)
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.1)
+* https://github.com/leeoniya/uPlot (v1.6.3)
 */
 */
 
 
 const FEAT_TIME          = true;
 const FEAT_TIME          = true;
@@ -334,21 +334,33 @@ function assign(targ) {
 }
 }
 
 
 // nullModes
 // nullModes
-const NULL_IGNORE = 0;  // all nulls are ignored by isGap
-const NULL_GAP    = 1;  // alignment nulls are ignored by isGap (default)
-const NULL_EXPAND = 2;  // nulls are expand to include adjacent alignment nulls
+const NULL_IGNORE = 0;  // all nulls are ignored, converted to undefined (e.g. spanGaps: true)
+const NULL_GAP    = 1;  // nulls are retained, alignment artifacts = undefined values (default)
+const NULL_EXPAND = 2;  // nulls are expanded to include adjacent alignment artifacts (undefined values)
+
+// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
+function nullExpand(yVals, nullIdxs, alignedLen) {
+	for (let i = 0, xi, lastNullIdx = -inf; i < nullIdxs.length; i++) {
+		let nullIdx = nullIdxs[i];
+
+		if (nullIdx > lastNullIdx) {
+			xi = nullIdx - 1;
+			while (xi >= 0 && yVals[xi] == null)
+				yVals[xi--] = null;
+
+			xi = nullIdx + 1;
+			while (xi < alignedLen && yVals[xi] == null)
+				yVals[lastNullIdx = xi++] = null;
+		}
+	}
+}
 
 
 // nullModes is a tables-matched array indicating how to treat nulls in each series
 // nullModes is a tables-matched array indicating how to treat nulls in each series
 function join(tables, nullModes) {
 function join(tables, nullModes) {
-	if (tables.length == 1) {
-		return {
-			data: tables[0],
-			isGap: nullModes ? (u, seriesIdx, dataIdx) => nullModes[0][seriesIdx] != NULL_IGNORE : () => true,
-		};
-	}
+	if (tables.length == 1)
+		return tables[0];
 
 
 	let xVals = new Set();
 	let xVals = new Set();
-	let xNulls = [new Set()];
 
 
 	for (let ti = 0; ti < tables.length; ti++) {
 	for (let ti = 0; ti < tables.length; ti++) {
 		let t = tables[ti];
 		let t = tables[ti];
@@ -357,22 +369,6 @@ function join(tables, nullModes) {
 
 
 		for (let i = 0; i < len; i++)
 		for (let i = 0; i < len; i++)
 			xVals.add(xs[i]);
 			xVals.add(xs[i]);
-
-		for (let si = 1; si < t.length; si++) {
-			let nulls = new Set();
-
-			// cache original nulls for isGap lookup
-			if (nullModes == null || nullModes[ti][si] == NULL_GAP || nullModes[ti][si] == NULL_EXPAND) {
-				let ys = t[si];
-
-				for (let i = 0; i < len; i++) {
-					if (ys[i] == null)
-						nulls.add(xs[i]);
-				}
-			}
-
-			xNulls.push(nulls);
-		}
 	}
 	}
 
 
 	let data = [Array.from(xVals).sort((a, b) => a - b)];
 	let data = [Array.from(xVals).sort((a, b) => a - b)];
@@ -384,8 +380,6 @@ function join(tables, nullModes) {
 	for (let i = 0; i < alignedLen; i++)
 	for (let i = 0; i < alignedLen; i++)
 		xIdxs.set(data[0][i], i);
 		xIdxs.set(data[0][i], i);
 
 
-	let gsi = 1;
-
 	for (let ti = 0; ti < tables.length; ti++) {
 	for (let ti = 0; ti < tables.length; ti++) {
 		let t = tables[ti];
 		let t = tables[ti];
 		let xs = t[0];
 		let xs = t[0];
@@ -393,55 +387,35 @@ function join(tables, nullModes) {
 		for (let si = 1; si < t.length; si++) {
 		for (let si = 1; si < t.length; si++) {
 			let ys = t[si];
 			let ys = t[si];
 
 
-			let yVals = Array(alignedLen).fill(null);
-
-			for (let i = 0; i < ys.length; i++)
-				yVals[xIdxs.get(xs[i])] = ys[i];
-
-			// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
-			if (nullModes && nullModes[ti][si] == NULL_EXPAND) {
-				let nulls = xNulls[gsi];
-				let size = nulls.size;
-				let	i = 0;
-				let xi;
+			let yVals = Array(alignedLen).fill(undefined);
 
 
-				let lastAddedX = -inf;
+			let nullMode = nullModes ? nullModes[ti][si] : NULL_GAP;
 
 
-				for (let xVal of nulls.values()) {
-					if (i++ == size)
-						break;
+			let nullIdxs = [];
 
 
-					if (xVal > lastAddedX) {
-						let xIdx = xIdxs.get(xVal);
+			for (let i = 0; i < ys.length; i++) {
+				let yVal = ys[i];
+				let alignedIdx = xIdxs.get(xs[i]);
 
 
-						xi = xIdx - 1;
-						while (yVals[xi] === null) {
-							nulls.add(data[0][xi]);
-							xi--;
-						}
+				if (yVal == null) {
+					if (nullMode != NULL_IGNORE) {
+						yVals[alignedIdx] = yVal;
 
 
-						xi = xIdx + 1;
-						while (yVals[xi] === null) {
-							nulls.add(lastAddedX = data[0][xi]);
-							xi++;
-						}
+						if (nullMode == NULL_EXPAND)
+							nullIdxs.push(alignedIdx);
 					}
 					}
 				}
 				}
+				else
+					yVals[alignedIdx] = yVal;
 			}
 			}
 
 
-			data.push(yVals);
+			nullExpand(yVals, nullIdxs, alignedLen);
 
 
-			gsi++;
+			data.push(yVals);
 		}
 		}
 	}
 	}
 
 
-	return {
-		data: data,
-		isGap(u, seriesIdx, dataIdx) {
-			let xVal = u._data[0][dataIdx];
-			return xNulls[seriesIdx].has(xVal);
-		},
-	};
+	return data;
 }
 }
 
 
 const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
 const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
@@ -1120,6 +1094,7 @@ const lineMult = 1.5;		// font-size multiplier
 const xAxisOpts = {
 const xAxisOpts = {
 	show: true,
 	show: true,
 	scale: "x",
 	scale: "x",
+	stroke: hexBlack,
 	space: 50,
 	space: 50,
 	gap: 5,
 	gap: 5,
 	size: 50,
 	size: 50,
@@ -1233,6 +1208,7 @@ function numSeriesVal(self, val) {
 const yAxisOpts = {
 const yAxisOpts = {
 	show: true,
 	show: true,
 	scale: "y",
 	scale: "y",
+	stroke: hexBlack,
 	space: 30,
 	space: 30,
 	gap: 5,
 	gap: 5,
 	size: 50,
 	size: 50,
@@ -1267,7 +1243,8 @@ function seriesPoints(self, si) {
 
 
 function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 	let scale = self.scales[self.series[seriesIdx].scale];
 	let scale = self.scales[self.series[seriesIdx].scale];
-	return scale.distr == 3 ? scale.min : 0;
+	let isUpperBandEdge = self.bands && self.bands.some(b => b.series[0] == seriesIdx);
+	return scale.distr == 3 || isUpperBandEdge ? scale.min : 0;
 }
 }
 
 
 const ySeriesOpts = {
 const ySeriesOpts = {
@@ -1277,7 +1254,6 @@ const ySeriesOpts = {
 	show: true,
 	show: true,
 	band: false,
 	band: false,
 	spanGaps: false,
 	spanGaps: false,
-	isGap: (self, seriesIdx, dataIdx) => true,
 	alpha: 1,
 	alpha: 1,
 	points: {
 	points: {
 		show: seriesPoints,
 		show: seriesPoints,
@@ -1513,8 +1489,6 @@ function linear() {
 				drawAcc = drawAccV;
 				drawAcc = drawAccV;
 			}
 			}
 
 
-			const isGap = series.isGap;
-
 			const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 			const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 
 
 			const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
 			const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
@@ -1551,7 +1525,7 @@ function linear() {
 						minY = min(outY, minY);
 						minY = min(outY, minY);
 						maxY = max(outY, maxY);
 						maxY = max(outY, maxY);
 					}
 					}
-					else if (!accGaps && isGap(u, seriesIdx, i))
+					else if (!accGaps && dataY[i] === null)
 						accGaps = true;
 						accGaps = true;
 				}
 				}
 				else {
 				else {
@@ -1572,14 +1546,14 @@ function linear() {
 						minY = maxY = outY;
 						minY = maxY = outY;
 
 
 						// prior pixel can have data but still start a gap if ends with null
 						// prior pixel can have data but still start a gap if ends with null
-						if (x - accX > 1 && dataY[i - dir] == null && isGap(u, seriesIdx, i - dir))
+						if (x - accX > 1 && dataY[i - dir] === null)
 							_addGap = true;
 							_addGap = true;
 					}
 					}
 					else {
 					else {
 						minY = inf;
 						minY = inf;
 						maxY = -inf;
 						maxY = -inf;
 
 
-						if (!accGaps && isGap(u, seriesIdx, i))
+						if (!accGaps && dataY[i] === null)
 							accGaps = true;
 							accGaps = true;
 					}
 					}
 
 
@@ -1653,7 +1627,7 @@ function spline(opts) {
 				let xPos = valToPosX(xVal, scaleX, xDim, xOff);
 				let xPos = valToPosX(xVal, scaleX, xDim, xOff);
 
 
 				if (yVal == null) {
 				if (yVal == null) {
-					if (series.isGap(u, seriesIdx, i)) {
+					if (yVal === null) {
 						addGap(gaps, prevXPos, xPos);
 						addGap(gaps, prevXPos, xPos);
 						inGap = true;
 						inGap = true;
 					}
 					}
@@ -1855,7 +1829,7 @@ function stepped(opts) {
 				let x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 				let x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 
 
 				if (yVal1 == null) {
 				if (yVal1 == null) {
-					if (series.isGap(u, seriesIdx, i)) {
+					if (yVal1 === null) {
 						addGap(gaps, prevXPos, x1);
 						addGap(gaps, prevXPos, x1);
 						inGap = true;
 						inGap = true;
 					}
 					}
@@ -2578,7 +2552,7 @@ function uPlot(opts, data, then) {
 			s.paths  = s.paths || linearPath || retNull;
 			s.paths  = s.paths || linearPath || retNull;
 			s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 			s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 
 
-			s.stroke = fnOrSelf(s.stroke || hexBlack);
+			s.stroke = fnOrSelf(s.stroke || null);
 			s.fill   = fnOrSelf(s.fill || null);
 			s.fill   = fnOrSelf(s.fill || null);
 			s._stroke = s._fill = s._paths = null;
 			s._stroke = s._fill = s._paths = null;
 
 
@@ -2652,7 +2626,12 @@ function uPlot(opts, data, then) {
 			axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 			axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 			axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 			axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 
 
+			axis.stroke       = fnOrSelf(axis.stroke);
+			axis.grid.stroke  = fnOrSelf(axis.grid.stroke);
+			axis.ticks.stroke = fnOrSelf(axis.ticks.stroke);
+
 			let av = axis.values;
 			let av = axis.values;
+
 			axis.values = (
 			axis.values = (
 				isTime ? (
 				isTime ? (
 					isArr(av) ?
 					isArr(av) ?
@@ -2714,11 +2693,6 @@ function uPlot(opts, data, then) {
 	let viaAutoScaleX = false;
 	let viaAutoScaleX = false;
 
 
 	function setData(_data, _resetScales) {
 	function setData(_data, _resetScales) {
-		if (!isArr(_data) && isObj(_data)) {
-			_data.isGap && series.forEach(s => { s.isGap = _data.isGap; });
-			_data = _data.data;
-		}
-
 		_data = _data || [];
 		_data = _data || [];
 		_data[0] = _data[0] || [];
 		_data[0] = _data[0] || [];
 
 
@@ -3079,13 +3053,13 @@ function uPlot(opts, data, then) {
 		ctx.rect(lft, top, wid, hgt);
 		ctx.rect(lft, top, wid, hgt);
 		ctx.clip();
 		ctx.clip();
 
 
-		if (clip != null)
-			ctx.clip(clip);
+		clip && ctx.clip(clip);
+
+		let isUpperEdge = fillBands(si, _fill);
 
 
-		if (!fillBands(si, _fill) && _fill != null)
-			ctx.fill(fill);
+		!isUpperEdge && _fill   && fill   && ctx.fill(fill);
 
 
-		width && ctx.stroke(stroke);
+		width        && _stroke && stroke && ctx.stroke(stroke);
 
 
 		ctx.restore();
 		ctx.restore();
 
 
@@ -3288,7 +3262,7 @@ function uPlot(opts, data, then) {
 			let x        = ori == 1 ? finalPos : 0;
 			let x        = ori == 1 ? finalPos : 0;
 
 
 			ctx.font         = axis.font[0];
 			ctx.font         = axis.font[0];
-			ctx.fillStyle    = axis.stroke || hexBlack;									// rgba?
+			ctx.fillStyle    = axis.stroke(self, i);									// rgba?
 			ctx.textAlign    = axis.align == 1 ? LEFT :
 			ctx.textAlign    = axis.align == 1 ? LEFT :
 			                   axis.align == 2 ? RIGHT :
 			                   axis.align == 2 ? RIGHT :
 			                   angle > 0 ? LEFT :
 			                   angle > 0 ? LEFT :
@@ -3364,7 +3338,7 @@ function uPlot(opts, data, then) {
 					basePos,
 					basePos,
 					tickSize,
 					tickSize,
 					roundDec(ticks.width * pxRatio, 3),
 					roundDec(ticks.width * pxRatio, 3),
-					ticks.stroke,
+					ticks.stroke(self, i),
 					ticks.dash,
 					ticks.dash,
 					ticks.cap,
 					ticks.cap,
 				);
 				);
@@ -3382,7 +3356,7 @@ function uPlot(opts, data, then) {
 					ori == 0 ? plotTop : plotLft,
 					ori == 0 ? plotTop : plotLft,
 					ori == 0 ? plotHgt : plotWid,
 					ori == 0 ? plotHgt : plotWid,
 					roundDec(grid.width * pxRatio, 3),
 					roundDec(grid.width * pxRatio, 3),
-					grid.stroke,
+					grid.stroke(self, i),
 					grid.dash,
 					grid.dash,
 					grid.cap,
 					grid.cap,
 				);
 				);

+ 66 - 92
plugins/uplot/uPlot.iife.js

@@ -4,7 +4,7 @@
 *
 *
 * uPlot.js (μPlot)
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.1)
+* https://github.com/leeoniya/uPlot (v1.6.3)
 */
 */
 
 
 var uPlot = (function () {
 var uPlot = (function () {
@@ -336,21 +336,33 @@ var uPlot = (function () {
 	}
 	}
 
 
 	// nullModes
 	// nullModes
-	var NULL_IGNORE = 0;  // all nulls are ignored by isGap
-	var NULL_GAP    = 1;  // alignment nulls are ignored by isGap (default)
-	var NULL_EXPAND = 2;  // nulls are expand to include adjacent alignment nulls
+	var NULL_IGNORE = 0;  // all nulls are ignored, converted to undefined (e.g. spanGaps: true)
+	var NULL_GAP    = 1;  // nulls are retained, alignment artifacts = undefined values (default)
+	var NULL_EXPAND = 2;  // nulls are expanded to include adjacent alignment artifacts (undefined values)
+
+	// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
+	function nullExpand(yVals, nullIdxs, alignedLen) {
+		for (var i = 0, xi = (void 0), lastNullIdx = -inf; i < nullIdxs.length; i++) {
+			var nullIdx = nullIdxs[i];
+
+			if (nullIdx > lastNullIdx) {
+				xi = nullIdx - 1;
+				while (xi >= 0 && yVals[xi] == null)
+					{ yVals[xi--] = null; }
+
+				xi = nullIdx + 1;
+				while (xi < alignedLen && yVals[xi] == null)
+					{ yVals[lastNullIdx = xi++] = null; }
+			}
+		}
+	}
 
 
 	// nullModes is a tables-matched array indicating how to treat nulls in each series
 	// nullModes is a tables-matched array indicating how to treat nulls in each series
 	function join(tables, nullModes) {
 	function join(tables, nullModes) {
-		if (tables.length == 1) {
-			return {
-				data: tables[0],
-				isGap: nullModes ? (u, seriesIdx, dataIdx) => nullModes[0][seriesIdx] != NULL_IGNORE : () => true,
-			};
-		}
+		if (tables.length == 1)
+			{ return tables[0]; }
 
 
 		var xVals = new Set();
 		var xVals = new Set();
-		var xNulls = [new Set()];
 
 
 		for (var ti = 0; ti < tables.length; ti++) {
 		for (var ti = 0; ti < tables.length; ti++) {
 			var t = tables[ti];
 			var t = tables[ti];
@@ -359,22 +371,6 @@ var uPlot = (function () {
 
 
 			for (var i = 0; i < len; i++)
 			for (var i = 0; i < len; i++)
 				{ xVals.add(xs[i]); }
 				{ xVals.add(xs[i]); }
-
-			for (var si = 1; si < t.length; si++) {
-				var nulls = new Set();
-
-				// cache original nulls for isGap lookup
-				if (nullModes == null || nullModes[ti][si] == NULL_GAP || nullModes[ti][si] == NULL_EXPAND) {
-					var ys = t[si];
-
-					for (var i$1 = 0; i$1 < len; i$1++) {
-						if (ys[i$1] == null)
-							{ nulls.add(xs[i$1]); }
-					}
-				}
-
-				xNulls.push(nulls);
-			}
 		}
 		}
 
 
 		var data = [Array.from(xVals).sort((a, b) => a - b)];
 		var data = [Array.from(xVals).sort((a, b) => a - b)];
@@ -383,67 +379,45 @@ var uPlot = (function () {
 
 
 		var xIdxs = new Map();
 		var xIdxs = new Map();
 
 
-		for (var i$2 = 0; i$2 < alignedLen; i$2++)
-			{ xIdxs.set(data[0][i$2], i$2); }
-
-		var gsi = 1;
+		for (var i$1 = 0; i$1 < alignedLen; i$1++)
+			{ xIdxs.set(data[0][i$1], i$1); }
 
 
 		for (var ti$1 = 0; ti$1 < tables.length; ti$1++) {
 		for (var ti$1 = 0; ti$1 < tables.length; ti$1++) {
 			var t$1 = tables[ti$1];
 			var t$1 = tables[ti$1];
 			var xs$1 = t$1[0];
 			var xs$1 = t$1[0];
 
 
-			for (var si$1 = 1; si$1 < t$1.length; si$1++) {
-				var ys$1 = t$1[si$1];
-
-				var yVals = Array(alignedLen).fill(null);
+			for (var si = 1; si < t$1.length; si++) {
+				var ys = t$1[si];
 
 
-				for (var i$3 = 0; i$3 < ys$1.length; i$3++)
-					{ yVals[xIdxs.get(xs$1[i$3])] = ys$1[i$3]; }
+				var yVals = Array(alignedLen).fill(undefined);
 
 
-				// mark all filler nulls as explicit when adjacent to existing explicit nulls (minesweeper)
-				if (nullModes && nullModes[ti$1][si$1] == NULL_EXPAND) {
-					var nulls$1 = xNulls[gsi];
-					var size = nulls$1.size;
-					var	i$4 = 0;
-					var xi = (void 0);
+				var nullMode = nullModes ? nullModes[ti$1][si] : NULL_GAP;
 
 
-					var lastAddedX = -inf;
-
-					for (var xVal of nulls$1.values()) {
-						if (i$4++ == size)
-							{ break; }
+				var nullIdxs = [];
 
 
-						if (xVal > lastAddedX) {
-							var xIdx = xIdxs.get(xVal);
+				for (var i$2 = 0; i$2 < ys.length; i$2++) {
+					var yVal = ys[i$2];
+					var alignedIdx = xIdxs.get(xs$1[i$2]);
 
 
-							xi = xIdx - 1;
-							while (yVals[xi] === null) {
-								nulls$1.add(data[0][xi]);
-								xi--;
-							}
+					if (yVal == null) {
+						if (nullMode != NULL_IGNORE) {
+							yVals[alignedIdx] = yVal;
 
 
-							xi = xIdx + 1;
-							while (yVals[xi] === null) {
-								nulls$1.add(lastAddedX = data[0][xi]);
-								xi++;
-							}
+							if (nullMode == NULL_EXPAND)
+								{ nullIdxs.push(alignedIdx); }
 						}
 						}
 					}
 					}
+					else
+						{ yVals[alignedIdx] = yVal; }
 				}
 				}
 
 
-				data.push(yVals);
+				nullExpand(yVals, nullIdxs, alignedLen);
 
 
-				gsi++;
+				data.push(yVals);
 			}
 			}
 		}
 		}
 
 
-		return {
-			data: data,
-			isGap: function isGap(u, seriesIdx, dataIdx) {
-				var xVal = u._data[0][dataIdx];
-				return xNulls[seriesIdx].has(xVal);
-			},
-		};
+		return data;
 	}
 	}
 
 
 	var microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
 	var microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask;
@@ -1123,6 +1097,7 @@ var uPlot = (function () {
 	var xAxisOpts = {
 	var xAxisOpts = {
 		show: true,
 		show: true,
 		scale: "x",
 		scale: "x",
+		stroke: hexBlack,
 		space: 50,
 		space: 50,
 		gap: 5,
 		gap: 5,
 		size: 50,
 		size: 50,
@@ -1236,6 +1211,7 @@ var uPlot = (function () {
 	var yAxisOpts = {
 	var yAxisOpts = {
 		show: true,
 		show: true,
 		scale: "y",
 		scale: "y",
+		stroke: hexBlack,
 		space: 30,
 		space: 30,
 		gap: 5,
 		gap: 5,
 		size: 50,
 		size: 50,
@@ -1270,7 +1246,8 @@ var uPlot = (function () {
 
 
 	function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 	function seriesFillTo(self, seriesIdx, dataMin, dataMax) {
 		var scale = self.scales[self.series[seriesIdx].scale];
 		var scale = self.scales[self.series[seriesIdx].scale];
-		return scale.distr == 3 ? scale.min : 0;
+		var isUpperBandEdge = self.bands && self.bands.some(b => b.series[0] == seriesIdx);
+		return scale.distr == 3 || isUpperBandEdge ? scale.min : 0;
 	}
 	}
 
 
 	var ySeriesOpts = {
 	var ySeriesOpts = {
@@ -1280,7 +1257,6 @@ var uPlot = (function () {
 		show: true,
 		show: true,
 		band: false,
 		band: false,
 		spanGaps: false,
 		spanGaps: false,
-		isGap: (self, seriesIdx, dataIdx) => true,
 		alpha: 1,
 		alpha: 1,
 		points: {
 		points: {
 			show: seriesPoints,
 			show: seriesPoints,
@@ -1516,8 +1492,6 @@ var uPlot = (function () {
 					drawAcc = drawAccV;
 					drawAcc = drawAccV;
 				}
 				}
 
 
-				var isGap = series.isGap;
-
 				var dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 				var dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);
 
 
 				var _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
 				var _paths = {stroke: new Path2D(), fill: null, clip: null, band: null};
@@ -1554,7 +1528,7 @@ var uPlot = (function () {
 							minY = min(outY, minY);
 							minY = min(outY, minY);
 							maxY = max(outY, maxY);
 							maxY = max(outY, maxY);
 						}
 						}
-						else if (!accGaps && isGap(u, seriesIdx, i))
+						else if (!accGaps && dataY[i] === null)
 							{ accGaps = true; }
 							{ accGaps = true; }
 					}
 					}
 					else {
 					else {
@@ -1575,14 +1549,14 @@ var uPlot = (function () {
 							minY = maxY = outY;
 							minY = maxY = outY;
 
 
 							// prior pixel can have data but still start a gap if ends with null
 							// prior pixel can have data but still start a gap if ends with null
-							if (x - accX > 1 && dataY[i - dir] == null && isGap(u, seriesIdx, i - dir))
+							if (x - accX > 1 && dataY[i - dir] === null)
 								{ _addGap = true; }
 								{ _addGap = true; }
 						}
 						}
 						else {
 						else {
 							minY = inf;
 							minY = inf;
 							maxY = -inf;
 							maxY = -inf;
 
 
-							if (!accGaps && isGap(u, seriesIdx, i))
+							if (!accGaps && dataY[i] === null)
 								{ accGaps = true; }
 								{ accGaps = true; }
 						}
 						}
 
 
@@ -1656,7 +1630,7 @@ var uPlot = (function () {
 					var xPos = valToPosX(xVal, scaleX, xDim, xOff);
 					var xPos = valToPosX(xVal, scaleX, xDim, xOff);
 
 
 					if (yVal == null) {
 					if (yVal == null) {
-						if (series.isGap(u, seriesIdx, i)) {
+						if (yVal === null) {
 							addGap(gaps, prevXPos, xPos);
 							addGap(gaps, prevXPos, xPos);
 							inGap = true;
 							inGap = true;
 						}
 						}
@@ -1851,7 +1825,7 @@ var uPlot = (function () {
 					var x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 					var x1 = round(valToPosX(dataX[i], scaleX, xDim, xOff));
 
 
 					if (yVal1 == null) {
 					if (yVal1 == null) {
-						if (series.isGap(u, seriesIdx, i)) {
+						if (yVal1 === null) {
 							addGap(gaps, prevXPos, x1);
 							addGap(gaps, prevXPos, x1);
 							inGap = true;
 							inGap = true;
 						}
 						}
@@ -2578,7 +2552,7 @@ var uPlot = (function () {
 				s.paths  = s.paths || linearPath || retNull;
 				s.paths  = s.paths || linearPath || retNull;
 				s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 				s.fillTo = fnOrSelf(s.fillTo || seriesFillTo);
 
 
-				s.stroke = fnOrSelf(s.stroke || hexBlack);
+				s.stroke = fnOrSelf(s.stroke || null);
 				s.fill   = fnOrSelf(s.fill || null);
 				s.fill   = fnOrSelf(s.fill || null);
 				s._stroke = s._fill = s._paths = null;
 				s._stroke = s._fill = s._paths = null;
 
 
@@ -2652,7 +2626,12 @@ var uPlot = (function () {
 				axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 				axis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));
 				axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 				axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : numAxisSplits));
 
 
+				axis.stroke       = fnOrSelf(axis.stroke);
+				axis.grid.stroke  = fnOrSelf(axis.grid.stroke);
+				axis.ticks.stroke = fnOrSelf(axis.ticks.stroke);
+
 				var av = axis.values;
 				var av = axis.values;
+
 				axis.values = (
 				axis.values = (
 					isTime ? (
 					isTime ? (
 						isArr(av) ?
 						isArr(av) ?
@@ -2717,11 +2696,6 @@ var uPlot = (function () {
 		var viaAutoScaleX = false;
 		var viaAutoScaleX = false;
 
 
 		function setData(_data, _resetScales) {
 		function setData(_data, _resetScales) {
-			if (!isArr(_data) && isObj(_data)) {
-				_data.isGap && series.forEach(s => { s.isGap = _data.isGap; });
-				_data = _data.data;
-			}
-
 			_data = _data || [];
 			_data = _data || [];
 			_data[0] = _data[0] || [];
 			_data[0] = _data[0] || [];
 
 
@@ -3087,13 +3061,13 @@ var uPlot = (function () {
 			ctx.rect(lft, top, wid, hgt);
 			ctx.rect(lft, top, wid, hgt);
 			ctx.clip();
 			ctx.clip();
 
 
-			if (clip != null)
-				{ ctx.clip(clip); }
+			clip && ctx.clip(clip);
+
+			var isUpperEdge = fillBands(si, _fill);
 
 
-			if (!fillBands(si, _fill) && _fill != null)
-				{ ctx.fill(fill); }
+			!isUpperEdge && _fill   && fill   && ctx.fill(fill);
 
 
-			width && ctx.stroke(stroke);
+			width        && _stroke && stroke && ctx.stroke(stroke);
 
 
 			ctx.restore();
 			ctx.restore();
 
 
@@ -3301,7 +3275,7 @@ var uPlot = (function () {
 				var x        = ori == 1 ? finalPos : 0;
 				var x        = ori == 1 ? finalPos : 0;
 
 
 				ctx.font         = axis.font[0];
 				ctx.font         = axis.font[0];
-				ctx.fillStyle    = axis.stroke || hexBlack;									// rgba?
+				ctx.fillStyle    = axis.stroke(self, i);									// rgba?
 				ctx.textAlign    = axis.align == 1 ? LEFT :
 				ctx.textAlign    = axis.align == 1 ? LEFT :
 				                   axis.align == 2 ? RIGHT :
 				                   axis.align == 2 ? RIGHT :
 				                   angle > 0 ? LEFT :
 				                   angle > 0 ? LEFT :
@@ -3377,7 +3351,7 @@ var uPlot = (function () {
 						basePos,
 						basePos,
 						tickSize,
 						tickSize,
 						roundDec(ticks.width * pxRatio, 3),
 						roundDec(ticks.width * pxRatio, 3),
-						ticks.stroke,
+						ticks.stroke(self, i),
 						ticks.dash,
 						ticks.dash,
 						ticks.cap
 						ticks.cap
 					);
 					);
@@ -3395,7 +3369,7 @@ var uPlot = (function () {
 						ori == 0 ? plotTop : plotLft,
 						ori == 0 ? plotTop : plotLft,
 						ori == 0 ? plotHgt : plotWid,
 						ori == 0 ? plotHgt : plotWid,
 						roundDec(grid.width * pxRatio, 3),
 						roundDec(grid.width * pxRatio, 3),
-						grid.stroke,
+						grid.stroke(self, i),
 						grid.dash,
 						grid.dash,
 						grid.cap
 						grid.cap
 					);
 					);

File diff suppressed because it is too large
+ 2 - 2
plugins/uplot/uPlot.iife.min.js