Remove keymaps and html files from codemirror
authorTim Düsterhus <duesterhus@woltlab.com>
Wed, 5 Jun 2013 16:30:30 +0000 (18:30 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Wed, 5 Jun 2013 16:30:30 +0000 (18:30 +0200)
17 files changed:
wcfsetup/install/files/js/3rdParty/codemirror/keymap/emacs.js [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/keymap/vim.js [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/scala.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/coffeescript/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/css/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/css/scss.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlembedded/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlmixed/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/typescript.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/less/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/php/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/shell/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/smarty/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/sql/index.html [deleted file]
wcfsetup/install/files/js/3rdParty/codemirror/mode/xml/index.html [deleted file]

diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/keymap/emacs.js b/wcfsetup/install/files/js/3rdParty/codemirror/keymap/emacs.js
deleted file mode 100644 (file)
index fab3ab9..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// TODO number prefixes
-(function() {
-  // Really primitive kill-ring implementation.
-  var killRing = [];
-  function addToRing(str) {
-    killRing.push(str);
-    if (killRing.length > 50) killRing.shift();
-  }
-  function getFromRing() { return killRing[killRing.length - 1] || ""; }
-  function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }
-
-  CodeMirror.keyMap.emacs = {
-    "Ctrl-X": function(cm) {cm.setOption("keyMap", "emacs-Ctrl-X");},
-    "Ctrl-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
-    "Ctrl-Alt-W": function(cm) {addToRing(cm.getSelection()); cm.replaceSelection("");},
-    "Alt-W": function(cm) {addToRing(cm.getSelection());},
-    "Ctrl-Y": function(cm) {cm.replaceSelection(getFromRing());},
-    "Alt-Y": function(cm) {cm.replaceSelection(popFromRing());},
-    "Ctrl-/": "undo", "Shift-Ctrl--": "undo", "Shift-Alt-,": "goDocStart", "Shift-Alt-.": "goDocEnd",
-    "Ctrl-S": "findNext", "Ctrl-R": "findPrev", "Ctrl-G": "clearSearch", "Shift-Alt-5": "replace",
-    "Ctrl-Z": "undo", "Cmd-Z": "undo", "Alt-/": "autocomplete", "Alt-V": "goPageUp",
-    "Ctrl-J": "newlineAndIndent", "Enter": false, "Tab": "indentAuto",
-    fallthrough: ["basic", "emacsy"]
-  };
-
-  CodeMirror.keyMap["emacs-Ctrl-X"] = {
-    "Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": "undo", "K": "close",
-    auto: "emacs", nofallthrough: true
-  };
-})();
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/keymap/vim.js b/wcfsetup/install/files/js/3rdParty/codemirror/keymap/vim.js
deleted file mode 100644 (file)
index 42e6eca..0000000
+++ /dev/null
@@ -1,3308 +0,0 @@
-/**
- * Supported keybindings:
- *
- *   Motion:
- *   h, j, k, l
- *   gj, gk
- *   e, E, w, W, b, B, ge, gE
- *   f<character>, F<character>, t<character>, T<character>
- *   $, ^, 0, -, +, _
- *   gg, G
- *   %
- *   '<character>, `<character>
- *
- *   Operator:
- *   d, y, c
- *   dd, yy, cc
- *   g~, g~g~
- *   >, <, >>, <<
- *
- *   Operator-Motion:
- *   x, X, D, Y, C, ~
- *
- *   Action:
- *   a, i, s, A, I, S, o, O
- *   zz, z., z<CR>, zt, zb, z-
- *   J
- *   u, Ctrl-r
- *   m<character>
- *   r<character>
- *
- *   Modes:
- *   ESC - leave insert mode, visual mode, and clear input state.
- *   Ctrl-[, Ctrl-c - same as ESC.
- *
- * Registers: unamed, -, a-z, A-Z, 0-9
- *   (Does not respect the special case for number registers when delete
- *    operator is made with these commands: %, (, ),  , /, ?, n, N, {, } )
- *   TODO: Implement the remaining registers.
- * Marks: a-z, A-Z, and 0-9
- *   TODO: Implement the remaining special marks. They have more complex
- *       behavior.
- *
- * Code structure:
- *  1. Default keymap
- *  2. Variable declarations and short basic helpers
- *  3. Instance (External API) implementation
- *  4. Internal state tracking objects (input state, counter) implementation
- *     and instanstiation
- *  5. Key handler (the main command dispatcher) implementation
- *  6. Motion, operator, and action implementations
- *  7. Helper functions for the key handler, motions, operators, and actions
- *  8. Set up Vim to work as a keymap for CodeMirror.
- */
-
-(function() {
-  'use strict';
-
-  var defaultKeymap = [
-    // Key to key mapping. This goes first to make it possible to override
-    // existing mappings.
-    { keys: ['<Left>'], type: 'keyToKey', toKeys: ['h'] },
-    { keys: ['<Right>'], type: 'keyToKey', toKeys: ['l'] },
-    { keys: ['<Up>'], type: 'keyToKey', toKeys: ['k'] },
-    { keys: ['<Down>'], type: 'keyToKey', toKeys: ['j'] },
-    { keys: ['<Space>'], type: 'keyToKey', toKeys: ['l'] },
-    { keys: ['<BS>'], type: 'keyToKey', toKeys: ['h'] },
-    { keys: ['<C-Space>'], type: 'keyToKey', toKeys: ['W'] },
-    { keys: ['<C-BS>'], type: 'keyToKey', toKeys: ['B'] },
-    { keys: ['<S-Space>'], type: 'keyToKey', toKeys: ['w'] },
-    { keys: ['<S-BS>'], type: 'keyToKey', toKeys: ['b'] },
-    { keys: ['<C-n>'], type: 'keyToKey', toKeys: ['j'] },
-    { keys: ['<C-p>'], type: 'keyToKey', toKeys: ['k'] },
-    { keys: ['C-['], type: 'keyToKey', toKeys: ['<Esc>'] },
-    { keys: ['<C-c>'], type: 'keyToKey', toKeys: ['<Esc>'] },
-    { keys: ['s'], type: 'keyToKey', toKeys: ['c', 'l'] },
-    { keys: ['S'], type: 'keyToKey', toKeys: ['c', 'c'] },
-    { keys: ['<Home>'], type: 'keyToKey', toKeys: ['0'] },
-    { keys: ['<End>'], type: 'keyToKey', toKeys: ['$'] },
-    { keys: ['<PageUp>'], type: 'keyToKey', toKeys: ['<C-b>'] },
-    { keys: ['<PageDown>'], type: 'keyToKey', toKeys: ['<C-f>'] },
-    // Motions
-    { keys: ['H'], type: 'motion',
-        motion: 'moveToTopLine',
-        motionArgs: { linewise: true, toJumplist: true }},
-    { keys: ['M'], type: 'motion',
-        motion: 'moveToMiddleLine',
-        motionArgs: { linewise: true, toJumplist: true }},
-    { keys: ['L'], type: 'motion',
-        motion: 'moveToBottomLine',
-        motionArgs: { linewise: true, toJumplist: true }},
-    { keys: ['h'], type: 'motion',
-        motion: 'moveByCharacters',
-        motionArgs: { forward: false }},
-    { keys: ['l'], type: 'motion',
-        motion: 'moveByCharacters',
-        motionArgs: { forward: true }},
-    { keys: ['j'], type: 'motion',
-        motion: 'moveByLines',
-        motionArgs: { forward: true, linewise: true }},
-    { keys: ['k'], type: 'motion',
-        motion: 'moveByLines',
-        motionArgs: { forward: false, linewise: true }},
-    { keys: ['g','j'], type: 'motion',
-        motion: 'moveByDisplayLines',
-        motionArgs: { forward: true }},
-    { keys: ['g','k'], type: 'motion',
-        motion: 'moveByDisplayLines',
-        motionArgs: { forward: false }},
-    { keys: ['w'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: true, wordEnd: false }},
-    { keys: ['W'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: true, wordEnd: false, bigWord: true }},
-    { keys: ['e'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: true, wordEnd: true, inclusive: true }},
-    { keys: ['E'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: true, wordEnd: true, bigWord: true,
-            inclusive: true }},
-    { keys: ['b'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: false, wordEnd: false }},
-    { keys: ['B'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: false, wordEnd: false, bigWord: true }},
-    { keys: ['g', 'e'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: false, wordEnd: true, inclusive: true }},
-    { keys: ['g', 'E'], type: 'motion',
-        motion: 'moveByWords',
-        motionArgs: { forward: false, wordEnd: true, bigWord: true,
-            inclusive: true }},
-    { keys: ['{'], type: 'motion', motion: 'moveByParagraph',
-        motionArgs: { forward: false, toJumplist: true }},
-    { keys: ['}'], type: 'motion', motion: 'moveByParagraph',
-        motionArgs: { forward: true, toJumplist: true }},
-    { keys: ['<C-f>'], type: 'motion',
-        motion: 'moveByPage', motionArgs: { forward: true }},
-    { keys: ['<C-b>'], type: 'motion',
-        motion: 'moveByPage', motionArgs: { forward: false }},
-    { keys: ['<C-d>'], type: 'motion',
-        motion: 'moveByScroll',
-        motionArgs: { forward: true, explicitRepeat: true }},
-    { keys: ['<C-u>'], type: 'motion',
-        motion: 'moveByScroll',
-        motionArgs: { forward: false, explicitRepeat: true }},
-    { keys: ['g', 'g'], type: 'motion',
-        motion: 'moveToLineOrEdgeOfDocument',
-        motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},
-    { keys: ['G'], type: 'motion',
-        motion: 'moveToLineOrEdgeOfDocument',
-        motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},
-    { keys: ['0'], type: 'motion', motion: 'moveToStartOfLine' },
-    { keys: ['^'], type: 'motion',
-        motion: 'moveToFirstNonWhiteSpaceCharacter' },
-    { keys: ['+'], type: 'motion',
-        motion: 'moveByLines',
-        motionArgs: { forward: true, toFirstChar:true }},
-    { keys: ['-'], type: 'motion',
-        motion: 'moveByLines',
-        motionArgs: { forward: false, toFirstChar:true }},
-    { keys: ['_'], type: 'motion',
-        motion: 'moveByLines',
-        motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},
-    { keys: ['$'], type: 'motion',
-        motion: 'moveToEol',
-        motionArgs: { inclusive: true }},
-    { keys: ['%'], type: 'motion',
-        motion: 'moveToMatchedSymbol',
-        motionArgs: { inclusive: true, toJumplist: true }},
-    { keys: ['f', 'character'], type: 'motion',
-        motion: 'moveToCharacter',
-        motionArgs: { forward: true , inclusive: true }},
-    { keys: ['F', 'character'], type: 'motion',
-        motion: 'moveToCharacter',
-        motionArgs: { forward: false }},
-    { keys: ['t', 'character'], type: 'motion',
-        motion: 'moveTillCharacter',
-        motionArgs: { forward: true, inclusive: true }},
-    { keys: ['T', 'character'], type: 'motion',
-        motion: 'moveTillCharacter',
-        motionArgs: { forward: false }},
-    { keys: [';'], type: 'motion', motion: 'repeatLastCharacterSearch',
-        motionArgs: { forward: true }},
-    { keys: [','], type: 'motion', motion: 'repeatLastCharacterSearch',
-        motionArgs: { forward: false }},
-    { keys: ['\'', 'character'], type: 'motion', motion: 'goToMark',
-        motionArgs: {toJumplist: true}},
-    { keys: ['`', 'character'], type: 'motion', motion: 'goToMark',
-        motionArgs: {toJumplist: true}},
-    { keys: [']', '`',], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },
-    { keys: ['[', '`',], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },
-    { keys: [']', '\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },
-    { keys: ['[', '\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },
-    { keys: [']', 'character'], type: 'motion',
-        motion: 'moveToSymbol',
-        motionArgs: { forward: true, toJumplist: true}},
-    { keys: ['[', 'character'], type: 'motion',
-        motion: 'moveToSymbol',
-        motionArgs: { forward: false, toJumplist: true}},
-    { keys: ['|'], type: 'motion',
-        motion: 'moveToColumn',
-        motionArgs: { }},
-    // Operators
-    { keys: ['d'], type: 'operator', operator: 'delete' },
-    { keys: ['y'], type: 'operator', operator: 'yank' },
-    { keys: ['c'], type: 'operator', operator: 'change',
-        operatorArgs: { enterInsertMode: true } },
-    { keys: ['>'], type: 'operator', operator: 'indent',
-        operatorArgs: { indentRight: true }},
-    { keys: ['<'], type: 'operator', operator: 'indent',
-        operatorArgs: { indentRight: false }},
-    { keys: ['g', '~'], type: 'operator', operator: 'swapcase' },
-    { keys: ['n'], type: 'motion', motion: 'findNext',
-        motionArgs: { forward: true, toJumplist: true }},
-    { keys: ['N'], type: 'motion', motion: 'findNext',
-        motionArgs: { forward: false, toJumplist: true }},
-    // Operator-Motion dual commands
-    { keys: ['x'], type: 'operatorMotion', operator: 'delete',
-        motion: 'moveByCharacters', motionArgs: { forward: true },
-        operatorMotionArgs: { visualLine: false }},
-    { keys: ['X'], type: 'operatorMotion', operator: 'delete',
-        motion: 'moveByCharacters', motionArgs: { forward: false },
-        operatorMotionArgs: { visualLine: true }},
-    { keys: ['D'], type: 'operatorMotion', operator: 'delete',
-      motion: 'moveToEol', motionArgs: { inclusive: true },
-        operatorMotionArgs: { visualLine: true }},
-    { keys: ['Y'], type: 'operatorMotion', operator: 'yank',
-        motion: 'moveToEol', motionArgs: { inclusive: true },
-        operatorMotionArgs: { visualLine: true }},
-    { keys: ['C'], type: 'operatorMotion',
-        operator: 'change', operatorArgs: { enterInsertMode: true },
-        motion: 'moveToEol', motionArgs: { inclusive: true },
-        operatorMotionArgs: { visualLine: true }},
-    { keys: ['~'], type: 'operatorMotion', operator: 'swapcase',
-        motion: 'moveByCharacters', motionArgs: { forward: true }},
-    // Actions
-    { keys: ['<C-i>'], type: 'action', action: 'jumpListWalk',
-        actionArgs: { forward: true }},
-    { keys: ['<C-o>'], type: 'action', action: 'jumpListWalk',
-        actionArgs: { forward: false }},
-    { keys: ['a'], type: 'action', action: 'enterInsertMode',
-        actionArgs: { insertAt: 'charAfter' }},
-    { keys: ['A'], type: 'action', action: 'enterInsertMode',
-        actionArgs: { insertAt: 'eol' }},
-    { keys: ['i'], type: 'action', action: 'enterInsertMode',
-        actionArgs: { insertAt: 'inplace' }},
-    { keys: ['I'], type: 'action', action: 'enterInsertMode',
-        actionArgs: { insertAt: 'firstNonBlank' }},
-    { keys: ['o'], type: 'action', action: 'newLineAndEnterInsertMode',
-        actionArgs: { after: true }},
-    { keys: ['O'], type: 'action', action: 'newLineAndEnterInsertMode',
-        actionArgs: { after: false }},
-    { keys: ['v'], type: 'action', action: 'toggleVisualMode' },
-    { keys: ['V'], type: 'action', action: 'toggleVisualMode',
-        actionArgs: { linewise: true }},
-    { keys: ['J'], type: 'action', action: 'joinLines' },
-    { keys: ['p'], type: 'action', action: 'paste',
-        actionArgs: { after: true }},
-    { keys: ['P'], type: 'action', action: 'paste',
-        actionArgs: { after: false }},
-    { keys: ['r', 'character'], type: 'action', action: 'replace' },
-    { keys: ['@', 'character'], type: 'action', action: 'replayMacro' },
-    { keys: ['q', 'character'], type: 'action', action: 'enterMacroRecordMode' },
-    { keys: ['R'], type: 'action', action: 'enterReplaceMode' },
-    { keys: ['u'], type: 'action', action: 'undo' },
-    { keys: ['<C-r>'], type: 'action', action: 'redo' },
-    { keys: ['m', 'character'], type: 'action', action: 'setMark' },
-    { keys: ['\"', 'character'], type: 'action', action: 'setRegister' },
-    { keys: ['z', 'z'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'center' }},
-    { keys: ['z', '.'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'center' },
-        motion: 'moveToFirstNonWhiteSpaceCharacter' },
-    { keys: ['z', 't'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'top' }},
-    { keys: ['z', '<CR>'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'top' },
-        motion: 'moveToFirstNonWhiteSpaceCharacter' },
-    { keys: ['z', '-'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'bottom' }},
-    { keys: ['z', 'b'], type: 'action', action: 'scrollToCursor',
-        actionArgs: { position: 'bottom' },
-        motion: 'moveToFirstNonWhiteSpaceCharacter' },
-    { keys: ['.'], type: 'action', action: 'repeatLastEdit' },
-    { keys: ['<C-a>'], type: 'action', action: 'incrementNumberToken',
-        actionArgs: {increase: true, backtrack: false}},
-    { keys: ['<C-x>'], type: 'action', action: 'incrementNumberToken',
-        actionArgs: {increase: false, backtrack: false}},
-    // Text object motions
-    { keys: ['a', 'character'], type: 'motion',
-        motion: 'textObjectManipulation' },
-    { keys: ['i', 'character'], type: 'motion',
-        motion: 'textObjectManipulation',
-        motionArgs: { textObjectInner: true }},
-    // Search
-    { keys: ['/'], type: 'search',
-        searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},
-    { keys: ['?'], type: 'search',
-        searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},
-    { keys: ['*'], type: 'search',
-        searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},
-    { keys: ['#'], type: 'search',
-        searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},
-    // Ex command
-    { keys: [':'], type: 'ex' }
-  ];
-
-  var Vim = function() {
-    var alphabetRegex = /[A-Za-z]/;
-    var numberRegex = /[\d]/;
-    var whiteSpaceRegex = /\s/;
-    var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)];
-    function makeKeyRange(start, size) {
-      var keys = [];
-      for (var i = start; i < start + size; i++) {
-        keys.push(String.fromCharCode(i));
-      }
-      return keys;
-    }
-    var upperCaseAlphabet = makeKeyRange(65, 26);
-    var lowerCaseAlphabet = makeKeyRange(97, 26);
-    var numbers = makeKeyRange(48, 10);
-    var SPECIAL_SYMBOLS = '~`!@#$%^&*()_-+=[{}]\\|/?.,<>:;\"\'';
-    var specialSymbols = SPECIAL_SYMBOLS.split('');
-    var specialKeys = ['Left', 'Right', 'Up', 'Down', 'Space', 'Backspace',
-        'Esc', 'Home', 'End', 'PageUp', 'PageDown', 'Enter'];
-    var validMarks = upperCaseAlphabet.concat(lowerCaseAlphabet).concat(
-        numbers).concat(['<', '>']);
-    var validRegisters = upperCaseAlphabet.concat(lowerCaseAlphabet).concat(
-        numbers).concat('-\"'.split(''));
-
-    function isAlphabet(k) {
-      return alphabetRegex.test(k);
-    }
-    function isLine(cm, line) {
-      return line >= cm.firstLine() && line <= cm.lastLine();
-    }
-    function isLowerCase(k) {
-      return (/^[a-z]$/).test(k);
-    }
-    function isMatchableSymbol(k) {
-      return '()[]{}'.indexOf(k) != -1;
-    }
-    function isNumber(k) {
-      return numberRegex.test(k);
-    }
-    function isUpperCase(k) {
-      return (/^[A-Z]$/).test(k);
-    }
-    function isAlphanumeric(k) {
-      return (/^[\w]$/).test(k);
-    }
-    function isWhiteSpace(k) {
-      return whiteSpaceRegex.test(k);
-    }
-    function isWhiteSpaceString(k) {
-      return (/^\s*$/).test(k);
-    }
-    function inRangeInclusive(x, start, end) {
-      return x >= start && x <= end;
-    }
-    function inArray(val, arr) {
-      for (var i = 0; i < arr.length; i++) {
-        if (arr[i] == val) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    var createCircularJumpList = function() {
-      var size = 100;
-      var pointer = -1;
-      var head = 0;
-      var tail = 0;
-      var buffer = new Array(size);
-      function add(cm, oldCur, newCur) {
-        var current = pointer % size;
-        var curMark = buffer[current];
-        function useNextSlot(cursor) {
-          var next = ++pointer % size;
-          var trashMark = buffer[next];
-          if (trashMark) {
-            trashMark.clear();
-          }
-          buffer[next] = cm.setBookmark(cursor);
-        }
-        if (curMark) {
-          var markPos = curMark.find();
-          // avoid recording redundant cursor position
-          if (markPos && !cursorEqual(markPos, oldCur)) {
-            useNextSlot(oldCur);
-          }
-        } else {
-          useNextSlot(oldCur);
-        }
-        useNextSlot(newCur);
-        head = pointer;
-        tail = pointer - size + 1;
-        if (tail < 0) {
-          tail = 0;
-        }
-      }
-      function move(cm, offset) {
-        pointer += offset;
-        if (pointer > head) {
-          pointer = head;
-        } else if (pointer < tail) {
-          pointer = tail;
-        }
-        var mark = buffer[(size + pointer) % size];
-        // skip marks that are temporarily removed from text buffer
-        if (mark && !mark.find()) {
-          var inc = offset > 0 ? 1 : -1;
-          var newCur;
-          var oldCur = cm.getCursor();
-          do {
-            pointer += inc;
-            mark = buffer[(size + pointer) % size];
-            // skip marks that are the same as current position
-            if (mark &&
-                (newCur = mark.find()) &&
-                !cursorEqual(oldCur, newCur)) {
-              break;
-            }
-          } while (pointer < head && pointer > tail);
-        }
-        return mark;
-      }
-      return {
-        cachedCursor: undefined, //used for # and * jumps
-        add: add,
-        move: move
-      };
-    };
-
-    var createMacroState = function() {
-      return {
-        macroKeyBuffer: [],
-        latestRegister: undefined,
-        enteredMacroMode: undefined,
-        isMacroPlaying: false,
-        toggle: function(cm, registerName) {
-          if (this.enteredMacroMode) { //onExit
-            this.enteredMacroMode(); // close dialog
-            this.enteredMacroMode = undefined;
-          } else { //onEnter
-            this.latestRegister = registerName;
-            this.enteredMacroMode = cm.openDialog(
-              '(recording)['+registerName+']', null, {bottom:true});
-          }
-        }
-      }
-    }
-
-    // Global Vim state. Call getVimGlobalState to get and initialize.
-    var vimGlobalState;
-    function getVimGlobalState() {
-      if (!vimGlobalState) {
-        vimGlobalState = {
-          // The current search query.
-          searchQuery: null,
-          // Whether we are searching backwards.
-          searchIsReversed: false,
-          jumpList: createCircularJumpList(),
-          macroModeState: createMacroState(),
-          // Recording latest f, t, F or T motion command.
-          lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
-          registerController: new RegisterController({})
-        };
-      }
-      return vimGlobalState;
-    }
-    function getVimState(cm) {
-      if (!cm.vimState) {
-        // Store instance state in the CodeMirror object.
-        cm.vimState = {
-          inputState: new InputState(),
-          // When using jk for navigation, if you move from a longer line to a
-          // shorter line, the cursor may clip to the end of the shorter line.
-          // If j is pressed again and cursor goes to the next line, the
-          // cursor should go back to its horizontal position on the longer
-          // line if it can. This is to keep track of the horizontal position.
-          lastHPos: -1,
-          // Doing the same with screen-position for gj/gk
-          lastHSPos: -1,
-          // The last motion command run. Cleared if a non-motion command gets
-          // executed in between.
-          lastMotion: null,
-          marks: {},
-          visualMode: false,
-          // If we are in visual line mode. No effect if visualMode is false.
-          visualLine: false
-        };
-      }
-      return cm.vimState;
-    }
-
-    var vimApi= {
-      buildKeyMap: function() {
-        // TODO: Convert keymap into dictionary format for fast lookup.
-      },
-      // Testing hook, though it might be useful to expose the register
-      // controller anyways.
-      getRegisterController: function() {
-        return getVimGlobalState().registerController;
-      },
-      // Testing hook.
-      clearVimGlobalState_: function() {
-        vimGlobalState = null;
-      },
-      map: function(lhs, rhs) {
-        // Add user defined key bindings.
-        exCommandDispatcher.map(lhs, rhs);
-      },
-      defineEx: function(name, prefix, func){
-        if (name.indexOf(prefix) === 0) {
-          exCommands[name]=func;
-          exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};
-        }else throw new Error("(Vim.defineEx) \""+prefix+"\" is not a prefix of \""+name+"\", command not registered");
-      },
-      // Initializes vim state variable on the CodeMirror object. Should only be
-      // called lazily by handleKey or for testing.
-      maybeInitState: function(cm) {
-        getVimState(cm);
-      },
-      // This is the outermost function called by CodeMirror, after keys have
-      // been mapped to their Vim equivalents.
-      handleKey: function(cm, key) {
-        var command;
-        var vim = getVimState(cm);
-        var macroModeState = getVimGlobalState().macroModeState;
-        if (macroModeState.enteredMacroMode) {
-          if (key == 'q') {
-            actions.exitMacroRecordMode();
-            return;
-          }
-          logKey(macroModeState, key);
-        }
-        if (key == '<Esc>') {
-          // Clear input state and get back to normal mode.
-          vim.inputState = new InputState();
-          if (vim.visualMode) {
-            exitVisualMode(cm, vim);
-          }
-          return;
-        }
-        if (vim.visualMode &&
-            cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
-          // The selection was cleared. Exit visual mode.
-          exitVisualMode(cm, vim);
-        }
-        if (!vim.visualMode &&
-            !cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
-          vim.visualMode = true;
-          vim.visualLine = false;
-        }
-        if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) {
-          // Have to special case 0 since it's both a motion and a number.
-          command = commandDispatcher.matchCommand(key, defaultKeymap, vim);
-        }
-        if (!command) {
-          if (isNumber(key)) {
-            // Increment count unless count is 0 and key is 0.
-            vim.inputState.pushRepeatDigit(key);
-          }
-          return;
-        }
-        if (command.type == 'keyToKey') {
-          // TODO: prevent infinite recursion.
-          for (var i = 0; i < command.toKeys.length; i++) {
-            this.handleKey(cm, command.toKeys[i]);
-          }
-        } else {
-          commandDispatcher.processCommand(cm, vim, command);
-        }
-      }
-    };
-
-    // Represents the current input state.
-    function InputState() {
-      this.prefixRepeat = [];
-      this.motionRepeat = [];
-
-      this.operator = null;
-      this.operatorArgs = null;
-      this.motion = null;
-      this.motionArgs = null;
-      this.keyBuffer = []; // For matching multi-key commands.
-      this.registerName = null; // Defaults to the unamed register.
-    }
-    InputState.prototype.pushRepeatDigit = function(n) {
-      if (!this.operator) {
-        this.prefixRepeat = this.prefixRepeat.concat(n);
-      } else {
-        this.motionRepeat = this.motionRepeat.concat(n);
-      }
-    };
-    InputState.prototype.getRepeat = function() {
-      var repeat = 0;
-      if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {
-        repeat = 1;
-        if (this.prefixRepeat.length > 0) {
-          repeat *= parseInt(this.prefixRepeat.join(''), 10);
-        }
-        if (this.motionRepeat.length > 0) {
-          repeat *= parseInt(this.motionRepeat.join(''), 10);
-        }
-      }
-      return repeat;
-    };
-
-    /*
-     * Register stores information about copy and paste registers.  Besides
-     * text, a register must store whether it is linewise (i.e., when it is
-     * pasted, should it insert itself into a new line, or should the text be
-     * inserted at the cursor position.)
-     */
-    function Register(text, linewise) {
-      this.clear();
-      if (text) {
-        this.set(text, linewise);
-      }
-    }
-    Register.prototype = {
-      set: function(text, linewise) {
-        this.text = text;
-        this.linewise = !!linewise;
-      },
-      append: function(text, linewise) {
-        // if this register has ever been set to linewise, use linewise.
-        if (linewise || this.linewise) {
-          this.text += '\n' + text;
-          this.linewise = true;
-        } else {
-          this.text += text;
-        }
-      },
-      clear: function() {
-        this.text = '';
-        this.linewise = false;
-      },
-      toString: function() { return this.text; }
-    };
-
-    /*
-     * vim registers allow you to keep many independent copy and paste buffers.
-     * See http://usevim.com/2012/04/13/registers/ for an introduction.
-     *
-     * RegisterController keeps the state of all the registers.  An initial
-     * state may be passed in.  The unnamed register '"' will always be
-     * overridden.
-     */
-    function RegisterController(registers) {
-      this.registers = registers;
-      this.unamedRegister = registers['\"'] = new Register();
-    }
-    RegisterController.prototype = {
-      pushText: function(registerName, operator, text, linewise) {
-        // Lowercase and uppercase registers refer to the same register.
-        // Uppercase just means append.
-        var register = this.isValidRegister(registerName) ?
-            this.getRegister(registerName) : null;
-        // if no register/an invalid register was specified, things go to the
-        // default registers
-        if (!register) {
-          switch (operator) {
-            case 'yank':
-              // The 0 register contains the text from the most recent yank.
-              this.registers['0'] = new Register(text, linewise);
-              break;
-            case 'delete':
-            case 'change':
-              if (text.indexOf('\n') == -1) {
-                // Delete less than 1 line. Update the small delete register.
-                this.registers['-'] = new Register(text, linewise);
-              } else {
-                // Shift down the contents of the numbered registers and put the
-                // deleted text into register 1.
-                this.shiftNumericRegisters_();
-                this.registers['1'] = new Register(text, linewise);
-              }
-              break;
-          }
-          // Make sure the unnamed register is set to what just happened
-          this.unamedRegister.set(text, linewise);
-          return;
-        }
-
-        // If we've gotten to this point, we've actually specified a register
-        var append = isUpperCase(registerName);
-        if (append) {
-          register.append(text, linewise);
-          // The unamed register always has the same value as the last used
-          // register.
-          this.unamedRegister.append(text, linewise);
-        } else {
-          register.set(text, linewise);
-          this.unamedRegister.set(text, linewise);
-        }
-      },
-      setRegisterText: function(name, text, linewise) {
-        this.getRegister(name).set(text, linewise);
-      },
-      // Gets the register named @name.  If one of @name doesn't already exist,
-      // create it.  If @name is invalid, return the unamedRegister.
-      getRegister: function(name) {
-        if (!this.isValidRegister(name)) {
-          return this.unamedRegister;
-        }
-        name = name.toLowerCase();
-        if (!this.registers[name]) {
-          this.registers[name] = new Register();
-        }
-        return this.registers[name];
-      },
-      isValidRegister: function(name) {
-        return name && inArray(name, validRegisters);
-      },
-      shiftNumericRegisters_: function() {
-        for (var i = 9; i >= 2; i--) {
-          this.registers[i] = this.getRegister('' + (i - 1));
-        }
-      }
-    };
-
-    var commandDispatcher = {
-      matchCommand: function(key, keyMap, vim) {
-        var inputState = vim.inputState;
-        var keys = inputState.keyBuffer.concat(key);
-        for (var i = 0; i < keyMap.length; i++) {
-          var command = keyMap[i];
-          if (matchKeysPartial(keys, command.keys)) {
-            if (keys.length < command.keys.length) {
-              // Matches part of a multi-key command. Buffer and wait for next
-              // stroke.
-              inputState.keyBuffer.push(key);
-              return null;
-            } else {
-              if (inputState.operator && command.type == 'action') {
-                // Ignore matched action commands after an operator. Operators
-                // only operate on motions. This check is really for text
-                // objects since aW, a[ etcs conflicts with a.
-                continue;
-              }
-              // Matches whole comand. Return the command.
-              if (command.keys[keys.length - 1] == 'character') {
-                inputState.selectedCharacter = keys[keys.length - 1];
-                if(inputState.selectedCharacter.length>1){
-                  switch(inputState.selectedCharacter){
-                    case "<CR>":
-                      inputState.selectedCharacter='\n';
-                      break;
-                    case "<Space>":
-                      inputState.selectedCharacter=' ';
-                      break;
-                    default:
-                      continue;
-                  }
-                }
-              }
-              inputState.keyBuffer = [];
-              return command;
-            }
-          }
-        }
-        // Clear the buffer since there are no partial matches.
-        inputState.keyBuffer = [];
-        return null;
-      },
-      processCommand: function(cm, vim, command) {
-        vim.inputState.repeatOverride = command.repeatOverride;
-        switch (command.type) {
-          case 'motion':
-            this.processMotion(cm, vim, command);
-            break;
-          case 'operator':
-            this.processOperator(cm, vim, command);
-            break;
-          case 'operatorMotion':
-            this.processOperatorMotion(cm, vim, command);
-            break;
-          case 'action':
-            this.processAction(cm, vim, command);
-            break;
-          case 'search':
-            this.processSearch(cm, vim, command);
-            break;
-          case 'ex':
-          case 'keyToEx':
-            this.processEx(cm, vim, command);
-            break;
-          default:
-            break;
-        }
-      },
-      processMotion: function(cm, vim, command) {
-        vim.inputState.motion = command.motion;
-        vim.inputState.motionArgs = copyArgs(command.motionArgs);
-        this.evalInput(cm, vim);
-      },
-      processOperator: function(cm, vim, command) {
-        var inputState = vim.inputState;
-        if (inputState.operator) {
-          if (inputState.operator == command.operator) {
-            // Typing an operator twice like 'dd' makes the operator operate
-            // linewise
-            inputState.motion = 'expandToLine';
-            inputState.motionArgs = { linewise: true };
-            this.evalInput(cm, vim);
-            return;
-          } else {
-            // 2 different operators in a row doesn't make sense.
-            vim.inputState = new InputState();
-          }
-        }
-        inputState.operator = command.operator;
-        inputState.operatorArgs = copyArgs(command.operatorArgs);
-        if (vim.visualMode) {
-          // Operating on a selection in visual mode. We don't need a motion.
-          this.evalInput(cm, vim);
-        }
-      },
-      processOperatorMotion: function(cm, vim, command) {
-        var visualMode = vim.visualMode;
-        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);
-        if (operatorMotionArgs) {
-          // Operator motions may have special behavior in visual mode.
-          if (visualMode && operatorMotionArgs.visualLine) {
-            vim.visualLine = true;
-          }
-        }
-        this.processOperator(cm, vim, command);
-        if (!visualMode) {
-          this.processMotion(cm, vim, command);
-        }
-      },
-      processAction: function(cm, vim, command) {
-        var inputState = vim.inputState;
-        var repeat = inputState.getRepeat();
-        var repeatIsExplicit = !!repeat;
-        var actionArgs = copyArgs(command.actionArgs) || {};
-        if (inputState.selectedCharacter) {
-          actionArgs.selectedCharacter = inputState.selectedCharacter;
-        }
-        // Actions may or may not have motions and operators. Do these first.
-        if (command.operator) {
-          this.processOperator(cm, vim, command);
-        }
-        if (command.motion) {
-          this.processMotion(cm, vim, command);
-        }
-        if (command.motion || command.operator) {
-          this.evalInput(cm, vim);
-        }
-        actionArgs.repeat = repeat || 1;
-        actionArgs.repeatIsExplicit = repeatIsExplicit;
-        actionArgs.registerName = inputState.registerName;
-        vim.inputState = new InputState();
-        vim.lastMotion = null,
-        actions[command.action](cm, actionArgs, vim);
-      },
-      processSearch: function(cm, vim, command) {
-        if (!cm.getSearchCursor) {
-          // Search depends on SearchCursor.
-          return;
-        }
-        var forward = command.searchArgs.forward;
-        getSearchState(cm).setReversed(!forward);
-        var promptPrefix = (forward) ? '/' : '?';
-        var originalQuery = getSearchState(cm).getQuery();
-        var originalScrollPos = cm.getScrollInfo();
-        function handleQuery(query, ignoreCase, smartCase) {
-          try {
-            updateSearchQuery(cm, query, ignoreCase, smartCase);
-          } catch (e) {
-            showConfirm(cm, 'Invalid regex: ' + query);
-            return;
-          }
-          commandDispatcher.processMotion(cm, vim, {
-            type: 'motion',
-            motion: 'findNext',
-            motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }
-          });
-        }
-        function onPromptClose(query) {
-          cm.scrollTo(originalScrollPos.left, originalScrollPos.top);
-          handleQuery(query, true /** ignoreCase */, true /** smartCase */);
-        }
-        function onPromptKeyUp(e, query) {
-          var parsedQuery;
-          try {
-            parsedQuery = updateSearchQuery(cm, query,
-                true /** ignoreCase */, true /** smartCase */)
-          } catch (e) {
-            // Swallow bad regexes for incremental search.
-          }
-          if (parsedQuery) {
-            cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);
-          } else {
-            clearSearchHighlight(cm);
-            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);
-          }
-        }
-        function onPromptKeyDown(e, query, close) {
-          var keyName = CodeMirror.keyName(e);
-          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {
-            updateSearchQuery(cm, originalQuery);
-            clearSearchHighlight(cm);
-            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);
-
-            CodeMirror.e_stop(e);
-            close();
-            cm.focus();
-          }
-        }
-        switch (command.searchArgs.querySrc) {
-          case 'prompt':
-            showPrompt(cm, {
-                onClose: onPromptClose,
-                prefix: promptPrefix,
-                desc: searchPromptDesc,
-                onKeyUp: onPromptKeyUp,
-                onKeyDown: onPromptKeyDown
-            });
-            break;
-          case 'wordUnderCursor':
-            var word = expandWordUnderCursor(cm, false /** inclusive */,
-                true /** forward */, false /** bigWord */,
-                true /** noSymbol */);
-            var isKeyword = true;
-            if (!word) {
-              word = expandWordUnderCursor(cm, false /** inclusive */,
-                  true /** forward */, false /** bigWord */,
-                  false /** noSymbol */);
-              isKeyword = false;
-            }
-            if (!word) {
-              return;
-            }
-            var query = cm.getLine(word.start.line).substring(word.start.ch,
-                word.end.ch);
-            if (isKeyword) {
-              query = '\\b' + query + '\\b';
-            } else {
-              query = escapeRegex(query);
-            }
-
-            // cachedCursor is used to save the old position of the cursor
-            // when * or # causes vim to seek for the nearest word and shift
-            // the cursor before entering the motion.
-            getVimGlobalState().jumpList.cachedCursor = cm.getCursor();
-            cm.setCursor(word.start);
-
-            handleQuery(query, true /** ignoreCase */, false /** smartCase */);
-            break;
-        }
-      },
-      processEx: function(cm, vim, command) {
-        function onPromptClose(input) {
-          exCommandDispatcher.processCommand(cm, input);
-        }
-        function onPromptKeyDown(e, input, close) {
-          var keyName = CodeMirror.keyName(e);
-          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {
-            CodeMirror.e_stop(e);
-            close();
-            cm.focus();
-          }
-        }
-        if (command.type == 'keyToEx') {
-          // Handle user defined Ex to Ex mappings
-          exCommandDispatcher.processCommand(cm, command.exArgs.input);
-        } else {
-          if (vim.visualMode) {
-            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>',
-                onKeyDown: onPromptKeyDown});
-          } else {
-            showPrompt(cm, { onClose: onPromptClose, prefix: ':',
-                onKeyDown: onPromptKeyDown});
-          }
-        }
-      },
-      evalInput: function(cm, vim) {
-        // If the motion comand is set, execute both the operator and motion.
-        // Otherwise return.
-        var inputState = vim.inputState;
-        var motion = inputState.motion;
-        var motionArgs = inputState.motionArgs || {};
-        var operator = inputState.operator;
-        var operatorArgs = inputState.operatorArgs || {};
-        var registerName = inputState.registerName;
-        var selectionEnd = cm.getCursor('head');
-        var selectionStart = cm.getCursor('anchor');
-        // The difference between cur and selection cursors are that cur is
-        // being operated on and ignores that there is a selection.
-        var curStart = copyCursor(selectionEnd);
-        var curOriginal = copyCursor(curStart);
-        var curEnd;
-        var repeat;
-        if (operator) {
-          this.recordLastEdit(cm, vim, inputState);
-        }
-        if (inputState.repeatOverride !== undefined) {
-          // If repeatOverride is specified, that takes precedence over the
-          // input state's repeat. Used by Ex mode and can be user defined.
-          repeat = inputState.repeatOverride;
-        } else {
-          repeat = inputState.getRepeat();
-        }
-        if (repeat > 0 && motionArgs.explicitRepeat) {
-          motionArgs.repeatIsExplicit = true;
-        } else if (motionArgs.noRepeat ||
-            (!motionArgs.explicitRepeat && repeat === 0)) {
-          repeat = 1;
-          motionArgs.repeatIsExplicit = false;
-        }
-        if (inputState.selectedCharacter) {
-          // If there is a character input, stick it in all of the arg arrays.
-          motionArgs.selectedCharacter = operatorArgs.selectedCharacter =
-              inputState.selectedCharacter;
-        }
-        motionArgs.repeat = repeat;
-        vim.inputState = new InputState();
-        if (motion) {
-          var motionResult = motions[motion](cm, motionArgs, vim);
-          vim.lastMotion = motions[motion];
-          if (!motionResult) {
-            return;
-          }
-          if (motionArgs.toJumplist) {
-            var jumpList = getVimGlobalState().jumpList;
-            // if the current motion is # or *, use cachedCursor
-            var cachedCursor = jumpList.cachedCursor;
-            if (cachedCursor) {
-              recordJumpPosition(cm, cachedCursor, motionResult);
-              delete jumpList.cachedCursor;
-            } else {
-              recordJumpPosition(cm, curOriginal, motionResult);
-            }
-          }
-          if (motionResult instanceof Array) {
-            curStart = motionResult[0];
-            curEnd = motionResult[1];
-          } else {
-            curEnd = motionResult;
-          }
-          // TODO: Handle null returns from motion commands better.
-          if (!curEnd) {
-            curEnd = { ch: curStart.ch, line: curStart.line };
-          }
-          if (vim.visualMode) {
-            // Check if the selection crossed over itself. Will need to shift
-            // the start point if that happened.
-            if (cursorIsBefore(selectionStart, selectionEnd) &&
-                (cursorEqual(selectionStart, curEnd) ||
-                    cursorIsBefore(curEnd, selectionStart))) {
-              // The end of the selection has moved from after the start to
-              // before the start. We will shift the start right by 1.
-              selectionStart.ch += 1;
-            } else if (cursorIsBefore(selectionEnd, selectionStart) &&
-                (cursorEqual(selectionStart, curEnd) ||
-                    cursorIsBefore(selectionStart, curEnd))) {
-              // The opposite happened. We will shift the start left by 1.
-              selectionStart.ch -= 1;
-            }
-            selectionEnd = curEnd;
-            if (vim.visualLine) {
-              if (cursorIsBefore(selectionStart, selectionEnd)) {
-                selectionStart.ch = 0;
-                selectionEnd.ch = lineLength(cm, selectionEnd.line);
-              } else {
-                selectionEnd.ch = 0;
-                selectionStart.ch = lineLength(cm, selectionStart.line);
-              }
-            }
-            cm.setSelection(selectionStart, selectionEnd);
-            updateMark(cm, vim, '<',
-                cursorIsBefore(selectionStart, selectionEnd) ? selectionStart
-                    : selectionEnd);
-            updateMark(cm, vim, '>',
-                cursorIsBefore(selectionStart, selectionEnd) ? selectionEnd
-                    : selectionStart);
-          } else if (!operator) {
-            curEnd = clipCursorToContent(cm, curEnd);
-            cm.setCursor(curEnd.line, curEnd.ch);
-          }
-        }
-
-        if (operator) {
-          var inverted = false;
-          vim.lastMotion = null;
-          operatorArgs.repeat = repeat; // Indent in visual mode needs this.
-          if (vim.visualMode) {
-            curStart = selectionStart;
-            curEnd = selectionEnd;
-            motionArgs.inclusive = true;
-          }
-          // Swap start and end if motion was backward.
-          if (cursorIsBefore(curEnd, curStart)) {
-            var tmp = curStart;
-            curStart = curEnd;
-            curEnd = tmp;
-            inverted = true;
-          }
-          if (motionArgs.inclusive && !(vim.visualMode && inverted)) {
-            // Move the selection end one to the right to include the last
-            // character.
-            curEnd.ch++;
-          }
-          var linewise = motionArgs.linewise ||
-              (vim.visualMode && vim.visualLine);
-          if (linewise) {
-            // Expand selection to entire line.
-            expandSelectionToLine(cm, curStart, curEnd);
-          } else if (motionArgs.forward) {
-            // Clip to trailing newlines only if the motion goes forward.
-            clipToLine(cm, curStart, curEnd);
-          }
-          operatorArgs.registerName = registerName;
-          // Keep track of linewise as it affects how paste and change behave.
-          operatorArgs.linewise = linewise;
-          operators[operator](cm, operatorArgs, vim, curStart,
-              curEnd, curOriginal);
-          if (vim.visualMode) {
-            exitVisualMode(cm, vim);
-          }
-          if (operatorArgs.enterInsertMode) {
-            actions.enterInsertMode(cm);
-          }
-        }
-      },
-      recordLastEdit: function(cm, vim, inputState) {
-        vim.lastEdit = inputState;
-      }
-    };
-
-    /**
-     * typedef {Object{line:number,ch:number}} Cursor An object containing the
-     *     position of the cursor.
-     */
-    // All of the functions below return Cursor objects.
-    var motions = {
-      moveToTopLine: function(cm, motionArgs) {
-        var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;
-        return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
-      },
-      moveToMiddleLine: function(cm) {
-        var range = getUserVisibleLines(cm);
-        var line = Math.floor((range.top + range.bottom) * 0.5);
-        return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
-      },
-      moveToBottomLine: function(cm, motionArgs) {
-        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;
-        return { line: line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(line)) };
-      },
-      expandToLine: function(cm, motionArgs) {
-        // Expands forward to end of line, and then to next line if repeat is
-        // >1. Does not handle backward motion!
-        var cur = cm.getCursor();
-        return { line: cur.line + motionArgs.repeat - 1, ch: Infinity };
-      },
-      findNext: function(cm, motionArgs, vim) {
-        var state = getSearchState(cm);
-        var query = state.getQuery();
-        if (!query) {
-          return;
-        }
-        var prev = !motionArgs.forward;
-        // If search is initiated with ? instead of /, negate direction.
-        prev = (state.isReversed()) ? !prev : prev;
-        highlightSearchMatches(cm, query);
-        return findNext(cm, prev/** prev */, query, motionArgs.repeat);
-      },
-      goToMark: function(cm, motionArgs, vim) {
-        var mark = vim.marks[motionArgs.selectedCharacter];
-        if (mark) {
-          return mark.find();
-        }
-        return null;
-      },
-      jumpToMark: function(cm, motionArgs, vim) {
-        var best = cm.getCursor(); 
-        for (var i = 0; i < motionArgs.repeat; i++) {
-          var cursor = best;
-          for (var key in vim.marks) {
-            if (!isLowerCase(key)) {
-              continue;
-            }
-            var mark = vim.marks[key].find();
-            var isWrongDirection = (motionArgs.forward) ?
-              cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark)
-
-            if (isWrongDirection) {
-              continue;
-            }
-            if (motionArgs.linewise && (mark.line == cursor.line)) {
-              continue;
-            }
-
-            var equal = cursorEqual(cursor, best);
-            var between = (motionArgs.forward) ?
-              cusrorIsBetween(cursor, mark, best) :
-              cusrorIsBetween(best, mark, cursor);
-
-            if (equal || between) {
-              best = mark;
-            }
-          }
-        }
-
-        if (motionArgs.linewise) {
-          // Vim places the cursor on the first non-whitespace character of
-          // the line if there is one, else it places the cursor at the end
-          // of the line, regardless of whether a mark was found.
-          best.ch = findFirstNonWhiteSpaceCharacter(cm.getLine(best.line));
-        }
-        return best;
-      },
-      moveByCharacters: function(cm, motionArgs) {
-        var cur = cm.getCursor();
-        var repeat = motionArgs.repeat;
-        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;
-        return { line: cur.line, ch: ch };
-      },
-      moveByLines: function(cm, motionArgs, vim) {
-        var cur = cm.getCursor();
-        var endCh = cur.ch;
-        // Depending what our last motion was, we may want to do different
-        // things. If our last motion was moving vertically, we want to
-        // preserve the HPos from our last horizontal move.  If our last motion
-        // was going to the end of a line, moving vertically we should go to
-        // the end of the line, etc.
-        switch (vim.lastMotion) {
-          case this.moveByLines:
-          case this.moveByDisplayLines:
-          case this.moveByScroll:
-          case this.moveToColumn:
-          case this.moveToEol:
-            endCh = vim.lastHPos;
-            break;
-          default:
-            vim.lastHPos = endCh;
-        }
-        var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);
-        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;
-        if (line < cm.firstLine() || line > cm.lastLine() ) {
-          return null;
-        }
-        if(motionArgs.toFirstChar){
-          endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
-          vim.lastHPos = endCh;
-        }
-        vim.lastHSPos = cm.charCoords({line:line, ch:endCh},"div").left;
-        return { line: line, ch: endCh };
-      },
-      moveByDisplayLines: function(cm, motionArgs, vim) {
-        var cur = cm.getCursor();
-        switch (vim.lastMotion) {
-          case this.moveByDisplayLines:
-          case this.moveByScroll:
-          case this.moveByLines:
-          case this.moveToColumn:
-          case this.moveToEol:
-            break;
-          default:
-            vim.lastHSPos = cm.charCoords(cur,"div").left;
-        }
-        var repeat = motionArgs.repeat;
-        var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),"line",vim.lastHSPos);
-        if (res.hitSide) {
-          if (motionArgs.forward) {
-            var lastCharCoords = cm.charCoords(res, 'div');
-            var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };
-            var res = cm.coordsChar(goalCoords, 'div');
-          } else {
-            var resCoords = cm.charCoords({ line: cm.firstLine(), ch: 0}, 'div');
-            resCoords.left = vim.lastHSPos;
-            res = cm.coordsChar(resCoords, 'div');
-          }
-        }
-        vim.lastHPos = res.ch;
-        return res;
-      },
-      moveByPage: function(cm, motionArgs) {
-        // CodeMirror only exposes functions that move the cursor page down, so
-        // doing this bad hack to move the cursor and move it back. evalInput
-        // will move the cursor to where it should be in the end.
-        var curStart = cm.getCursor();
-        var repeat = motionArgs.repeat;
-        cm.moveV((motionArgs.forward ? repeat : -repeat), 'page');
-        var curEnd = cm.getCursor();
-        cm.setCursor(curStart);
-        return curEnd;
-      },
-      moveByParagraph: function(cm, motionArgs) {
-        var line = cm.getCursor().line;
-        var repeat = motionArgs.repeat;
-        var inc = motionArgs.forward ? 1 : -1;
-        for (var i = 0; i < repeat; i++) {
-          if ((!motionArgs.forward && line === cm.firstLine() ) ||
-              (motionArgs.forward && line == cm.lastLine())) {
-            break;
-          }
-          line += inc;
-          while (line !== cm.firstLine() && line != cm.lastLine() && cm.getLine(line)) {
-            line += inc;
-          }
-        }
-        return { line: line, ch: 0 };
-      },
-      moveByScroll: function(cm, motionArgs, vim) {
-        var globalState = getVimGlobalState();
-        var scrollbox = cm.getScrollInfo();
-        var curEnd = null;
-        var repeat = motionArgs.repeat;
-        if (!repeat) {
-          repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());
-        }
-        var orig = cm.charCoords(cm.getCursor(), 'local');
-        motionArgs.repeat = repeat;
-        var curEnd = motions.moveByDisplayLines(cm, motionArgs, vim);
-        if (!curEnd) {
-          return null;
-        }
-        var dest = cm.charCoords(curEnd, 'local');
-        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);
-        return curEnd;
-      },
-      moveByWords: function(cm, motionArgs) {
-        return moveToWord(cm, motionArgs.repeat, !!motionArgs.forward,
-            !!motionArgs.wordEnd, !!motionArgs.bigWord);
-      },
-      moveTillCharacter: function(cm, motionArgs) {
-        var repeat = motionArgs.repeat;
-        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,
-            motionArgs.selectedCharacter);
-        var increment = motionArgs.forward ? -1 : 1;
-        recordLastCharacterSearch(increment, motionArgs);
-        if(!curEnd)return cm.getCursor();
-        curEnd.ch += increment;
-        return curEnd;
-      },
-      moveToCharacter: function(cm, motionArgs) {
-        var repeat = motionArgs.repeat;
-        recordLastCharacterSearch(0, motionArgs);
-        return moveToCharacter(cm, repeat, motionArgs.forward,
-            motionArgs.selectedCharacter) || cm.getCursor();
-      },
-      moveToSymbol: function(cm, motionArgs) {
-        var repeat = motionArgs.repeat;
-        return findSymbol(cm, repeat, motionArgs.forward,
-            motionArgs.selectedCharacter) || cm.getCursor();
-      },
-      moveToColumn: function(cm, motionArgs, vim) {
-        var repeat = motionArgs.repeat;
-        // repeat is equivalent to which column we want to move to!
-        vim.lastHPos = repeat - 1;
-        vim.lastHSPos = cm.charCoords(cm.getCursor(),"div").left;
-        return moveToColumn(cm, repeat);
-      },
-      moveToEol: function(cm, motionArgs, vim) {
-        var cur = cm.getCursor();
-        vim.lastHPos = Infinity;
-        var retval={ line: cur.line + motionArgs.repeat - 1, ch: Infinity }
-        var end=cm.clipPos(retval);
-        end.ch--;
-        vim.lastHSPos = cm.charCoords(end,"div").left;
-        return retval;
-      },
-      moveToFirstNonWhiteSpaceCharacter: function(cm) {
-        // Go to the start of the line where the text begins, or the end for
-        // whitespace-only lines
-        var cursor = cm.getCursor();
-        return { line: cursor.line,
-            ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)) };
-      },
-      moveToMatchedSymbol: function(cm, motionArgs) {
-        var cursor = cm.getCursor();
-        var line = cursor.line;
-        var ch = cursor.ch;
-        var lineText = cm.getLine(line);
-        var symbol;
-        var startContext = cm.getTokenAt(cursor).type;
-        var startCtxLevel = getContextLevel(startContext);
-        do {
-          symbol = lineText.charAt(ch++);
-          if (symbol && isMatchableSymbol(symbol)) {
-            var endContext = cm.getTokenAt({line:line, ch:ch}).type;
-            var endCtxLevel = getContextLevel(endContext);
-            if (startCtxLevel >= endCtxLevel) {
-              break;
-            }
-          }
-        } while (symbol);
-        if (symbol) {
-          return findMatchedSymbol(cm, {line:line, ch:ch-1}, symbol);
-        } else {
-          return cursor;
-        }
-      },
-      moveToStartOfLine: function(cm) {
-        var cursor = cm.getCursor();
-        return { line: cursor.line, ch: 0 };
-      },
-      moveToLineOrEdgeOfDocument: function(cm, motionArgs) {
-        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();
-        if (motionArgs.repeatIsExplicit) {
-          lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');
-        }
-        return { line: lineNum,
-            ch: findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)) };
-      },
-      textObjectManipulation: function(cm, motionArgs) {
-        var character = motionArgs.selectedCharacter;
-        // Inclusive is the difference between a and i
-        // TODO: Instead of using the additional text object map to perform text
-        //     object operations, merge the map into the defaultKeyMap and use
-        //     motionArgs to define behavior. Define separate entries for 'aw',
-        //     'iw', 'a[', 'i[', etc.
-        var inclusive = !motionArgs.textObjectInner;
-        if (!textObjects[character]) {
-          // No text object defined for this, don't move.
-          return null;
-        }
-        var tmp = textObjects[character](cm, inclusive);
-        var start = tmp.start;
-        var end = tmp.end;
-        return [start, end];
-      },
-      repeatLastCharacterSearch: function(cm, motionArgs) {
-        var lastSearch = getVimGlobalState().lastChararacterSearch;
-        var repeat = motionArgs.repeat;
-        var forward = motionArgs.forward === lastSearch.forward;
-        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
-        cm.moveH(-increment, 'char');
-        motionArgs.inclusive = forward ? true : false;
-        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);
-        if (!curEnd) {
-          cm.moveH(increment, 'char')
-          return cm.getCursor();
-        }
-        curEnd.ch += increment;
-        return curEnd;
-      }
-    };
-
-    var operators = {
-      change: function(cm, operatorArgs, vim, curStart, curEnd) {
-        getVimGlobalState().registerController.pushText(
-            operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd),
-            operatorArgs.linewise);
-        if (operatorArgs.linewise) {
-          // Delete starting at the first nonwhitespace character of the first
-          // line, instead of from the start of the first line. This way we get
-          // an indent when we get into insert mode. This behavior isn't quite
-          // correct because we should treat this as a completely new line, and
-          // indent should be whatever codemirror thinks is the right indent.
-          // But cm.indentLine doesn't seem work on empty lines.
-          // TODO: Fix the above.
-          curStart.ch =
-              findFirstNonWhiteSpaceCharacter(cm.getLine(curStart.line));
-          // Insert an additional newline so that insert mode can start there.
-          // curEnd should be on the first character of the new line.
-          cm.replaceRange('\n', curStart, curEnd);
-        } else {
-          cm.replaceRange('', curStart, curEnd);
-        }
-        cm.setCursor(curStart);
-      },
-      // delete is a javascript keyword.
-      'delete': function(cm, operatorArgs, vim, curStart, curEnd) {
-        getVimGlobalState().registerController.pushText(
-            operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd),
-            operatorArgs.linewise);
-        cm.replaceRange('', curStart, curEnd);
-        if (operatorArgs.linewise) {
-          cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
-        } else {
-          cm.setCursor(curStart);
-        }
-      },
-      indent: function(cm, operatorArgs, vim, curStart, curEnd) {
-        var startLine = curStart.line;
-        var endLine = curEnd.line;
-        // In visual mode, n> shifts the selection right n times, instead of
-        // shifting n lines right once.
-        var repeat = (vim.visualMode) ? operatorArgs.repeat : 1;
-        if (operatorArgs.linewise) {
-          // The only way to delete a newline is to delete until the start of
-          // the next line, so in linewise mode evalInput will include the next
-          // line. We don't want this in indent, so we go back a line.
-          endLine--;
-        }
-        for (var i = startLine; i <= endLine; i++) {
-          for (var j = 0; j < repeat; j++) {
-            cm.indentLine(i, operatorArgs.indentRight);
-          }
-        }
-        cm.setCursor(curStart);
-        cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
-      },
-      swapcase: function(cm, operatorArgs, vim, curStart, curEnd, curOriginal) {
-        var toSwap = cm.getRange(curStart, curEnd);
-        var swapped = '';
-        for (var i = 0; i < toSwap.length; i++) {
-          var character = toSwap.charAt(i);
-          swapped += isUpperCase(character) ? character.toLowerCase() :
-              character.toUpperCase();
-        }
-        cm.replaceRange(swapped, curStart, curEnd);
-        cm.setCursor(curOriginal);
-      },
-      yank: function(cm, operatorArgs, vim, curStart, curEnd, curOriginal) {
-        getVimGlobalState().registerController.pushText(
-            operatorArgs.registerName, 'yank',
-            cm.getRange(curStart, curEnd), operatorArgs.linewise);
-        cm.setCursor(curOriginal);
-      }
-    };
-
-    var actions = {
-      jumpListWalk: function(cm, actionArgs, vim) {
-        if (vim.visualMode) {
-          return;
-        }
-        var repeat = actionArgs.repeat;
-        var forward = actionArgs.forward;
-        var jumpList = getVimGlobalState().jumpList;
-
-        var mark = jumpList.move(cm, forward ? repeat : -repeat);
-        var markPos = mark ? mark.find() : undefined;
-        markPos = markPos ? markPos : cm.getCursor();
-        cm.setCursor(markPos);
-      },
-      scrollToCursor: function(cm, actionArgs) {
-        var lineNum = cm.getCursor().line;
-        var charCoords = cm.charCoords({line: lineNum, ch: 0}, "local");
-        var height = cm.getScrollInfo().clientHeight;
-        var y = charCoords.top;
-        var lineHeight = charCoords.bottom - y;
-        switch (actionArgs.position) {
-          case 'center': y = y - (height / 2) + lineHeight;
-            break;
-          case 'bottom': y = y - height + lineHeight*1.4;
-            break;
-          case 'top': y = y + lineHeight*0.4;
-            break;
-        }
-        cm.scrollTo(null, y);
-      },
-      replayMacro: function(cm, actionArgs) {
-        var registerName = actionArgs.selectedCharacter;
-        var repeat = actionArgs.repeat;
-        var macroModeState = getVimGlobalState().macroModeState;
-        if (registerName == '@') {
-          registerName = macroModeState.latestRegister;
-        }
-        var keyBuffer = parseRegisterToKeyBuffer(macroModeState, registerName);
-        while(repeat--){
-          executeMacroKeyBuffer(cm, macroModeState, keyBuffer);
-        }
-      },
-      exitMacroRecordMode: function(cm, actionArgs) {
-        var macroModeState = getVimGlobalState().macroModeState;
-        macroModeState.toggle();
-        parseKeyBufferToRegister(macroModeState.latestRegister,
-                                 macroModeState.macroKeyBuffer);
-      },
-      enterMacroRecordMode: function(cm, actionArgs) {
-        var macroModeState = getVimGlobalState().macroModeState;
-        var registerName = actionArgs.selectedCharacter;
-        macroModeState.toggle(cm, registerName);
-        emptyMacroKeyBuffer(macroModeState);
-      },
-      enterInsertMode: function(cm, actionArgs) {
-        var insertAt = (actionArgs) ? actionArgs.insertAt : null;
-        if (insertAt == 'eol') {
-          var cursor = cm.getCursor();
-          cursor = { line: cursor.line, ch: lineLength(cm, cursor.line) };
-          cm.setCursor(cursor);
-        } else if (insertAt == 'charAfter') {
-          cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));
-        } else if (insertAt == 'firstNonBlank') {
-          cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
-        }
-        cm.setOption('keyMap', 'vim-insert');
-      },
-      toggleVisualMode: function(cm, actionArgs, vim) {
-        var repeat = actionArgs.repeat;
-        var curStart = cm.getCursor();
-        var curEnd;
-        // TODO: The repeat should actually select number of characters/lines
-        //     equal to the repeat times the size of the previous visual
-        //     operation.
-        if (!vim.visualMode) {
-          vim.visualMode = true;
-          vim.visualLine = !!actionArgs.linewise;
-          if (vim.visualLine) {
-            curStart.ch = 0;
-            curEnd = clipCursorToContent(cm, {
-              line: curStart.line + repeat - 1,
-              ch: lineLength(cm, curStart.line)
-            }, true /** includeLineBreak */);
-          } else {
-            curEnd = clipCursorToContent(cm, {
-              line: curStart.line,
-              ch: curStart.ch + repeat
-            }, true /** includeLineBreak */);
-          }
-          // Make the initial selection.
-          if (!actionArgs.repeatIsExplicit && !vim.visualLine) {
-            // This is a strange case. Here the implicit repeat is 1. The
-            // following commands lets the cursor hover over the 1 character
-            // selection.
-            cm.setCursor(curEnd);
-            cm.setSelection(curEnd, curStart);
-          } else {
-            cm.setSelection(curStart, curEnd);
-          }
-        } else {
-          curStart = cm.getCursor('anchor');
-          curEnd = cm.getCursor('head');
-          if (!vim.visualLine && actionArgs.linewise) {
-            // Shift-V pressed in characterwise visual mode. Switch to linewise
-            // visual mode instead of exiting visual mode.
-            vim.visualLine = true;
-            curStart.ch = cursorIsBefore(curStart, curEnd) ? 0 :
-                lineLength(cm, curStart.line);
-            curEnd.ch = cursorIsBefore(curStart, curEnd) ?
-                lineLength(cm, curEnd.line) : 0;
-            cm.setSelection(curStart, curEnd);
-          } else if (vim.visualLine && !actionArgs.linewise) {
-            // v pressed in linewise visual mode. Switch to characterwise visual
-            // mode instead of exiting visual mode.
-            vim.visualLine = false;
-          } else {
-            exitVisualMode(cm, vim);
-          }
-        }
-        updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart
-            : curEnd);
-        updateMark(cm, vim, '>', cursorIsBefore(curStart, curEnd) ? curEnd
-            : curStart);
-      },
-      joinLines: function(cm, actionArgs, vim) {
-        var curStart, curEnd;
-        if (vim.visualMode) {
-          curStart = cm.getCursor('anchor');
-          curEnd = cm.getCursor('head');
-          curEnd.ch = lineLength(cm, curEnd.line) - 1;
-        } else {
-          // Repeat is the number of lines to join. Minimum 2 lines.
-          var repeat = Math.max(actionArgs.repeat, 2);
-          curStart = cm.getCursor();
-          curEnd = clipCursorToContent(cm, { line: curStart.line + repeat - 1,
-              ch: Infinity });
-        }
-        var finalCh = 0;
-        cm.operation(function() {
-          for (var i = curStart.line; i < curEnd.line; i++) {
-            finalCh = lineLength(cm, curStart.line);
-            var tmp = { line: curStart.line + 1,
-                ch: lineLength(cm, curStart.line + 1) };
-            var text = cm.getRange(curStart, tmp);
-            text = text.replace(/\n\s*/g, ' ');
-            cm.replaceRange(text, curStart, tmp);
-          }
-          var curFinalPos = { line: curStart.line, ch: finalCh };
-          cm.setCursor(curFinalPos);
-        });
-      },
-      newLineAndEnterInsertMode: function(cm, actionArgs) {
-        var insertAt = cm.getCursor();
-        if (insertAt.line === cm.firstLine() && !actionArgs.after) {
-          // Special case for inserting newline before start of document.
-          cm.replaceRange('\n', { line: cm.firstLine(), ch: 0 });
-          cm.setCursor(cm.firstLine(), 0);
-        } else {
-          insertAt.line = (actionArgs.after) ? insertAt.line :
-              insertAt.line - 1;
-          insertAt.ch = lineLength(cm, insertAt.line);
-          cm.setCursor(insertAt);
-          var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||
-              CodeMirror.commands.newlineAndIndent;
-          newlineFn(cm);
-        }
-        this.enterInsertMode(cm);
-      },
-      paste: function(cm, actionArgs, vim) {
-        var cur = cm.getCursor();
-        var register = getVimGlobalState().registerController.getRegister(
-            actionArgs.registerName);
-        if (!register.text) {
-          return;
-        }
-        for (var text = '', i = 0; i < actionArgs.repeat; i++) {
-          text += register.text;
-        }
-        var linewise = register.linewise;
-        if (linewise) {
-          if (actionArgs.after) {
-            // Move the newline at the end to the start instead, and paste just
-            // before the newline character of the line we are on right now.
-            text = '\n' + text.slice(0, text.length - 1);
-            cur.ch = lineLength(cm, cur.line);
-          } else {
-            cur.ch = 0;
-          }
-        } else {
-          cur.ch += actionArgs.after ? 1 : 0;
-        }
-        cm.replaceRange(text, cur);
-        // Now fine tune the cursor to where we want it.
-        var curPosFinal;
-        var idx;
-        if (linewise && actionArgs.after) {
-          curPosFinal = { line: cur.line + 1,
-              ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)) };
-        } else if (linewise && !actionArgs.after) {
-          curPosFinal = { line: cur.line,
-              ch: findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)) };
-        } else if (!linewise && actionArgs.after) {
-          idx = cm.indexFromPos(cur);
-          curPosFinal = cm.posFromIndex(idx + text.length - 1);
-        } else {
-          idx = cm.indexFromPos(cur);
-          curPosFinal = cm.posFromIndex(idx + text.length);
-        }
-        cm.setCursor(curPosFinal);
-      },
-      undo: function(cm, actionArgs) {
-        repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();
-      },
-      redo: function(cm, actionArgs) {
-        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();
-      },
-      setRegister: function(cm, actionArgs, vim) {
-        vim.inputState.registerName = actionArgs.selectedCharacter;
-      },
-      setMark: function(cm, actionArgs, vim) {
-        var markName = actionArgs.selectedCharacter;
-        updateMark(cm, vim, markName, cm.getCursor());
-      },
-      replace: function(cm, actionArgs, vim) {
-        var replaceWith = actionArgs.selectedCharacter;
-        var curStart = cm.getCursor();
-        var replaceTo;
-        var curEnd;
-        if(vim.visualMode){
-          curStart=cm.getCursor('start');
-          curEnd=cm.getCursor('end');
-          // workaround to catch the character under the cursor
-          //  existing workaround doesn't cover actions
-          curEnd=cm.clipPos({line: curEnd.line, ch: curEnd.ch+1});
-        }else{
-          var line = cm.getLine(curStart.line);
-          replaceTo = curStart.ch + actionArgs.repeat;
-          if (replaceTo > line.length) {
-            replaceTo=line.length;
-          }
-          curEnd = { line: curStart.line, ch: replaceTo };
-        }
-        if(replaceWith=='\n'){
-          if(!vim.visualMode) cm.replaceRange('', curStart, curEnd);
-          // special case, where vim help says to replace by just one line-break
-          (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);
-        }else {
-          var replaceWithStr=cm.getRange(curStart, curEnd);
-          //replace all characters in range by selected, but keep linebreaks
-          replaceWithStr=replaceWithStr.replace(/[^\n]/g,replaceWith);
-          cm.replaceRange(replaceWithStr, curStart, curEnd);
-          if(vim.visualMode){
-            cm.setCursor(curStart);
-            exitVisualMode(cm,vim);
-          }else{
-            cm.setCursor(offsetCursor(curEnd, 0, -1));
-          }
-        }
-      },
-      enterReplaceMode: function(cm, actionArgs) {
-        cm.setOption('keyMap', 'vim-replace');
-        cm.toggleOverwrite();
-      },
-      incrementNumberToken: function(cm, actionArgs, vim) {
-        var cur = cm.getCursor();
-        var lineStr = cm.getLine(cur.line);
-        var re = /-?\d+/g;
-        var match;
-        var start;
-        var end;
-        var numberStr;
-        var token;
-        while ((match = re.exec(lineStr)) !== null) {
-          token = match[0];
-          start = match.index;
-          end = start + token.length;
-          if(cur.ch < end)break;
-        }
-        if(!actionArgs.backtrack && (end <= cur.ch))return;
-        if (token) {
-          var increment = actionArgs.increase ? 1 : -1;
-          var number = parseInt(token) + (increment * actionArgs.repeat);
-          var from = {ch:start, line:cur.line};
-          var to = {ch:end, line:cur.line};
-          numberStr = number.toString();
-          cm.replaceRange(numberStr, from, to);
-        } else {
-          return;
-        }
-        cm.setCursor({line: cur.line, ch: start + numberStr.length - 1});
-      },
-      repeatLastEdit: function(cm, actionArgs, vim) {
-        // TODO: Make this repeat insert mode changes.
-        var lastEdit = vim.lastEdit;
-        if (lastEdit) {
-          if (actionArgs.repeat && actionArgs.repeatIsExplicit) {
-            vim.lastEdit.repeatOverride = actionArgs.repeat;
-          }
-          var currentInputState = vim.inputState;
-          vim.inputState = vim.lastEdit;
-          commandDispatcher.evalInput(cm, vim);
-          vim.inputState = currentInputState;
-        }
-      }
-    };
-
-    var textObjects = {
-      // TODO: lots of possible exceptions that can be thrown here. Try da(
-      //     outside of a () block.
-      // TODO: implement text objects for the reverse like }. Should just be
-      //     an additional mapping after moving to the defaultKeyMap.
-      'w': function(cm, inclusive) {
-        return expandWordUnderCursor(cm, inclusive, true /** forward */,
-            false /** bigWord */);
-      },
-      'W': function(cm, inclusive) {
-        return expandWordUnderCursor(cm, inclusive,
-            true /** forward */, true /** bigWord */);
-      },
-      '{': function(cm, inclusive) {
-        return selectCompanionObject(cm, '}', inclusive);
-      },
-      '(': function(cm, inclusive) {
-        return selectCompanionObject(cm, ')', inclusive);
-      },
-      '[': function(cm, inclusive) {
-        return selectCompanionObject(cm, ']', inclusive);
-      },
-      '\'': function(cm, inclusive) {
-        return findBeginningAndEnd(cm, "'", inclusive);
-      },
-      '\"': function(cm, inclusive) {
-        return findBeginningAndEnd(cm, '"', inclusive);
-      }
-    };
-
-    /*
-     * Below are miscellaneous utility functions used by vim.js
-     */
-
-    /**
-     * Clips cursor to ensure that line is within the buffer's range
-     * If includeLineBreak is true, then allow cur.ch == lineLength.
-     */
-    function clipCursorToContent(cm, cur, includeLineBreak) {
-      var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );
-      var maxCh = lineLength(cm, line) - 1;
-      maxCh = (includeLineBreak) ? maxCh + 1 : maxCh;
-      var ch = Math.min(Math.max(0, cur.ch), maxCh);
-      return { line: line, ch: ch };
-    }
-    // Merge arguments in place, for overriding arguments.
-    function mergeArgs(to, from) {
-      for (var prop in from) {
-        if (from.hasOwnProperty(prop)) {
-          to[prop] = from[prop];
-        }
-      }
-    }
-    function copyArgs(args) {
-      var ret = {};
-      for (var prop in args) {
-        if (args.hasOwnProperty(prop)) {
-          ret[prop] = args[prop];
-        }
-      }
-      return ret;
-    }
-    function offsetCursor(cur, offsetLine, offsetCh) {
-      return { line: cur.line + offsetLine, ch: cur.ch + offsetCh };
-    }
-    function arrayEq(a1, a2) {
-      if (a1.length != a2.length) {
-        return false;
-      }
-      for (var i = 0; i < a1.length; i++) {
-        if (a1[i] != a2[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-    function matchKeysPartial(pressed, mapped) {
-      for (var i = 0; i < pressed.length; i++) {
-        // 'character' means any character. For mark, register commads, etc.
-        if (pressed[i] != mapped[i] && mapped[i] != 'character') {
-          return false;
-        }
-      }
-      return true;
-    }
-    function arrayIsSubsetFromBeginning(small, big) {
-      for (var i = 0; i < small.length; i++) {
-        if (small[i] != big[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-    function repeatFn(cm, fn, repeat) {
-      return function() {
-        for (var i = 0; i < repeat; i++) {
-          fn(cm);
-        }
-      };
-    }
-    function copyCursor(cur) {
-      return { line: cur.line, ch: cur.ch };
-    }
-    function cursorEqual(cur1, cur2) {
-      return cur1.ch == cur2.ch && cur1.line == cur2.line;
-    }
-    function cursorIsBefore(cur1, cur2) {
-      if (cur1.line < cur2.line) {
-        return true;
-      } else if (cur1.line == cur2.line && cur1.ch < cur2.ch) {
-        return true;
-      }
-      return false;
-    }
-    function cusrorIsBetween(cur1, cur2, cur3) {
-      // returns true if cur2 is between cur1 and cur3.
-      var cur1before2 = cursorIsBefore(cur1, cur2);
-      var cur2before3 = cursorIsBefore(cur2, cur3);
-      return cur1before2 && cur2before3;
-    }
-    function lineLength(cm, lineNum) {
-      return cm.getLine(lineNum).length;
-    }
-    function reverse(s){
-      return s.split("").reverse().join("");
-    }
-    function trim(s) {
-      if (s.trim) {
-        return s.trim();
-      } else {
-        return s.replace(/^\s+|\s+$/g, '');
-      }
-    }
-    function escapeRegex(s) {
-      return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, "\\$1");
-    }
-
-    function exitVisualMode(cm, vim) {
-      vim.visualMode = false;
-      vim.visualLine = false;
-      var selectionStart = cm.getCursor('anchor');
-      var selectionEnd = cm.getCursor('head');
-      if (!cursorEqual(selectionStart, selectionEnd)) {
-        // Clear the selection and set the cursor only if the selection has not
-        // already been cleared. Otherwise we risk moving the cursor somewhere
-        // it's not supposed to be.
-        cm.setCursor(clipCursorToContent(cm, selectionEnd));
-      }
-    }
-
-    // Remove any trailing newlines from the selection. For
-    // example, with the caret at the start of the last word on the line,
-    // 'dw' should word, but not the newline, while 'w' should advance the
-    // caret to the first character of the next line.
-    function clipToLine(cm, curStart, curEnd) {
-      var selection = cm.getRange(curStart, curEnd);
-      // Only clip if the selection ends with trailing newline + whitespace
-      if (/\n\s*$/.test(selection)) {
-        var lines = selection.split('\n');
-        // We know this is all whitepsace.
-        lines.pop();
-
-        // Cases:
-        // 1. Last word is an empty line - do not clip the trailing '\n'
-        // 2. Last word is not an empty line - clip the trailing '\n'
-        var line;
-        // Find the line containing the last word, and clip all whitespace up
-        // to it.
-        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {
-          var clipped = false;
-          curEnd.line--;
-          curEnd.ch = 0;
-        }
-        // If the last word is not an empty line, clip an additional newline
-        if (line) {
-          curEnd.line--;
-          curEnd.ch = lineLength(cm, curEnd.line);
-        } else {
-          curEnd.ch = 0;
-        }
-      }
-    }
-
-    // Expand the selection to line ends.
-    function expandSelectionToLine(cm, curStart, curEnd) {
-      curStart.ch = 0;
-      curEnd.ch = 0;
-      curEnd.line++;
-    }
-
-    function findFirstNonWhiteSpaceCharacter(text) {
-      if (!text) {
-        return 0;
-      }
-      var firstNonWS = text.search(/\S/);
-      return firstNonWS == -1 ? text.length : firstNonWS;
-    }
-
-    function expandWordUnderCursor(cm, inclusive, forward, bigWord, noSymbol) {
-      var cur = cm.getCursor();
-      var line = cm.getLine(cur.line);
-      var idx = cur.ch;
-
-      // Seek to first word or non-whitespace character, depending on if
-      // noSymbol is true.
-      var textAfterIdx = line.substring(idx);
-      var firstMatchedChar;
-      if (noSymbol) {
-        firstMatchedChar = textAfterIdx.search(/\w/);
-      } else {
-        firstMatchedChar = textAfterIdx.search(/\S/);
-      }
-      if (firstMatchedChar == -1) {
-        return null;
-      }
-      idx += firstMatchedChar;
-      textAfterIdx = line.substring(idx);
-      var textBeforeIdx = line.substring(0, idx);
-
-      var matchRegex;
-      // Greedy matchers for the "word" we are trying to expand.
-      if (bigWord) {
-        matchRegex = /^\S+/;
-      } else {
-        if ((/\w/).test(line.charAt(idx))) {
-          matchRegex = /^\w+/;
-        } else {
-          matchRegex = /^[^\w\s]+/;
-        }
-      }
-
-      var wordAfterRegex = matchRegex.exec(textAfterIdx);
-      var wordStart = idx;
-      var wordEnd = idx + wordAfterRegex[0].length;
-      // TODO: Find a better way to do this. It will be slow on very long lines.
-      var revTextBeforeIdx = reverse(textBeforeIdx);
-      var wordBeforeRegex = matchRegex.exec(revTextBeforeIdx);
-      if (wordBeforeRegex) {
-        wordStart -= wordBeforeRegex[0].length;
-      }
-
-      if (inclusive) {
-        // If present, trim all whitespace after word.
-        // Otherwise, trim all whitespace before word.
-        var textAfterWordEnd = line.substring(wordEnd);
-        var whitespacesAfterWord = textAfterWordEnd.match(/^\s*/)[0].length;
-        if (whitespacesAfterWord > 0) {
-          wordEnd += whitespacesAfterWord;
-        } else {
-          var revTrim = revTextBeforeIdx.length - wordStart;
-          var textBeforeWordStart = revTextBeforeIdx.substring(revTrim);
-          var whitespacesBeforeWord = textBeforeWordStart.match(/^\s*/)[0].length;
-          wordStart -= whitespacesBeforeWord;
-        }
-      }
-
-      return { start: { line: cur.line, ch: wordStart },
-        end: { line: cur.line, ch: wordEnd }};
-    }
-
-    function recordJumpPosition(cm, oldCur, newCur) {
-      if(!cursorEqual(oldCur, newCur)) {
-        getVimGlobalState().jumpList.add(cm, oldCur, newCur);
-      }
-    }
-
-    function recordLastCharacterSearch(increment, args) {
-        var vimGlobalState = getVimGlobalState();
-        vimGlobalState.lastChararacterSearch.increment = increment;
-        vimGlobalState.lastChararacterSearch.forward = args.forward;
-        vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
-    }
-
-    var symbolToMode = {
-        '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',
-        '[': 'section', ']': 'section',
-        '*': 'comment', '/': 'comment',
-        'm': 'method', 'M': 'method',
-        '#': 'preprocess'
-    };
-    var findSymbolModes = {
-      bracket: {
-        isComplete: function(state) {
-          if (state.nextCh === state.symb) {
-            state.depth++;
-            if(state.depth >= 1)return true;
-          } else if (state.nextCh === state.reverseSymb) {
-            state.depth--;
-          }
-          return false;
-        }
-      },
-      section: {
-        init: function(state) {
-          state.curMoveThrough = true;
-          state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';
-        },
-        isComplete: function(state) {
-          return state.index === 0 && state.nextCh === state.symb;
-        }
-      },
-      comment: {
-        isComplete: function(state) {
-          var found = state.lastCh === '*' && state.nextCh === '/';
-          state.lastCh = state.nextCh;
-          return found;
-        }
-      },
-      // TODO: The original Vim implementation only operates on level 1 and 2.
-      // The current implementation doesn't check for code block level and 
-      // therefore it operates on any levels.
-      method: {
-        init: function(state) {
-          state.symb = (state.symb === 'm' ? '{' : '}');
-          state.reverseSymb = state.symb === '{' ? '}' : '{';
-        },
-        isComplete: function(state) {
-          if(state.nextCh === state.symb)return true;
-          return false;
-        }
-      },
-      preprocess: {
-        init: function(state) {
-          state.index = 0;
-        },
-        isComplete: function(state) {
-          if (state.nextCh === '#') {
-            var token = state.lineText.match(/#(\w+)/)[1];
-            if (token === 'endif') {
-              if (state.forward && state.depth === 0) {
-                return true;
-              }
-              state.depth++;
-            } else if (token === 'if') {
-              if (!state.forward && state.depth === 0) {
-                return true;
-              }
-              state.depth--;
-            }
-            if(token === 'else' && state.depth === 0)return true;
-          }
-          return false;
-        }
-      }
-    };
-    function findSymbol(cm, repeat, forward, symb) {
-      var cur = cm.getCursor();
-      var increment = forward ? 1 : -1;
-      var endLine = forward ? cm.lineCount() : -1;
-      var curCh = cur.ch;
-      var line = cur.line;
-      var lineText = cm.getLine(line);
-      var state = {
-        lineText: lineText,
-        nextCh: lineText.charAt(curCh),
-        lastCh: null,
-        index: curCh,
-        symb: symb,
-        reverseSymb: (forward ?  { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],
-        forward: forward,
-        depth: 0,
-        curMoveThrough: false      
-      };
-      var mode = symbolToMode[symb];
-      if(!mode)return cur;
-      var init = findSymbolModes[mode].init;
-      var isComplete = findSymbolModes[mode].isComplete;
-      if(init)init(state);
-      while (line !== endLine && repeat) {
-        state.index += increment;
-        state.nextCh = state.lineText.charAt(state.index);
-        if (!state.nextCh) {
-          line += increment;
-          state.lineText = cm.getLine(line) || '';
-          if (increment > 0) {
-            state.index = 0;
-          } else {
-            var lineLen = state.lineText.length;
-            state.index = (lineLen > 0) ? (lineLen-1) : 0;
-          }
-          state.nextCh = state.lineText.charAt(state.index);
-        }
-        if (isComplete(state)) {
-          cur.line = line;
-          cur.ch = state.index;
-          repeat--;
-        }
-      }
-      if (state.nextCh || state.curMoveThrough) {
-        return { line: line, ch: state.index };
-      }
-      return cur;
-    }
-
-    /*
-     * Returns the boundaries of the next word. If the cursor in the middle of
-     * the word, then returns the boundaries of the current word, starting at
-     * the cursor. If the cursor is at the start/end of a word, and we are going
-     * forward/backward, respectively, find the boundaries of the next word.
-     *
-     * @param {CodeMirror} cm CodeMirror object.
-     * @param {Cursor} cur The cursor position.
-     * @param {boolean} forward True to search forward. False to search
-     *     backward.
-     * @param {boolean} bigWord True if punctuation count as part of the word.
-     *     False if only [a-zA-Z0-9] characters count as part of the word.
-     * @param {boolean} emptyLineIsWord True if empty lines should be treated
-     *     as words.
-     * @return {Object{from:number, to:number, line: number}} The boundaries of
-     *     the word, or null if there are no more words.
-     */
-    function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {
-      var lineNum = cur.line;
-      var pos = cur.ch;
-      var line = cm.getLine(lineNum);
-      var dir = forward ? 1 : -1;
-      var regexps = bigWord ? bigWordRegexp : wordRegexp;
-
-      if (emptyLineIsWord && line == '') {
-        lineNum += dir;
-        line = cm.getLine(lineNum);
-        if (!isLine(cm, lineNum)) {
-          return null;
-        }
-        pos = (forward) ? 0 : line.length;
-      }
-
-      while (true) {
-        if (emptyLineIsWord && line == '') {
-          return { from: 0, to: 0, line: lineNum };
-        }
-        var stop = (dir > 0) ? line.length : -1;
-        var wordStart = stop, wordEnd = stop;
-        // Find bounds of next word.
-        while (pos != stop) {
-          var foundWord = false;
-          for (var i = 0; i < regexps.length && !foundWord; ++i) {
-            if (regexps[i].test(line.charAt(pos))) {
-              wordStart = pos;
-              // Advance to end of word.
-              while (pos != stop && regexps[i].test(line.charAt(pos))) {
-                pos += dir;
-              }
-              wordEnd = pos;
-              foundWord = wordStart != wordEnd;
-              if (wordStart == cur.ch && lineNum == cur.line &&
-                  wordEnd == wordStart + dir) {
-                // We started at the end of a word. Find the next one.
-                continue;
-              } else {
-                return {
-                  from: Math.min(wordStart, wordEnd + 1),
-                  to: Math.max(wordStart, wordEnd),
-                  line: lineNum };
-              }
-            }
-          }
-          if (!foundWord) {
-            pos += dir;
-          }
-        }
-        // Advance to next/prev line.
-        lineNum += dir;
-        if (!isLine(cm, lineNum)) {
-          return null;
-        }
-        line = cm.getLine(lineNum);
-        pos = (dir > 0) ? 0 : line.length;
-      }
-      // Should never get here.
-      throw 'The impossible happened.';
-    }
-
-    /**
-     * @param {CodeMirror} cm CodeMirror object.
-     * @param {int} repeat Number of words to move past.
-     * @param {boolean} forward True to search forward. False to search
-     *     backward.
-     * @param {boolean} wordEnd True to move to end of word. False to move to
-     *     beginning of word.
-     * @param {boolean} bigWord True if punctuation count as part of the word.
-     *     False if only alphabet characters count as part of the word.
-     * @return {Cursor} The position the cursor should move to.
-     */
-    function moveToWord(cm, repeat, forward, wordEnd, bigWord) {
-      var cur = cm.getCursor();
-      var curStart = copyCursor(cur);
-      var words = [];
-      if (forward && !wordEnd || !forward && wordEnd) {
-        repeat++;
-      }
-      // For 'e', empty lines are not considered words, go figure.
-      var emptyLineIsWord = !(forward && wordEnd);
-      for (var i = 0; i < repeat; i++) {
-        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);
-        if (!word) {
-          var eodCh = lineLength(cm, cm.lastLine());
-          words.push(forward
-              ? {line: cm.lastLine(), from: eodCh, to: eodCh}
-              : {line: 0, from: 0, to: 0});
-          break;
-        }
-        words.push(word);
-        cur = {line: word.line, ch: forward ? (word.to - 1) : word.from};
-      }
-      var shortCircuit = words.length != repeat;
-      var firstWord = words[0];
-      var lastWord = words.pop();
-      if (forward && !wordEnd) {
-        // w
-        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {
-          // We did not start in the middle of a word. Discard the extra word at the end.
-          lastWord = words.pop();
-        }
-        return {line: lastWord.line, ch: lastWord.from};
-      } else if (forward && wordEnd) {
-        return {line: lastWord.line, ch: lastWord.to - 1};
-      } else if (!forward && wordEnd) {
-        // ge
-        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {
-          // We did not start in the middle of a word. Discard the extra word at the end.
-          lastWord = words.pop();
-        }
-        return {line: lastWord.line, ch: lastWord.to};
-      } else {
-        // b
-        return {line: lastWord.line, ch: lastWord.from};
-      }
-    }
-
-    function moveToCharacter(cm, repeat, forward, character) {
-      var cur = cm.getCursor();
-      var start = cur.ch;
-      var idx;
-      for (var i = 0; i < repeat; i ++) {
-        var line = cm.getLine(cur.line);
-        idx = charIdxInLine(start, line, character, forward, true);
-        if (idx == -1) {
-          return null;
-        }
-        start = idx;
-      }
-      return { line: cm.getCursor().line, ch: idx };
-    }
-
-    function moveToColumn(cm, repeat) {
-      // repeat is always >= 1, so repeat - 1 always corresponds
-      // to the column we want to go to.
-      var line = cm.getCursor().line;
-      return clipCursorToContent(cm, { line: line, ch: repeat - 1 });
-    }
-
-    function updateMark(cm, vim, markName, pos) {
-      if (!inArray(markName, validMarks)) {
-        return;
-      }
-      if (vim.marks[markName]) {
-        vim.marks[markName].clear();
-      }
-      vim.marks[markName] = cm.setBookmark(pos);
-    }
-
-    function charIdxInLine(start, line, character, forward, includeChar) {
-      // Search for char in line.
-      // motion_options: {forward, includeChar}
-      // If includeChar = true, include it too.
-      // If forward = true, search forward, else search backwards.
-      // If char is not found on this line, do nothing
-      var idx;
-      if (forward) {
-        idx = line.indexOf(character, start + 1);
-        if (idx != -1 && !includeChar) {
-          idx -= 1;
-        }
-      } else {
-        idx = line.lastIndexOf(character, start - 1);
-        if (idx != -1 && !includeChar) {
-          idx += 1;
-        }
-      }
-      return idx;
-    }
-
-    function getContextLevel(ctx) {
-      return (ctx === 'string' || ctx === 'comment') ? 1 : 0;
-    }
-
-    function findMatchedSymbol(cm, cur, symb) {
-      var line = cur.line;
-      var ch = cur.ch;
-      symb = symb ? symb : cm.getLine(line).charAt(ch);
-
-      var symbContext = cm.getTokenAt({line:line, ch:ch+1}).type;
-      var symbCtxLevel = getContextLevel(symbContext);
-
-      var reverseSymb = ({
-        '(': ')', ')': '(',
-        '[': ']', ']': '[',
-        '{': '}', '}': '{'})[symb];
-
-      // Couldn't find a matching symbol, abort
-      if (!reverseSymb) {
-        return cur;
-      }
-
-      // set our increment to move forward (+1) or backwards (-1)
-      // depending on which bracket we're matching
-      var increment = ({'(': 1, '{': 1, '[': 1})[symb] || -1;
-      var endLine = increment === 1 ? cm.lineCount() : -1;
-      var depth = 1, nextCh = symb, index = ch, lineText = cm.getLine(line);
-      // Simple search for closing paren--just count openings and closings till
-      // we find our match
-      // TODO: use info from CodeMirror to ignore closing brackets in comments
-      // and quotes, etc.
-      while (line !== endLine && depth > 0) {
-        index += increment;
-        nextCh = lineText.charAt(index);
-        if (!nextCh) {
-          line += increment;
-          lineText = cm.getLine(line) || '';
-          if (increment > 0) {
-            index = 0;
-          } else {
-            var lineLen = lineText.length;
-            index = (lineLen > 0) ? (lineLen-1) : 0;
-          }
-          nextCh = lineText.charAt(index);
-        }
-        var revSymbContext = cm.getTokenAt({line:line, ch:index+1}).type;
-        var revSymbCtxLevel = getContextLevel(revSymbContext);
-        if (symbCtxLevel >= revSymbCtxLevel) {
-          if (nextCh === symb) {
-            depth++;
-          } else if (nextCh === reverseSymb) {
-            depth--;
-          }
-        }
-      }
-
-      if (nextCh) {
-        return { line: line, ch: index };
-      }
-      return cur;
-    }
-
-    function selectCompanionObject(cm, revSymb, inclusive) {
-      var cur = cm.getCursor();
-
-      var end = findMatchedSymbol(cm, cur, revSymb);
-      var start = findMatchedSymbol(cm, end);
-      start.ch += inclusive ? 1 : 0;
-      end.ch += inclusive ? 0 : 1;
-
-      return { start: start, end: end };
-    }
-
-    function regexLastIndexOf(string, pattern, startIndex) {
-      for (var i = !startIndex ? string.length : startIndex;
-          i >= 0; --i) {
-        if (pattern.test(string.charAt(i))) {
-          return i;
-        }
-      }
-      return -1;
-    }
-
-    // Takes in a symbol and a cursor and tries to simulate text objects that
-    // have identical opening and closing symbols
-    // TODO support across multiple lines
-    function findBeginningAndEnd(cm, symb, inclusive) {
-      var cur = cm.getCursor();
-      var line = cm.getLine(cur.line);
-      var chars = line.split('');
-      var start, end, i, len;
-      var firstIndex = chars.indexOf(symb);
-
-      // the decision tree is to always look backwards for the beginning first,
-      // but if the cursor is in front of the first instance of the symb,
-      // then move the cursor forward
-      if (cur.ch < firstIndex) {
-        cur.ch = firstIndex;
-        // Why is this line even here???
-        // cm.setCursor(cur.line, firstIndex+1);
-      }
-      // otherwise if the cursor is currently on the closing symbol
-      else if (firstIndex < cur.ch && chars[cur.ch] == symb) {
-        end = cur.ch; // assign end to the current cursor
-        --cur.ch; // make sure to look backwards
-      }
-
-      // if we're currently on the symbol, we've got a start
-      if (chars[cur.ch] == symb && !end) {
-        start = cur.ch + 1; // assign start to ahead of the cursor
-      } else {
-        // go backwards to find the start
-        for (i = cur.ch; i > -1 && !start; i--) {
-          if (chars[i] == symb) {
-            start = i + 1;
-          }
-        }
-      }
-
-      // look forwards for the end symbol
-      if (start && !end) {
-        for (i = start, len = chars.length; i < len && !end; i++) {
-          if (chars[i] == symb) {
-            end = i;
-          }
-        }
-      }
-
-      // nothing found
-      if (!start || !end) {
-        return { start: cur, end: cur };
-      }
-
-      // include the symbols
-      if (inclusive) {
-        --start; ++end;
-      }
-
-      return {
-        start: { line: cur.line, ch: start },
-        end: { line: cur.line, ch: end }
-      };
-    }
-
-    // Search functions
-    function SearchState() {}
-    SearchState.prototype = {
-      getQuery: function() {
-        return getVimGlobalState().query;
-      },
-      setQuery: function(query) {
-        getVimGlobalState().query = query;
-      },
-      getOverlay: function() {
-        return this.searchOverlay;
-      },
-      setOverlay: function(overlay) {
-        this.searchOverlay = overlay;
-      },
-      isReversed: function() {
-        return getVimGlobalState().isReversed;
-      },
-      setReversed: function(reversed) {
-        getVimGlobalState().isReversed = reversed;
-      }
-    };
-    function getSearchState(cm) {
-      var vim = getVimState(cm);
-      return vim.searchState_ || (vim.searchState_ = new SearchState());
-    }
-    function dialog(cm, template, shortText, onClose, options) {
-      if (cm.openDialog) {
-        cm.openDialog(template, onClose, { bottom: true, value: options.value,
-            onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp });
-      }
-      else {
-        onClose(prompt(shortText, ""));
-      }
-    }
-    function findUnescapedSlashes(str) {
-      var escapeNextChar = false;
-      var slashes = [];
-      for (var i = 0; i < str.length; i++) {
-        var c = str.charAt(i);
-        if (!escapeNextChar && c == '/') {
-          slashes.push(i);
-        }
-        escapeNextChar = (c == '\\');
-      }
-      return slashes;
-    }
-    /**
-     * Extract the regular expression from the query and return a Regexp object.
-     * Returns null if the query is blank.
-     * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.
-     * If smartCase is passed in, and the query contains upper case letters,
-     *   then ignoreCase is overridden, and the 'i' flag will not be set.
-     * If the query contains the /i in the flag part of the regular expression,
-     *   then both ignoreCase and smartCase are ignored, and 'i' will be passed
-     *   through to the Regex object.
-     */
-    function parseQuery(cm, query, ignoreCase, smartCase) {
-      // Check if the query is already a regex.
-      if (query instanceof RegExp) { return query; }
-      // First try to extract regex + flags from the input. If no flags found,
-      // extract just the regex. IE does not accept flags directly defined in
-      // the regex string in the form /regex/flags
-      var slashes = findUnescapedSlashes(query);
-      var regexPart;
-      var forceIgnoreCase;
-      if (!slashes.length) {
-        // Query looks like 'regexp'
-        regexPart = query;
-      } else {
-        // Query looks like 'regexp/...'
-        regexPart = query.substring(0, slashes[0]);
-        var flagsPart = query.substring(slashes[0]);
-        forceIgnoreCase = (flagsPart.indexOf('i') != -1);
-      }
-      if (!regexPart) {
-        return null;
-      }
-      if (smartCase) {
-        ignoreCase = (/^[^A-Z]*$/).test(regexPart);
-      }
-      var regexp = new RegExp(regexPart,
-          (ignoreCase || forceIgnoreCase) ? 'i' : undefined);
-      return regexp;
-    }
-    function showConfirm(cm, text) {
-      if (cm.openConfirm) {
-        cm.openConfirm('<span style="color: red">' + text +
-            '</span> <button type="button">OK</button>', function() {},
-            {bottom: true});
-      } else {
-        alert(text);
-      }
-    }
-    function makePrompt(prefix, desc) {
-      var raw = '';
-      if (prefix) {
-        raw += '<span style="font-family: monospace">' + prefix + '</span>';
-      }
-      raw += '<input type="text"/> ' +
-          '<span style="color: #888">';
-      if (desc) {
-        raw += '<span style="color: #888">';
-        raw += desc;
-        raw += '</span>';
-      }
-      return raw;
-    }
-    var searchPromptDesc = '(Javascript regexp)';
-    function showPrompt(cm, options) {
-      var shortText = (options.prefix || '') + ' ' + (options.desc || '');
-      var prompt = makePrompt(options.prefix, options.desc);
-      dialog(cm, prompt, shortText, options.onClose, options);
-    }
-    function regexEqual(r1, r2) {
-      if (r1 instanceof RegExp && r2 instanceof RegExp) {
-          var props = ["global", "multiline", "ignoreCase", "source"];
-          for (var i = 0; i < props.length; i++) {
-              var prop = props[i];
-              if (r1[prop] !== r2[prop]) {
-                  return(false);
-              }
-          }
-          return(true);
-      }
-      return(false);
-    }
-    // Returns true if the query is valid.
-    function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {
-      if (!rawQuery) {
-        return;
-      }
-      var state = getSearchState(cm);
-      var query = parseQuery(cm, rawQuery, !!ignoreCase, !!smartCase);
-      if (!query) {
-        return;
-      }
-      highlightSearchMatches(cm, query);
-      if (regexEqual(query, state.getQuery())) {
-        return query;
-      }
-      state.setQuery(query);
-      return query;
-    }
-    function searchOverlay(query) {
-      if (query.source.charAt(0) == '^') {
-        var matchSol = true;
-      }
-      return {
-        token: function(stream) {
-          if (matchSol && !stream.sol()) {
-            stream.skipToEnd();
-            return;
-          }
-          var match = stream.match(query, false);
-          if (match) {
-            if (match[0].length == 0) {
-              // Matched empty string, skip to next.
-              stream.next();
-              return "searching";
-            }
-            if (!stream.sol()) {
-              // Backtrack 1 to match \b
-              stream.backUp(1);
-              if (!query.exec(stream.next() + match[0])) {
-                stream.next();
-                return null;
-              }
-            }
-            stream.match(query);
-            return "searching";
-          }
-          while (!stream.eol()) {
-            stream.next();
-            if (stream.match(query, false)) break;
-          }
-        },
-        query: query
-      };
-    }
-    function highlightSearchMatches(cm, query) {
-      var overlay = getSearchState(cm).getOverlay();
-      if (!overlay || query != overlay.query) {
-        if (overlay) {
-          cm.removeOverlay(overlay);
-        }
-        overlay = searchOverlay(query);
-        cm.addOverlay(overlay);
-        getSearchState(cm).setOverlay(overlay);
-      }
-    }
-    function findNext(cm, prev, query, repeat) {
-      if (repeat === undefined) { repeat = 1; }
-      return cm.operation(function() {
-        var pos = cm.getCursor();
-        var cursor = cm.getSearchCursor(query, pos);
-        for (var i = 0; i < repeat; i++) {
-          var found = cursor.find(prev);
-          if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); }
-          if (!found) {
-            // SearchCursor may have returned null because it hit EOF, wrap
-            // around and try again.
-            cursor = cm.getSearchCursor(query,
-                (prev) ? { line: cm.lastLine() } : {line: cm.firstLine(), ch: 0} );
-            if (!cursor.find(prev)) {
-              return;
-            }
-          }
-        }
-        return cursor.from();
-      });}
-    function clearSearchHighlight(cm) {
-      cm.removeOverlay(getSearchState(cm).getOverlay());
-      getSearchState(cm).setOverlay(null);
-    }
-    /**
-     * Check if pos is in the specified range, INCLUSIVE.
-     * Range can be specified with 1 or 2 arguments.
-     * If the first range argument is an array, treat it as an array of line
-     * numbers. Match pos against any of the lines.
-     * If the first range argument is a number,
-     *   if there is only 1 range argument, check if pos has the same line
-     *       number
-     *   if there are 2 range arguments, then check if pos is in between the two
-     *       range arguments.
-     */
-    function isInRange(pos, start, end) {
-      if (typeof pos != 'number') {
-        // Assume it is a cursor position. Get the line number.
-        pos = pos.line;
-      }
-      if (start instanceof Array) {
-        return inArray(pos, start);
-      } else {
-        if (end) {
-          return (pos >= start && pos <= end);
-        } else {
-          return pos == start;
-        }
-      }
-    }
-    function getUserVisibleLines(cm) {
-      var scrollInfo = cm.getScrollInfo();
-      var occludeTorleranceTop = 6;
-      var occludeTorleranceBottom = 10;
-      var from = cm.coordsChar({left:0, top: occludeTorleranceTop}, 'local');
-      var bottomY = scrollInfo.clientHeight - occludeTorleranceBottom;
-      var to = cm.coordsChar({left:0, top: bottomY}, 'local');
-      return {top: from.line, bottom: to.line};
-    }
-
-    // Ex command handling
-    // Care must be taken when adding to the default Ex command map. For any
-    // pair of commands that have a shared prefix, at least one of their
-    // shortNames must not match the prefix of the other command.
-    var defaultExCommandMap = [
-      { name: 'map', type: 'builtIn' },
-      { name: 'write', shortName: 'w', type: 'builtIn' },
-      { name: 'undo', shortName: 'u', type: 'builtIn' },
-      { name: 'redo', shortName: 'red', type: 'builtIn' },
-      { name: 'substitute', shortName: 's', type: 'builtIn'},
-      { name: 'nohlsearch', shortName: 'noh', type: 'builtIn'},
-      { name: 'delmarks', shortName: 'delm', type: 'builtin'}
-    ];
-    Vim.ExCommandDispatcher = function() {
-      this.buildCommandMap_();
-    };
-    Vim.ExCommandDispatcher.prototype = {
-      processCommand: function(cm, input) {
-        var inputStream = new CodeMirror.StringStream(input);
-        var params = {};
-        params.input = input;
-        try {
-          this.parseInput_(cm, inputStream, params);
-        } catch(e) {
-          showConfirm(cm, e);
-          return;
-        }
-        var commandName;
-        if (!params.commandName) {
-          // If only a line range is defined, move to the line.
-          if (params.line !== undefined) {
-            commandName = 'move';
-          }
-        } else {
-          var command = this.matchCommand_(params.commandName);
-          if (command) {
-            commandName = command.name;
-            this.parseCommandArgs_(inputStream, params, command);
-            if (command.type == 'exToKey') {
-              // Handle Ex to Key mapping.
-              for (var i = 0; i < command.toKeys.length; i++) {
-                vim.handleKey(cm, command.toKeys[i]);
-              }
-              return;
-            } else if (command.type == 'exToEx') {
-              // Handle Ex to Ex mapping.
-              this.processCommand(cm, command.toInput);
-              return;
-            }
-          }
-        }
-        if (!commandName) {
-          showConfirm(cm, 'Not an editor command ":' + input + '"');
-          return;
-        }
-        exCommands[commandName](cm, params);
-      },
-      parseInput_: function(cm, inputStream, result) {
-        inputStream.eatWhile(':');
-        // Parse range.
-        if (inputStream.eat('%')) {
-          result.line = cm.firstLine();
-          result.lineEnd = cm.lastLine();
-        } else {
-          result.line = this.parseLineSpec_(cm, inputStream);
-          if (result.line !== undefined && inputStream.eat(',')) {
-            result.lineEnd = this.parseLineSpec_(cm, inputStream);
-          }
-        }
-
-        // Parse command name.
-        var commandMatch = inputStream.match(/^(\w+)/);
-        if (commandMatch) {
-          result.commandName = commandMatch[1];
-        } else {
-          result.commandName = inputStream.match(/.*/)[0];
-        }
-
-        return result;
-      },
-      parseLineSpec_: function(cm, inputStream) {
-        var numberMatch = inputStream.match(/^(\d+)/);
-        if (numberMatch) {
-          return parseInt(numberMatch[1], 10) - 1;
-        }
-        switch (inputStream.next()) {
-          case '.':
-            return cm.getCursor().line;
-          case '$':
-            return cm.lastLine();
-          case '\'':
-            var mark = getVimState(cm).marks[inputStream.next()];
-            if (mark && mark.find()) {
-              return mark.find().line;
-            } else {
-              throw "Mark not set";
-            }
-            break;
-          default:
-            inputStream.backUp(1);
-            return cm.getCursor().line;
-        }
-      },
-      parseCommandArgs_: function(inputStream, params, command) {
-        if (inputStream.eol()) {
-          return;
-        }
-        params.argString = inputStream.match(/.*/)[0];
-        // Parse command-line arguments
-        var delim = command.argDelimiter || /\s+/;
-        var args = trim(params.argString).split(delim);
-        if (args.length && args[0]) {
-          params.args = args;
-        }
-      },
-      matchCommand_: function(commandName) {
-        // Return the command in the command map that matches the shortest
-        // prefix of the passed in command name. The match is guaranteed to be
-        // unambiguous if the defaultExCommandMap's shortNames are set up
-        // correctly. (see @code{defaultExCommandMap}).
-        for (var i = commandName.length; i > 0; i--) {
-          var prefix = commandName.substring(0, i);
-          if (this.commandMap_[prefix]) {
-            var command = this.commandMap_[prefix];
-            if (command.name.indexOf(commandName) === 0) {
-              return command;
-            }
-          }
-        }
-        return null;
-      },
-      buildCommandMap_: function() {
-        this.commandMap_ = {};
-        for (var i = 0; i < defaultExCommandMap.length; i++) {
-          var command = defaultExCommandMap[i];
-          var key = command.shortName || command.name;
-          this.commandMap_[key] = command;
-        }
-      },
-      map: function(lhs, rhs) {
-        if (lhs != ':' && lhs.charAt(0) == ':') {
-          var commandName = lhs.substring(1);
-          if (rhs != ':' && rhs.charAt(0) == ':') {
-            // Ex to Ex mapping
-            this.commandMap_[commandName] = {
-              name: commandName,
-              type: 'exToEx',
-              toInput: rhs.substring(1)
-            };
-          } else {
-            // Ex to key mapping
-            this.commandMap_[commandName] = {
-              name: commandName,
-              type: 'exToKey',
-              toKeys: parseKeyString(rhs)
-            };
-          }
-        } else {
-          if (rhs != ':' && rhs.charAt(0) == ':') {
-            // Key to Ex mapping.
-            defaultKeymap.unshift({
-              keys: parseKeyString(lhs),
-              type: 'keyToEx',
-              exArgs: { input: rhs.substring(1) }});
-          } else {
-            // Key to key mapping
-            defaultKeymap.unshift({
-              keys: parseKeyString(lhs),
-              type: 'keyToKey',
-              toKeys: parseKeyString(rhs)
-            });
-          }
-        }
-      }
-    };
-
-    // Converts a key string sequence of the form a<C-w>bd<Left> into Vim's
-    // keymap representation.
-    function parseKeyString(str) {
-      var key, match;
-      var keys = [];
-      while (str) {
-        match = (/<\w+-.+?>|<\w+>|./).exec(str);
-        if(match === null)break;
-        key = match[0];
-        str = str.substring(match.index + key.length);
-        keys.push(key);
-      }
-      return keys;
-    }
-
-    var exCommands = {
-      map: function(cm, params) {
-        var mapArgs = params.args;
-        if (!mapArgs || mapArgs.length < 2) {
-          if (cm) {
-            showConfirm(cm, 'Invalid mapping: ' + params.input);
-          }
-          return;
-        }
-        exCommandDispatcher.map(mapArgs[0], mapArgs[1], cm);
-      },
-      move: function(cm, params) {
-        commandDispatcher.processCommand(cm, getVimState(cm), {
-            type: 'motion',
-            motion: 'moveToLineOrEdgeOfDocument',
-            motionArgs: { forward: false, explicitRepeat: true,
-              linewise: true },
-            repeatOverride: params.line+1});
-      },
-      substitute: function(cm, params) {
-        var argString = params.argString;
-        var slashes = findUnescapedSlashes(argString);
-        if (slashes[0] !== 0) {
-          showConfirm(cm, 'Substitutions should be of the form ' +
-              ':s/pattern/replace/');
-          return;
-        }
-        var regexPart = argString.substring(slashes[0] + 1, slashes[1]);
-        var replacePart = '';
-        var flagsPart;
-        var count;
-        if (slashes[1]) {
-          replacePart = argString.substring(slashes[1] + 1, slashes[2]);
-        }
-        if (slashes[2]) {
-          // After the 3rd slash, we can have flags followed by a space followed
-          // by count.
-          var trailing = argString.substring(slashes[2] + 1).split(' ');
-          flagsPart = trailing[0];
-          count = parseInt(trailing[1]);
-        }
-        if (flagsPart) {
-          regexPart = regexPart + '/' + flagsPart;
-        }
-        if (regexPart) {
-          // If regex part is empty, then use the previous query. Otherwise use
-          // the regex part as the new query.
-          try {
-            updateSearchQuery(cm, regexPart, true /** ignoreCase */,
-              true /** smartCase */);
-          } catch (e) {
-            showConfirm(cm, 'Invalid regex: ' + regexPart);
-            return;
-          }
-        }
-        var state = getSearchState(cm);
-        var query = state.getQuery();
-        var lineStart = params.line || cm.firstLine();
-        var lineEnd = params.lineEnd || lineStart;
-        if (count) {
-          lineStart = lineEnd;
-          lineEnd = lineStart + count - 1;
-        }
-        var startPos = clipCursorToContent(cm, { line: lineStart, ch: 0 });
-        function doReplace() {
-          for (var cursor = cm.getSearchCursor(query, startPos);
-               cursor.findNext() &&
-                   isInRange(cursor.from(), lineStart, lineEnd);) {
-            var text = cm.getRange(cursor.from(), cursor.to());
-            var newText = text.replace(query, replacePart);
-            cursor.replace(newText);
-          }
-          var vim = getVimState(cm);
-          if (vim.visualMode) {
-            exitVisualMode(cm, vim);
-          }
-        }
-        cm.operation(doReplace);
-      },
-      redo: CodeMirror.commands.redo,
-      undo: CodeMirror.commands.undo,
-      write: function(cm) {
-        if (CodeMirror.commands.save) {
-          // If a save command is defined, call it.
-          CodeMirror.commands.save(cm);
-        } else {
-          // Saves to text area if no save command is defined.
-          cm.save();
-        }
-      },
-      nohlsearch: function(cm) {
-        clearSearchHighlight(cm);
-      },
-      delmarks: function(cm, params) {
-        if (!params.argString || !params.argString.trim()) {
-          showConfirm(cm, 'Argument required');
-          return;
-        }
-
-        var state = getVimState(cm);
-        var stream = new CodeMirror.StringStream(params.argString.trim());
-        while (!stream.eol()) {
-          stream.eatSpace();
-
-          // Record the streams position at the beginning of the loop for use
-          // in error messages.
-          var count = stream.pos;
-
-          if (!stream.match(/[a-zA-Z]/, false)) {
-            showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));
-            return;
-          }
-
-          var sym = stream.next();
-          // Check if this symbol is part of a range
-          if (stream.match('-', true)) {
-            // This symbol is part of a range.
-
-            // The range must terminate at an alphabetic character.
-            if (!stream.match(/[a-zA-Z]/, false)) {
-              showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));
-              return;
-            }
-
-            var startMark = sym;
-            var finishMark = stream.next();
-            // The range must terminate at an alphabetic character which
-            // shares the same case as the start of the range.
-            if (isLowerCase(startMark) && isLowerCase(finishMark) ||
-                isUpperCase(startMark) && isUpperCase(finishMark)) {
-              var start = startMark.charCodeAt(0);
-              var finish = finishMark.charCodeAt(0);
-              if (start >= finish) {
-                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));
-                return;
-              }
-
-              // Because marks are always ASCII values, and we have
-              // determined that they are the same case, we can use
-              // their char codes to iterate through the defined range.
-              for (var j = 0; j <= finish - start; j++) {
-                var mark = String.fromCharCode(start + j);
-                delete state.marks[mark];
-              }
-            } else {
-              showConfirm(cm, 'Invalid argument: ' + startMark + "-");
-              return;
-            }
-          } else {
-            // This symbol is a valid mark, and is not part of a range.
-            delete state.marks[sym];
-          }
-        }
-      }
-    };
-
-    var exCommandDispatcher = new Vim.ExCommandDispatcher();
-
-    // Register Vim with CodeMirror
-    function buildVimKeyMap() {
-      /**
-       * Handle the raw key event from CodeMirror. Translate the
-       * Shift + key modifier to the resulting letter, while preserving other
-       * modifers.
-       */
-      // TODO: Figure out a way to catch capslock.
-      function cmKeyToVimKey(key, modifier) {
-        var vimKey = key;
-        if (isUpperCase(vimKey)) {
-          // Convert to lower case if shift is not the modifier since the key
-          // we get from CodeMirror is always upper case.
-          if (modifier == 'Shift') {
-            modifier = null;
-          }
-          else {
-            vimKey = vimKey.toLowerCase();
-          }
-        }
-        if (modifier) {
-          // Vim will parse modifier+key combination as a single key.
-          vimKey = modifier.charAt(0) + '-' + vimKey;
-        }
-        var specialKey = ({Enter:'CR',Backspace:'BS',Delete:'Del'})[vimKey];
-        vimKey = specialKey ? specialKey : vimKey;
-        vimKey = vimKey.length > 1 ? '<'+ vimKey + '>' : vimKey;
-        return vimKey;
-      }
-
-      // Closure to bind CodeMirror, key, modifier.
-      function keyMapper(vimKey) {
-        return function(cm) {
-          vim.handleKey(cm, vimKey);
-        };
-      }
-
-      var modifiers = ['Shift', 'Ctrl'];
-      var cmToVimKeymap = {
-        'nofallthrough': true,
-        'style': 'fat-cursor'
-      };
-      function bindKeys(keys, modifier) {
-        for (var i = 0; i < keys.length; i++) {
-          var key = keys[i];
-          if (!modifier && inArray(key, specialSymbols)) {
-            // Wrap special symbols with '' because that's how CodeMirror binds
-            // them.
-            key = "'" + key + "'";
-          }
-          var vimKey = cmKeyToVimKey(keys[i], modifier);
-          var cmKey = modifier ? modifier + '-' + key : key;
-          cmToVimKeymap[cmKey] = keyMapper(vimKey);
-        }
-      }
-      bindKeys(upperCaseAlphabet);
-      bindKeys(upperCaseAlphabet, 'Shift');
-      bindKeys(upperCaseAlphabet, 'Ctrl');
-      bindKeys(specialSymbols);
-      bindKeys(specialSymbols, 'Ctrl');
-      bindKeys(numbers);
-      bindKeys(numbers, 'Ctrl');
-      bindKeys(specialKeys);
-      bindKeys(specialKeys, 'Ctrl');
-      return cmToVimKeymap;
-    }
-    CodeMirror.keyMap.vim = buildVimKeyMap();
-
-    function exitInsertMode(cm) {
-      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
-      cm.setOption('keyMap', 'vim');
-    }
-
-    CodeMirror.keyMap['vim-insert'] = {
-      // TODO: override navigation keys so that Esc will cancel automatic
-      // indentation from o, O, i_<CR>
-      'Esc': exitInsertMode,
-      'Ctrl-[': exitInsertMode,
-      'Ctrl-C': exitInsertMode,
-      'Ctrl-N': 'autocomplete',
-      'Ctrl-P': 'autocomplete',
-      'Enter': function(cm) {
-        var fn = CodeMirror.commands.newlineAndIndentContinueComment ||
-            CodeMirror.commands.newlineAndIndent;
-        fn(cm);
-      },
-      fallthrough: ['default']
-    };
-
-    function parseRegisterToKeyBuffer(macroModeState, registerName) {
-      var match, key;
-      var register = getVimGlobalState().registerController.getRegister(registerName);
-      var text = register.toString();
-      var macroKeyBuffer = macroModeState.macroKeyBuffer;
-      emptyMacroKeyBuffer(macroModeState);
-      do {
-        match = text.match(/<\w+-.+>|<\w+>|.|\n/);
-        if(match === null)break;
-        key = match[0];
-        text = text.substring(match.index + key.length);
-        macroKeyBuffer.push(key);
-      } while (text);
-      return macroKeyBuffer;
-    }
-
-    function parseKeyBufferToRegister(registerName, keyBuffer) {
-      var text = keyBuffer.join('');
-      getVimGlobalState().registerController.setRegisterText(registerName, text);
-    }
-
-    function emptyMacroKeyBuffer(macroModeState) {
-      if(macroModeState.isMacroPlaying)return;
-      var macroKeyBuffer = macroModeState.macroKeyBuffer;
-      macroKeyBuffer.length = 0;
-    }
-
-    function executeMacroKeyBuffer(cm, macroModeState, keyBuffer) {
-      macroModeState.isMacroPlaying = true;
-      for (var i = 0, len = keyBuffer.length; i < len; i++) {
-        CodeMirror.Vim.handleKey(cm, keyBuffer[i]);
-      };
-      macroModeState.isMacroPlaying = false;
-    }
-
-    function logKey(macroModeState, key) {
-      if(macroModeState.isMacroPlaying)return;
-      var macroKeyBuffer = macroModeState.macroKeyBuffer;
-      macroKeyBuffer.push(key);
-    }
-
-    function exitReplaceMode(cm) {
-      cm.toggleOverwrite();
-      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
-      cm.setOption('keyMap', 'vim');
-    }
-
-    CodeMirror.keyMap['vim-replace'] = {
-      'Esc': exitReplaceMode,
-      'Ctrl-[': exitReplaceMode,
-      'Ctrl-C': exitReplaceMode,
-      'Backspace': 'goCharLeft',
-      fallthrough: ['default']
-    };
-
-    return vimApi;
-  };
-  // Initialize Vim and make it available as an API.
-  var vim = Vim();
-  CodeMirror.Vim = vim;
-}
-)();
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/index.html
deleted file mode 100644 (file)
index 5f90394..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: C-like mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../../addon/edit/matchbrackets.js"></script>
-    <script src="clike.js"></script>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <style>.CodeMirror {border: 2px inset #dee;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror: C-like mode</h1>
-
-<form><textarea id="code" name="code">
-/* C demo code */
-
-#include <zmq.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <time.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <malloc.h>
-
-typedef struct {
-  void* arg_socket;
-  zmq_msg_t* arg_msg;
-  char* arg_string;
-  unsigned long arg_len;
-  int arg_int, arg_command;
-
-  int signal_fd;
-  int pad;
-  void* context;
-  sem_t sem;
-} acl_zmq_context;
-
-#define p(X) (context->arg_##X)
-
-void* zmq_thread(void* context_pointer) {
-  acl_zmq_context* context = (acl_zmq_context*)context_pointer;
-  char ok = 'K', err = 'X';
-  int res;
-
-  while (1) {
-    while ((res = sem_wait(&amp;context->sem)) == EINTR);
-    if (res) {write(context->signal_fd, &amp;err, 1); goto cleanup;}
-    switch(p(command)) {
-    case 0: goto cleanup;
-    case 1: p(socket) = zmq_socket(context->context, p(int)); break;
-    case 2: p(int) = zmq_close(p(socket)); break;
-    case 3: p(int) = zmq_bind(p(socket), p(string)); break;
-    case 4: p(int) = zmq_connect(p(socket), p(string)); break;
-    case 5: p(int) = zmq_getsockopt(p(socket), p(int), (void*)p(string), &amp;p(len)); break;
-    case 6: p(int) = zmq_setsockopt(p(socket), p(int), (void*)p(string), p(len)); break;
-    case 7: p(int) = zmq_send(p(socket), p(msg), p(int)); break;
-    case 8: p(int) = zmq_recv(p(socket), p(msg), p(int)); break;
-    case 9: p(int) = zmq_poll(p(socket), p(int), p(len)); break;
-    }
-    p(command) = errno;
-    write(context->signal_fd, &amp;ok, 1);
-  }
- cleanup:
-  close(context->signal_fd);
-  free(context_pointer);
-  return 0;
-}
-
-void* zmq_thread_init(void* zmq_context, int signal_fd) {
-  acl_zmq_context* context = malloc(sizeof(acl_zmq_context));
-  pthread_t thread;
-
-  context->context = zmq_context;
-  context->signal_fd = signal_fd;
-  sem_init(&amp;context->sem, 1, 0);
-  pthread_create(&amp;thread, 0, &amp;zmq_thread, context);
-  pthread_detach(thread);
-  return context;
-}
-</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        mode: "text/x-csrc"
-      });
-    </script>
-
-    <p>Simple mode that tries to handle C-like languages as well as it
-    can. Takes two configuration parameters: <code>keywords</code>, an
-    object whose property names are the keywords in the language,
-    and <code>useCPP</code>, which determines whether C preprocessor
-    directives are recognized.</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-csrc</code>
-    (C code), <code>text/x-c++src</code> (C++
-    code), <code>text/x-java</code> (Java
-    code), <code>text/x-csharp</code> (C#).</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/scala.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/clike/scala.html
deleted file mode 100644 (file)
index f3c7eea..0000000
+++ /dev/null
@@ -1,767 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: C-like mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <link rel="stylesheet" href="../../theme/ambiance.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../../addon/edit/matchbrackets.js"></script>
-    <script src="clike.js"></script>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <style>
-      body
-      {
-        margin: 0;
-        padding: 0;
-        max-width:inherit;
-        height: 100%;
-      }
-      html, form, .CodeMirror, .CodeMirror-scroll
-      {
-        height: 100%;        
-      }
-    </style>
-  </head>
-  <body>
-<form>
-<textarea id="code" name="code">
-
-  /*                     __                                               *\
-  **     ________ ___   / /  ___     Scala API                            **
-  **    / __/ __// _ | / /  / _ |    (c) 2003-2011, LAMP/EPFL             **
-  **  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
-  ** /____/\___/_/ |_/____/_/ | |                                         **
-  **                          |/                                          **
-  \*                                                                      */
-
-  package scala.collection
-
-  import generic._
-  import mutable.{ Builder, ListBuffer }
-  import annotation.{tailrec, migration, bridge}
-  import annotation.unchecked.{ uncheckedVariance => uV }
-  import parallel.ParIterable
-
-  /** A template trait for traversable collections of type `Traversable[A]`.
-   *  
-   *  $traversableInfo
-   *  @define mutability
-   *  @define traversableInfo
-   *  This is a base trait of all kinds of $mutability Scala collections. It
-   *  implements the behavior common to all collections, in terms of a method
-   *  `foreach` with signature:
-   * {{{
-   *     def foreach[U](f: Elem => U): Unit
-   * }}}
-   *  Collection classes mixing in this trait provide a concrete 
-   *  `foreach` method which traverses all the
-   *  elements contained in the collection, applying a given function to each.
-   *  They also need to provide a method `newBuilder`
-   *  which creates a builder for collections of the same kind.
-   *  
-   *  A traversable class might or might not have two properties: strictness
-   *  and orderedness. Neither is represented as a type.
-   *  
-   *  The instances of a strict collection class have all their elements
-   *  computed before they can be used as values. By contrast, instances of
-   *  a non-strict collection class may defer computation of some of their
-   *  elements until after the instance is available as a value.
-   *  A typical example of a non-strict collection class is a
-   *  <a href="../immutable/Stream.html" target="ContentFrame">
-   *  `scala.collection.immutable.Stream`</a>.
-   *  A more general class of examples are `TraversableViews`.
-   *  
-   *  If a collection is an instance of an ordered collection class, traversing
-   *  its elements with `foreach` will always visit elements in the
-   *  same order, even for different runs of the program. If the class is not
-   *  ordered, `foreach` can visit elements in different orders for
-   *  different runs (but it will keep the same order in the same run).'
-   * 
-   *  A typical example of a collection class which is not ordered is a
-   *  `HashMap` of objects. The traversal order for hash maps will
-   *  depend on the hash codes of its elements, and these hash codes might
-   *  differ from one run to the next. By contrast, a `LinkedHashMap`
-   *  is ordered because it's `foreach` method visits elements in the
-   *  order they were inserted into the `HashMap`.
-   *
-   *  @author Martin Odersky
-   *  @version 2.8
-   *  @since   2.8
-   *  @tparam A    the element type of the collection
-   *  @tparam Repr the type of the actual collection containing the elements.
-   *
-   *  @define Coll Traversable
-   *  @define coll traversable collection
-   */
-  trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] 
-                                      with FilterMonadic[A, Repr]
-                                      with TraversableOnce[A]
-                                      with GenTraversableLike[A, Repr]
-                                      with Parallelizable[A, ParIterable[A]]
-  {
-    self =>
-
-    import Traversable.breaks._
-
-    /** The type implementing this traversable */
-    protected type Self = Repr
-
-    /** The collection of type $coll underlying this `TraversableLike` object.
-     *  By default this is implemented as the `TraversableLike` object itself,
-     *  but this can be overridden.
-     */
-    def repr: Repr = this.asInstanceOf[Repr]
-
-    /** The underlying collection seen as an instance of `$Coll`.
-     *  By default this is implemented as the current collection object itself,
-     *  but this can be overridden.
-     */
-    protected[this] def thisCollection: Traversable[A] = this.asInstanceOf[Traversable[A]]
-
-    /** A conversion from collections of type `Repr` to `$Coll` objects.
-     *  By default this is implemented as just a cast, but this can be overridden.
-     */
-    protected[this] def toCollection(repr: Repr): Traversable[A] = repr.asInstanceOf[Traversable[A]]
-
-    /** Creates a new builder for this collection type.
-     */
-    protected[this] def newBuilder: Builder[A, Repr]
-
-    protected[this] def parCombiner = ParIterable.newCombiner[A]
-
-    /** Applies a function `f` to all elements of this $coll.
-     *  
-     *    Note: this method underlies the implementation of most other bulk operations.
-     *    It's important to implement this method in an efficient way.
-     *  
-     *
-     *  @param  f   the function that is applied for its side-effect to every element.
-     *              The result of function `f` is discarded.
-     *              
-     *  @tparam  U  the type parameter describing the result of function `f`. 
-     *              This result will always be ignored. Typically `U` is `Unit`,
-     *              but this is not necessary.
-     *
-     *  @usecase def foreach(f: A => Unit): Unit
-     */
-    def foreach[U](f: A => U): Unit
-
-    /** Tests whether this $coll is empty.
-     *
-     *  @return    `true` if the $coll contain no elements, `false` otherwise.
-     */
-    def isEmpty: Boolean = {
-      var result = true
-      breakable {
-        for (x <- this) {
-          result = false
-          break
-        }
-      }
-      result
-    }
-
-    /** Tests whether this $coll is known to have a finite size.
-     *  All strict collections are known to have finite size. For a non-strict collection
-     *  such as `Stream`, the predicate returns `true` if all elements have been computed.
-     *  It returns `false` if the stream is not yet evaluated to the end.
-     *
-     *  Note: many collection methods will not work on collections of infinite sizes. 
-     *
-     *  @return  `true` if this collection is known to have finite size, `false` otherwise.
-     */
-    def hasDefiniteSize = true
-
-    def ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.seq.size)
-      b ++= thisCollection
-      b ++= that.seq
-      b.result
-    }
-
-    @bridge
-    def ++[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That =
-      ++(that: GenTraversableOnce[B])(bf)
-
-    /** Concatenates this $coll with the elements of a traversable collection.
-     *  It differs from ++ in that the right operand determines the type of the
-     *  resulting collection rather than the left one.
-     * 
-     *  @param that   the traversable to append.
-     *  @tparam B     the element type of the returned collection. 
-     *  @tparam That  $thatinfo
-     *  @param bf     $bfinfo
-     *  @return       a new collection of type `That` which contains all elements
-     *                of this $coll followed by all elements of `that`.
-     * 
-     *  @usecase def ++:[B](that: TraversableOnce[B]): $Coll[B]
-     *  
-     *  @return       a new $coll which contains all elements of this $coll
-     *                followed by all elements of `that`.
-     */
-    def ++:[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.size)
-      b ++= that
-      b ++= thisCollection
-      b.result
-    }
-
-    /** This overload exists because: for the implementation of ++: we should reuse
-     *  that of ++ because many collections override it with more efficient versions.
-     *  Since TraversableOnce has no '++' method, we have to implement that directly,
-     *  but Traversable and down can use the overload.
-     */
-    def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That =
-      (that ++ seq)(breakOut)
-
-    def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      b.sizeHint(this) 
-      for (x <- this) b += f(x)
-      b.result
-    }
-
-    def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      for (x <- this) b ++= f(x).seq
-      b.result
-    }
-
-    /** Selects all elements of this $coll which satisfy a predicate.
-     *
-     *  @param p     the predicate used to test elements.
-     *  @return      a new $coll consisting of all elements of this $coll that satisfy the given
-     *               predicate `p`. The order of the elements is preserved.
-     */
-    def filter(p: A => Boolean): Repr = {
-      val b = newBuilder
-      for (x <- this) 
-        if (p(x)) b += x
-      b.result
-    }
-
-    /** Selects all elements of this $coll which do not satisfy a predicate.
-     *
-     *  @param p     the predicate used to test elements.
-     *  @return      a new $coll consisting of all elements of this $coll that do not satisfy the given
-     *               predicate `p`. The order of the elements is preserved.
-     */
-    def filterNot(p: A => Boolean): Repr = filter(!p(_))
-
-    def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      for (x <- this) if (pf.isDefinedAt(x)) b += pf(x)
-      b.result
-    }
-
-    /** Builds a new collection by applying an option-valued function to all
-     *  elements of this $coll on which the function is defined.
-     *
-     *  @param f      the option-valued function which filters and maps the $coll.
-     *  @tparam B     the element type of the returned collection.
-     *  @tparam That  $thatinfo
-     *  @param bf     $bfinfo
-     *  @return       a new collection of type `That` resulting from applying the option-valued function
-     *                `f` to each element and collecting all defined results.
-     *                The order of the elements is preserved.
-     *
-     *  @usecase def filterMap[B](f: A => Option[B]): $Coll[B]
-     *  
-     *  @param pf     the partial function which filters and maps the $coll.
-     *  @return       a new $coll resulting from applying the given option-valued function
-     *                `f` to each element and collecting all defined results.
-     *                The order of the elements is preserved.
-    def filterMap[B, That](f: A => Option[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      for (x <- this) 
-        f(x) match {
-          case Some(y) => b += y
-          case _ =>
-        }
-      b.result
-    }
-     */
-
-    /** Partitions this $coll in two ${coll}s according to a predicate.
-     *
-     *  @param p the predicate on which to partition.
-     *  @return  a pair of ${coll}s: the first $coll consists of all elements that 
-     *           satisfy the predicate `p` and the second $coll consists of all elements
-     *           that don't. The relative order of the elements in the resulting ${coll}s
-     *           is the same as in the original $coll.
-     */
-    def partition(p: A => Boolean): (Repr, Repr) = {
-      val l, r = newBuilder
-      for (x <- this) (if (p(x)) l else r) += x
-      (l.result, r.result)
-    }
-
-    def groupBy[K](f: A => K): immutable.Map[K, Repr] = {
-      val m = mutable.Map.empty[K, Builder[A, Repr]]
-      for (elem <- this) {
-        val key = f(elem)
-        val bldr = m.getOrElseUpdate(key, newBuilder)
-        bldr += elem
-      }
-      val b = immutable.Map.newBuilder[K, Repr]
-      for ((k, v) <- m)
-        b += ((k, v.result))
-
-      b.result
-    }
-
-    /** Tests whether a predicate holds for all elements of this $coll.
-     *
-     *  $mayNotTerminateInf
-     *
-     *  @param   p     the predicate used to test elements.
-     *  @return        `true` if the given predicate `p` holds for all elements
-     *                 of this $coll, otherwise `false`.
-     */
-    def forall(p: A => Boolean): Boolean = {
-      var result = true
-      breakable {
-        for (x <- this)
-          if (!p(x)) { result = false; break }
-      }
-      result
-    }
-
-    /** Tests whether a predicate holds for some of the elements of this $coll.
-     *
-     *  $mayNotTerminateInf
-     *
-     *  @param   p     the predicate used to test elements.
-     *  @return        `true` if the given predicate `p` holds for some of the
-     *                 elements of this $coll, otherwise `false`.
-     */
-    def exists(p: A => Boolean): Boolean = {
-      var result = false
-      breakable {
-        for (x <- this)
-          if (p(x)) { result = true; break }
-      }
-      result
-    }
-
-    /** Finds the first element of the $coll satisfying a predicate, if any.
-     * 
-     *  $mayNotTerminateInf
-     *  $orderDependent
-     *
-     *  @param p    the predicate used to test elements.
-     *  @return     an option value containing the first element in the $coll
-     *              that satisfies `p`, or `None` if none exists.
-     */
-    def find(p: A => Boolean): Option[A] = {
-      var result: Option[A] = None
-      breakable {
-        for (x <- this)
-          if (p(x)) { result = Some(x); break }
-      }
-      result
-    }
-
-    def scan[B >: A, That](z: B)(op: (B, B) => B)(implicit cbf: CanBuildFrom[Repr, B, That]): That = scanLeft(z)(op)
-
-    def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      val b = bf(repr)
-      b.sizeHint(this, 1)
-      var acc = z
-      b += acc
-      for (x <- this) { acc = op(acc, x); b += acc }
-      b.result
-    }
-
-    @migration(2, 9,
-      "This scanRight definition has changed in 2.9.\n" +
-      "The previous behavior can be reproduced with scanRight.reverse."
-    )
-    def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-      var scanned = List(z)
-      var acc = z
-      for (x <- reversed) {
-        acc = op(x, acc)
-        scanned ::= acc
-      }
-      val b = bf(repr)
-      for (elem <- scanned) b += elem
-      b.result
-    }
-
-    /** Selects the first element of this $coll.
-     *  $orderDependent
-     *  @return  the first element of this $coll.
-     *  @throws `NoSuchElementException` if the $coll is empty.
-     */
-    def head: A = {
-      var result: () => A = () => throw new NoSuchElementException
-      breakable {
-        for (x <- this) {
-          result = () => x
-          break
-        }
-      }
-      result()
-    }
-
-    /** Optionally selects the first element.
-     *  $orderDependent
-     *  @return  the first element of this $coll if it is nonempty, `None` if it is empty.
-     */
-    def headOption: Option[A] = if (isEmpty) None else Some(head)
-
-    /** Selects all elements except the first.
-     *  $orderDependent
-     *  @return  a $coll consisting of all elements of this $coll
-     *           except the first one.
-     *  @throws `UnsupportedOperationException` if the $coll is empty.
-     */ 
-    override def tail: Repr = {
-      if (isEmpty) throw new UnsupportedOperationException("empty.tail")
-      drop(1)
-    }
-
-    /** Selects the last element.
-      * $orderDependent
-      * @return The last element of this $coll.
-      * @throws NoSuchElementException If the $coll is empty.
-      */
-    def last: A = {
-      var lst = head
-      for (x <- this)
-        lst = x
-      lst
-    }
-
-    /** Optionally selects the last element.
-     *  $orderDependent
-     *  @return  the last element of this $coll$ if it is nonempty, `None` if it is empty.
-     */
-    def lastOption: Option[A] = if (isEmpty) None else Some(last)
-
-    /** Selects all elements except the last.
-     *  $orderDependent
-     *  @return  a $coll consisting of all elements of this $coll
-     *           except the last one.
-     *  @throws `UnsupportedOperationException` if the $coll is empty.
-     */
-    def init: Repr = {
-      if (isEmpty) throw new UnsupportedOperationException("empty.init")
-      var lst = head
-      var follow = false
-      val b = newBuilder
-      b.sizeHint(this, -1)
-      for (x <- this.seq) {
-        if (follow) b += lst
-        else follow = true
-        lst = x
-      }
-      b.result
-    }
-
-    def take(n: Int): Repr = slice(0, n)
-
-    def drop(n: Int): Repr = 
-      if (n <= 0) {
-        val b = newBuilder
-        b.sizeHint(this)
-        b ++= thisCollection result
-      }
-      else sliceWithKnownDelta(n, Int.MaxValue, -n)
-
-    def slice(from: Int, until: Int): Repr = sliceWithKnownBound(math.max(from, 0), until)
-
-    // Precondition: from >= 0, until > 0, builder already configured for building.
-    private[this] def sliceInternal(from: Int, until: Int, b: Builder[A, Repr]): Repr = {
-      var i = 0
-      breakable {
-        for (x <- this.seq) {
-          if (i >= from) b += x
-          i += 1
-          if (i >= until) break
-        }
-      }
-      b.result
-    }
-    // Precondition: from >= 0
-    private[scala] def sliceWithKnownDelta(from: Int, until: Int, delta: Int): Repr = {
-      val b = newBuilder
-      if (until <= from) b.result
-      else {
-        b.sizeHint(this, delta)
-        sliceInternal(from, until, b)
-      }
-    }
-    // Precondition: from >= 0
-    private[scala] def sliceWithKnownBound(from: Int, until: Int): Repr = {
-      val b = newBuilder
-      if (until <= from) b.result
-      else {
-        b.sizeHintBounded(until - from, this)      
-        sliceInternal(from, until, b)
-      }
-    }
-
-    def takeWhile(p: A => Boolean): Repr = {
-      val b = newBuilder
-      breakable {
-        for (x <- this) {
-          if (!p(x)) break
-          b += x
-        }
-      }
-      b.result
-    }
-
-    def dropWhile(p: A => Boolean): Repr = {
-      val b = newBuilder
-      var go = false
-      for (x <- this) {
-        if (!p(x)) go = true
-        if (go) b += x
-      }
-      b.result
-    }
-
-    def span(p: A => Boolean): (Repr, Repr) = {
-      val l, r = newBuilder
-      var toLeft = true
-      for (x <- this) {
-        toLeft = toLeft && p(x)
-        (if (toLeft) l else r) += x
-      }
-      (l.result, r.result)
-    }
-
-    def splitAt(n: Int): (Repr, Repr) = {
-      val l, r = newBuilder
-      l.sizeHintBounded(n, this)
-      if (n >= 0) r.sizeHint(this, -n)
-      var i = 0
-      for (x <- this) {
-        (if (i < n) l else r) += x
-        i += 1
-      }
-      (l.result, r.result)
-    }
-
-    /** Iterates over the tails of this $coll. The first value will be this
-     *  $coll and the final one will be an empty $coll, with the intervening
-     *  values the results of successive applications of `tail`.
-     *
-     *  @return   an iterator over all the tails of this $coll
-     *  @example  `List(1,2,3).tails = Iterator(List(1,2,3), List(2,3), List(3), Nil)`
-     */  
-    def tails: Iterator[Repr] = iterateUntilEmpty(_.tail)
-
-    /** Iterates over the inits of this $coll. The first value will be this
-     *  $coll and the final one will be an empty $coll, with the intervening
-     *  values the results of successive applications of `init`.
-     *
-     *  @return  an iterator over all the inits of this $coll
-     *  @example  `List(1,2,3).inits = Iterator(List(1,2,3), List(1,2), List(1), Nil)`
-     */
-    def inits: Iterator[Repr] = iterateUntilEmpty(_.init)
-
-    /** Copies elements of this $coll to an array.
-     *  Fills the given array `xs` with at most `len` elements of
-     *  this $coll, starting at position `start`.
-     *  Copying will stop once either the end of the current $coll is reached,
-     *  or the end of the array is reached, or `len` elements have been copied.
-     *
-     *  $willNotTerminateInf
-     * 
-     *  @param  xs     the array to fill.
-     *  @param  start  the starting index.
-     *  @param  len    the maximal number of elements to copy.
-     *  @tparam B      the type of the elements of the array. 
-     * 
-     *
-     *  @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit
-     */
-    def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
-      var i = start
-      val end = (start + len) min xs.length
-      breakable {
-        for (x <- this) {
-          if (i >= end) break
-          xs(i) = x
-          i += 1
-        }
-      }
-    }
-
-    def toTraversable: Traversable[A] = thisCollection
-    def toIterator: Iterator[A] = toStream.iterator
-    def toStream: Stream[A] = toBuffer.toStream
-
-    /** Converts this $coll to a string.
-     *
-     *  @return   a string representation of this collection. By default this
-     *            string consists of the `stringPrefix` of this $coll,
-     *            followed by all elements separated by commas and enclosed in parentheses.
-     */
-    override def toString = mkString(stringPrefix + "(", ", ", ")")
-
-    /** Defines the prefix of this object's `toString` representation.
-     *
-     *  @return  a string representation which starts the result of `toString`
-     *           applied to this $coll. By default the string prefix is the
-     *           simple name of the collection class $coll.
-     */
-    def stringPrefix : String = {
-      var string = repr.asInstanceOf[AnyRef].getClass.getName
-      val idx1 = string.lastIndexOf('.' : Int)
-      if (idx1 != -1) string = string.substring(idx1 + 1)
-      val idx2 = string.indexOf('$')
-      if (idx2 != -1) string = string.substring(0, idx2)
-      string
-    }
-
-    /** Creates a non-strict view of this $coll.
-     * 
-     *  @return a non-strict view of this $coll.
-     */
-    def view = new TraversableView[A, Repr] {
-      protected lazy val underlying = self.repr
-      override def foreach[U](f: A => U) = self foreach f
-    }
-
-    /** Creates a non-strict view of a slice of this $coll.
-     *
-     *  Note: the difference between `view` and `slice` is that `view` produces
-     *        a view of the current $coll, whereas `slice` produces a new $coll.
-     * 
-     *  Note: `view(from, to)` is equivalent to `view.slice(from, to)`
-     *  $orderDependent
-     * 
-     *  @param from   the index of the first element of the view
-     *  @param until  the index of the element following the view
-     *  @return a non-strict view of a slice of this $coll, starting at index `from`
-     *  and extending up to (but not including) index `until`.
-     */
-    def view(from: Int, until: Int): TraversableView[A, Repr] = view.slice(from, until)
-
-    /** Creates a non-strict filter of this $coll.
-     *
-     *  Note: the difference between `c filter p` and `c withFilter p` is that
-     *        the former creates a new collection, whereas the latter only
-     *        restricts the domain of subsequent `map`, `flatMap`, `foreach`,
-     *        and `withFilter` operations.
-     *  $orderDependent
-     * 
-     *  @param p   the predicate used to test elements.
-     *  @return    an object of class `WithFilter`, which supports
-     *             `map`, `flatMap`, `foreach`, and `withFilter` operations.
-     *             All these operations apply to those elements of this $coll which
-     *             satisfy the predicate `p`.
-     */
-    def withFilter(p: A => Boolean): FilterMonadic[A, Repr] = new WithFilter(p)
-
-    /** A class supporting filtered operations. Instances of this class are
-     *  returned by method `withFilter`.
-     */
-    class WithFilter(p: A => Boolean) extends FilterMonadic[A, Repr] {
-
-      /** Builds a new collection by applying a function to all elements of the
-       *  outer $coll containing this `WithFilter` instance that satisfy predicate `p`.
-       *
-       *  @param f      the function to apply to each element.
-       *  @tparam B     the element type of the returned collection.
-       *  @tparam That  $thatinfo
-       *  @param bf     $bfinfo
-       *  @return       a new collection of type `That` resulting from applying
-       *                the given function `f` to each element of the outer $coll
-       *                that satisfies predicate `p` and collecting the results.
-       *
-       *  @usecase def map[B](f: A => B): $Coll[B] 
-       *  
-       *  @return       a new $coll resulting from applying the given function
-       *                `f` to each element of the outer $coll that satisfies
-       *                predicate `p` and collecting the results.
-       */
-      def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-        val b = bf(repr)
-        for (x <- self) 
-          if (p(x)) b += f(x)
-        b.result
-      }
-
-      /** Builds a new collection by applying a function to all elements of the
-       *  outer $coll containing this `WithFilter` instance that satisfy
-       *  predicate `p` and concatenating the results. 
-       *
-       *  @param f      the function to apply to each element.
-       *  @tparam B     the element type of the returned collection.
-       *  @tparam That  $thatinfo
-       *  @param bf     $bfinfo
-       *  @return       a new collection of type `That` resulting from applying
-       *                the given collection-valued function `f` to each element
-       *                of the outer $coll that satisfies predicate `p` and
-       *                concatenating the results.
-       *
-       *  @usecase def flatMap[B](f: A => TraversableOnce[B]): $Coll[B]
-       * 
-       *  @return       a new $coll resulting from applying the given collection-valued function
-       *                `f` to each element of the outer $coll that satisfies predicate `p` and concatenating the results.
-       */
-      def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
-        val b = bf(repr)
-        for (x <- self) 
-          if (p(x)) b ++= f(x).seq
-        b.result
-      }
-
-      /** Applies a function `f` to all elements of the outer $coll containing
-       *  this `WithFilter` instance that satisfy predicate `p`.
-       *
-       *  @param  f   the function that is applied for its side-effect to every element.
-       *              The result of function `f` is discarded.
-       *              
-       *  @tparam  U  the type parameter describing the result of function `f`. 
-       *              This result will always be ignored. Typically `U` is `Unit`,
-       *              but this is not necessary.
-       *
-       *  @usecase def foreach(f: A => Unit): Unit
-       */   
-      def foreach[U](f: A => U): Unit = 
-        for (x <- self) 
-          if (p(x)) f(x)
-
-      /** Further refines the filter for this $coll.
-       *
-       *  @param q   the predicate used to test elements.
-       *  @return    an object of class `WithFilter`, which supports
-       *             `map`, `flatMap`, `foreach`, and `withFilter` operations.
-       *             All these operations apply to those elements of this $coll which
-       *             satisfy the predicate `q` in addition to the predicate `p`.
-       */
-      def withFilter(q: A => Boolean): WithFilter = 
-        new WithFilter(x => p(x) && q(x))
-    }
-
-    // A helper for tails and inits.
-    private def iterateUntilEmpty(f: Traversable[A @uV] => Traversable[A @uV]): Iterator[Repr] = {
-      val it = Iterator.iterate(thisCollection)(f) takeWhile (x => !x.isEmpty)
-      it ++ Iterator(Nil) map (newBuilder ++= _ result)
-    }
-  }
-
-
-</textarea>
-</form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        theme: "ambiance",
-        mode: "text/x-scala"
-      });
-    </script>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/coffeescript/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/coffeescript/index.html
deleted file mode 100644 (file)
index ee72b8d..0000000
+++ /dev/null
@@ -1,728 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: CoffeeScript mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="coffeescript.js"></script>
-    <style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: CoffeeScript mode</h1>
-    <form><textarea id="code" name="code">
-# CoffeeScript mode for CodeMirror
-# Copyright (c) 2011 Jeff Pickhardt, released under
-# the MIT License.
-#
-# Modified from the Python CodeMirror mode, which also is 
-# under the MIT License Copyright (c) 2010 Timothy Farrell.
-#
-# The following script, Underscore.coffee, is used to 
-# demonstrate CoffeeScript mode for CodeMirror.
-#
-# To download CoffeeScript mode for CodeMirror, go to:
-# https://github.com/pickhardt/coffeescript-codemirror-mode
-
-# **Underscore.coffee
-# (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.**
-# Underscore is freely distributable under the terms of the
-# [MIT license](http://en.wikipedia.org/wiki/MIT_License).
-# Portions of Underscore are inspired by or borrowed from
-# [Prototype.js](http://prototypejs.org/api), Oliver Steele's
-# [Functional](http://osteele.com), and John Resig's
-# [Micro-Templating](http://ejohn.org).
-# For all details and documentation:
-# http://documentcloud.github.com/underscore/
-
-
-# Baseline setup
-# --------------
-
-# Establish the root object, `window` in the browser, or `global` on the server.
-root = this
-
-
-# Save the previous value of the `_` variable.
-previousUnderscore = root._
-
-### Multiline
-    comment
-###
-
-# Establish the object that gets thrown to break out of a loop iteration.
-# `StopIteration` is SOP on Mozilla.
-breaker = if typeof(StopIteration) is 'undefined' then '__break__' else StopIteration
-
-
-#### Docco style single line comment (title)
-
-
-# Helper function to escape **RegExp** contents, because JS doesn't have one.
-escapeRegExp = (string) -> string.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1')
-
-
-# Save bytes in the minified (but not gzipped) version:
-ArrayProto = Array.prototype
-ObjProto = Object.prototype
-
-
-# Create quick reference variables for speed access to core prototypes.
-slice = ArrayProto.slice
-unshift = ArrayProto.unshift
-toString = ObjProto.toString
-hasOwnProperty = ObjProto.hasOwnProperty
-propertyIsEnumerable = ObjProto.propertyIsEnumerable
-
-
-# All **ECMA5** native implementations we hope to use are declared here.
-nativeForEach = ArrayProto.forEach
-nativeMap = ArrayProto.map
-nativeReduce = ArrayProto.reduce
-nativeReduceRight = ArrayProto.reduceRight
-nativeFilter = ArrayProto.filter
-nativeEvery = ArrayProto.every
-nativeSome = ArrayProto.some
-nativeIndexOf = ArrayProto.indexOf
-nativeLastIndexOf = ArrayProto.lastIndexOf
-nativeIsArray = Array.isArray
-nativeKeys = Object.keys
-
-
-# Create a safe reference to the Underscore object for use below.
-_ = (obj) -> new wrapper(obj)
-
-
-# Export the Underscore object for **CommonJS**.
-if typeof(exports) != 'undefined' then exports._ = _
-
-
-# Export Underscore to global scope.
-root._ = _
-
-
-# Current version.
-_.VERSION = '1.1.0'
-
-
-# Collection Functions
-# --------------------
-
-# The cornerstone, an **each** implementation.
-# Handles objects implementing **forEach**, arrays, and raw objects.
-_.each = (obj, iterator, context) ->
-  try
-    if nativeForEach and obj.forEach is nativeForEach
-      obj.forEach iterator, context
-    else if _.isNumber obj.length
-      iterator.call context, obj[i], i, obj for i in [0...obj.length]
-    else
-      iterator.call context, val, key, obj for own key, val of obj
-  catch e
-    throw e if e isnt breaker
-  obj
-
-
-# Return the results of applying the iterator to each element. Use JavaScript
-# 1.6's version of **map**, if possible.
-_.map = (obj, iterator, context) ->
-  return obj.map(iterator, context) if nativeMap and obj.map is nativeMap
-  results = []
-  _.each obj, (value, index, list) ->
-    results.push iterator.call context, value, index, list
-  results
-
-
-# **Reduce** builds up a single result from a list of values. Also known as
-# **inject**, or **foldl**. Uses JavaScript 1.8's version of **reduce**, if possible.
-_.reduce = (obj, iterator, memo, context) ->
-  if nativeReduce and obj.reduce is nativeReduce
-    iterator = _.bind iterator, context if context
-    return obj.reduce iterator, memo
-  _.each obj, (value, index, list) ->
-    memo = iterator.call context, memo, value, index, list
-  memo
-
-
-# The right-associative version of **reduce**, also known as **foldr**. Uses
-# JavaScript 1.8's version of **reduceRight**, if available.
-_.reduceRight = (obj, iterator, memo, context) ->
-  if nativeReduceRight and obj.reduceRight is nativeReduceRight
-    iterator = _.bind iterator, context if context
-    return obj.reduceRight iterator, memo
-  reversed = _.clone(_.toArray(obj)).reverse()
-  _.reduce reversed, iterator, memo, context
-
-
-# Return the first value which passes a truth test.
-_.detect = (obj, iterator, context) ->
-  result = null
-  _.each obj, (value, index, list) ->
-    if iterator.call context, value, index, list
-      result = value
-      _.breakLoop()
-  result
-
-
-# Return all the elements that pass a truth test. Use JavaScript 1.6's
-# **filter**, if it exists.
-_.filter = (obj, iterator, context) ->
-  return obj.filter iterator, context if nativeFilter and obj.filter is nativeFilter
-  results = []
-  _.each obj, (value, index, list) ->
-    results.push value if iterator.call context, value, index, list
-  results
-
-
-# Return all the elements for which a truth test fails.
-_.reject = (obj, iterator, context) ->
-  results = []
-  _.each obj, (value, index, list) ->
-    results.push value if not iterator.call context, value, index, list
-  results
-
-
-# Determine whether all of the elements match a truth test. Delegate to
-# JavaScript 1.6's **every**, if it is present.
-_.every = (obj, iterator, context) ->
-  iterator ||= _.identity
-  return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
-  result = true
-  _.each obj, (value, index, list) ->
-    _.breakLoop() unless (result = result and iterator.call(context, value, index, list))
-  result
-
-
-# Determine if at least one element in the object matches a truth test. Use
-# JavaScript 1.6's **some**, if it exists.
-_.some = (obj, iterator, context) ->
-  iterator ||= _.identity
-  return obj.some iterator, context if nativeSome and obj.some is nativeSome
-  result = false
-  _.each obj, (value, index, list) ->
-    _.breakLoop() if (result = iterator.call(context, value, index, list))
-  result
-
-
-# Determine if a given value is included in the array or object,
-# based on `===`.
-_.include = (obj, target) ->
-  return _.indexOf(obj, target) isnt -1 if nativeIndexOf and obj.indexOf is nativeIndexOf
-  return true for own key, val of obj when val is target
-  false
-
-
-# Invoke a method with arguments on every item in a collection.
-_.invoke = (obj, method) ->
-  args = _.rest arguments, 2
-  (if method then val[method] else val).apply(val, args) for val in obj
-
-
-# Convenience version of a common use case of **map**: fetching a property.
-_.pluck = (obj, key) ->
-  _.map(obj, (val) -> val[key])
-
-
-# Return the maximum item or (item-based computation).
-_.max = (obj, iterator, context) ->
-  return Math.max.apply(Math, obj) if not iterator and _.isArray(obj)
-  result = computed: -Infinity
-  _.each obj, (value, index, list) ->
-    computed = if iterator then iterator.call(context, value, index, list) else value
-    computed >= result.computed and (result = {value: value, computed: computed})
-  result.value
-
-
-# Return the minimum element (or element-based computation).
-_.min = (obj, iterator, context) ->
-  return Math.min.apply(Math, obj) if not iterator and _.isArray(obj)
-  result = computed: Infinity
-  _.each obj, (value, index, list) ->
-    computed = if iterator then iterator.call(context, value, index, list) else value
-    computed < result.computed and (result = {value: value, computed: computed})
-  result.value
-
-
-# Sort the object's values by a criterion produced by an iterator.
-_.sortBy = (obj, iterator, context) ->
-  _.pluck(((_.map obj, (value, index, list) ->
-    {value: value, criteria: iterator.call(context, value, index, list)}
-  ).sort((left, right) ->
-    a = left.criteria; b = right.criteria
-    if a < b then -1 else if a > b then 1 else 0
-  )), 'value')
-
-
-# Use a comparator function to figure out at what index an object should
-# be inserted so as to maintain order. Uses binary search.
-_.sortedIndex = (array, obj, iterator) ->
-  iterator ||= _.identity
-  low = 0
-  high = array.length
-  while low < high
-    mid = (low + high) >> 1
-    if iterator(array[mid]) < iterator(obj) then low = mid + 1 else high = mid
-  low
-
-
-# Convert anything iterable into a real, live array.
-_.toArray = (iterable) ->
-  return [] if (!iterable)
-  return iterable.toArray() if (iterable.toArray)
-  return iterable if (_.isArray(iterable))
-  return slice.call(iterable) if (_.isArguments(iterable))
-  _.values(iterable)
-
-
-# Return the number of elements in an object.
-_.size = (obj) -> _.toArray(obj).length
-
-
-# Array Functions
-# ---------------
-
-# Get the first element of an array. Passing `n` will return the first N
-# values in the array. Aliased as **head**. The `guard` check allows it to work
-# with **map**.
-_.first = (array, n, guard) ->
-  if n and not guard then slice.call(array, 0, n) else array[0]
-
-
-# Returns everything but the first entry of the array. Aliased as **tail**.
-# Especially useful on the arguments object. Passing an `index` will return
-# the rest of the values in the array from that index onward. The `guard`
-# check allows it to work with **map**.
-_.rest = (array, index, guard) ->
-  slice.call(array, if _.isUndefined(index) or guard then 1 else index)
-
-
-# Get the last element of an array.
-_.last = (array) -> array[array.length - 1]
-
-
-# Trim out all falsy values from an array.
-_.compact = (array) -> item for item in array when item
-
-
-# Return a completely flattened version of an array.
-_.flatten = (array) ->
-  _.reduce array, (memo, value) ->
-    return memo.concat(_.flatten(value)) if _.isArray value
-    memo.push value
-    memo
-  , []
-
-
-# Return a version of the array that does not contain the specified value(s).
-_.without = (array) ->
-  values = _.rest arguments
-  val for val in _.toArray(array) when not _.include values, val
-
-
-# Produce a duplicate-free version of the array. If the array has already
-# been sorted, you have the option of using a faster algorithm.
-_.uniq = (array, isSorted) ->
-  memo = []
-  for el, i in _.toArray array
-    memo.push el if i is 0 || (if isSorted is true then _.last(memo) isnt el else not _.include(memo, el))
-  memo
-
-
-# Produce an array that contains every item shared between all the
-# passed-in arrays.
-_.intersect = (array) ->
-  rest = _.rest arguments
-  _.select _.uniq(array), (item) ->
-    _.all rest, (other) ->
-      _.indexOf(other, item) >= 0
-
-
-# Zip together multiple lists into a single array -- elements that share
-# an index go together.
-_.zip = ->
-  length = _.max _.pluck arguments, 'length'
-  results = new Array length
-  for i in [0...length]
-    results[i] = _.pluck arguments, String i
-  results
-
-
-# If the browser doesn't supply us with **indexOf** (I'm looking at you, MSIE),
-# we need this function. Return the position of the first occurrence of an
-# item in an array, or -1 if the item is not included in the array.
-_.indexOf = (array, item) ->
-  return array.indexOf item if nativeIndexOf and array.indexOf is nativeIndexOf
-  i = 0; l = array.length
-  while l - i
-    if array[i] is item then return i else i++
-  -1
-
-
-# Provide JavaScript 1.6's **lastIndexOf**, delegating to the native function,
-# if possible.
-_.lastIndexOf = (array, item) ->
-  return array.lastIndexOf(item) if nativeLastIndexOf and array.lastIndexOf is nativeLastIndexOf
-  i = array.length
-  while i
-    if array[i] is item then return i else i--
-  -1
-
-
-# Generate an integer Array containing an arithmetic progression. A port of
-# [the native Python **range** function](http://docs.python.org/library/functions.html#range).
-_.range = (start, stop, step) ->
-  a = arguments
-  solo = a.length <= 1
-  i = start = if solo then 0 else a[0]
-  stop = if solo then a[0] else a[1]
-  step = a[2] or 1
-  len = Math.ceil((stop - start) / step)
-  return [] if len <= 0
-  range = new Array len
-  idx = 0
-  loop
-    return range if (if step > 0 then i - stop else stop - i) >= 0
-    range[idx] = i
-    idx++
-    i+= step
-
-
-# Function Functions
-# ------------------
-
-# Create a function bound to a given object (assigning `this`, and arguments,
-# optionally). Binding with arguments is also known as **curry**.
-_.bind = (func, obj) ->
-  args = _.rest arguments, 2
-  -> func.apply obj or root, args.concat arguments
-
-
-# Bind all of an object's methods to that object. Useful for ensuring that
-# all callbacks defined on an object belong to it.
-_.bindAll = (obj) ->
-  funcs = if arguments.length > 1 then _.rest(arguments) else _.functions(obj)
-  _.each funcs, (f) -> obj[f] = _.bind obj[f], obj
-  obj
-
-
-# Delays a function for the given number of milliseconds, and then calls
-# it with the arguments supplied.
-_.delay = (func, wait) ->
-  args = _.rest arguments, 2
-  setTimeout((-> func.apply(func, args)), wait)
-
-
-# Memoize an expensive function by storing its results.
-_.memoize = (func, hasher) ->
-  memo = {}
-  hasher or= _.identity
-  ->
-    key = hasher.apply this, arguments
-    return memo[key] if key of memo
-    memo[key] = func.apply this, arguments
-
-
-# Defers a function, scheduling it to run after the current call stack has
-# cleared.
-_.defer = (func) ->
-  _.delay.apply _, [func, 1].concat _.rest arguments
-
-
-# Returns the first function passed as an argument to the second,
-# allowing you to adjust arguments, run code before and after, and
-# conditionally execute the original function.
-_.wrap = (func, wrapper) ->
-  -> wrapper.apply wrapper, [func].concat arguments
-
-
-# Returns a function that is the composition of a list of functions, each
-# consuming the return value of the function that follows.
-_.compose = ->
-  funcs = arguments
-  ->
-    args = arguments
-    for i in [funcs.length - 1..0] by -1
-      args = [funcs[i].apply(this, args)]
-    args[0]
-
-
-# Object Functions
-# ----------------
-
-# Retrieve the names of an object's properties.
-_.keys = nativeKeys or (obj) ->
-  return _.range 0, obj.length if _.isArray(obj)
-  key for key, val of obj
-
-
-# Retrieve the values of an object's properties.
-_.values = (obj) ->
-  _.map obj, _.identity
-
-
-# Return a sorted list of the function names available in Underscore.
-_.functions = (obj) ->
-  _.filter(_.keys(obj), (key) -> _.isFunction(obj[key])).sort()
-
-
-# Extend a given object with all of the properties in a source object.
-_.extend = (obj) ->
-  for source in _.rest(arguments)
-    obj[key] = val for key, val of source
-  obj
-
-
-# Create a (shallow-cloned) duplicate of an object.
-_.clone = (obj) ->
-  return obj.slice 0 if _.isArray obj
-  _.extend {}, obj
-
-
-# Invokes interceptor with the obj, and then returns obj.
-# The primary purpose of this method is to "tap into" a method chain,
-# in order to perform operations on intermediate results within
- the chain.
-_.tap = (obj, interceptor) ->
-  interceptor obj
-  obj
-
-
-# Perform a deep comparison to check if two objects are equal.
-_.isEqual = (a, b) ->
-  # Check object identity.
-  return true if a is b
-  # Different types?
-  atype = typeof(a); btype = typeof(b)
-  return false if atype isnt btype
-  # Basic equality test (watch out for coercions).
-  return true if `a == b`
-  # One is falsy and the other truthy.
-  return false if (!a and b) or (a and !b)
-  # One of them implements an `isEqual()`?
-  return a.isEqual(b) if a.isEqual
-  # Check dates' integer values.
-  return a.getTime() is b.getTime() if _.isDate(a) and _.isDate(b)
-  # Both are NaN?
-  return false if _.isNaN(a) and _.isNaN(b)
-  # Compare regular expressions.
-  if _.isRegExp(a) and _.isRegExp(b)
-    return a.source is b.source and
-           a.global is b.global and
-           a.ignoreCase is b.ignoreCase and
-           a.multiline is b.multiline
-  # If a is not an object by this point, we can't handle it.
-  return false if atype isnt 'object'
-  # Check for different array lengths before comparing contents.
-  return false if a.length and (a.length isnt b.length)
-  # Nothing else worked, deep compare the contents.
-  aKeys = _.keys(a); bKeys = _.keys(b)
-  # Different object sizes?
-  return false if aKeys.length isnt bKeys.length
-  # Recursive comparison of contents.
-  return false for key, val of a when !(key of b) or !_.isEqual(val, b[key])
-  true
-
-
-# Is a given array or object empty?
-_.isEmpty = (obj) ->
-  return obj.length is 0 if _.isArray(obj) or _.isString(obj)
-  return false for own key of obj
-  true
-
-
-# Is a given value a DOM element?
-_.isElement = (obj) -> obj and obj.nodeType is 1
-
-
-# Is a given value an array?
-_.isArray = nativeIsArray or (obj) -> !!(obj and obj.concat and obj.unshift and not obj.callee)
-
-
-# Is a given variable an arguments object?
-_.isArguments = (obj) -> obj and obj.callee
-
-
-# Is the given value a function?
-_.isFunction = (obj) -> !!(obj and obj.constructor and obj.call and obj.apply)
-
-
-# Is the given value a string?
-_.isString = (obj) -> !!(obj is '' or (obj and obj.charCodeAt and obj.substr))
-
-
-# Is a given value a number?
-_.isNumber = (obj) -> (obj is +obj) or toString.call(obj) is '[object Number]'
-
-
-# Is a given value a boolean?
-_.isBoolean = (obj) -> obj is true or obj is false
-
-
-# Is a given value a Date?
-_.isDate = (obj) -> !!(obj and obj.getTimezoneOffset and obj.setUTCFullYear)
-
-
-# Is the given value a regular expression?
-_.isRegExp = (obj) -> !!(obj and obj.exec and (obj.ignoreCase or obj.ignoreCase is false))
-
-
-# Is the given value NaN -- this one is interesting. `NaN != NaN`, and
-# `isNaN(undefined) == true`, so we make sure it's a number first.
-_.isNaN = (obj) -> _.isNumber(obj) and window.isNaN(obj)
-
-
-# Is a given value equal to null?
-_.isNull = (obj) -> obj is null
-
-
-# Is a given variable undefined?
-_.isUndefined = (obj) -> typeof obj is 'undefined'
-
-
-# Utility Functions
-# -----------------
-
-# Run Underscore.js in noConflict mode, returning the `_` variable to its
-# previous owner. Returns a reference to the Underscore object.
-_.noConflict = ->
-  root._ = previousUnderscore
-  this
-
-
-# Keep the identity function around for default iterators.
-_.identity = (value) -> value
-
-
-# Run a function `n` times.
-_.times = (n, iterator, context) ->
-  iterator.call context, i for i in [0...n]
-
-
-# Break out of the middle of an iteration.
-_.breakLoop = -> throw breaker
-
-
-# Add your own custom functions to the Underscore object, ensuring that
-# they're correctly added to the OOP wrapper as well.
-_.mixin = (obj) ->
-  for name in _.functions(obj)
-    addToWrapper name, _[name] = obj[name]
-
-
-# Generate a unique integer id (unique within the entire client session).
-# Useful for temporary DOM ids.
-idCounter = 0
-_.uniqueId = (prefix) ->
-  (prefix or '') + idCounter++
-
-
-# By default, Underscore uses **ERB**-style template delimiters, change the
-# following template settings to use alternative delimiters.
-_.templateSettings = {
-  start: '<%'
-  end: '%>'
-  interpolate: /<%=(.+?)%>/g
-}
-
-
-# JavaScript templating a-la **ERB**, pilfered from John Resig's
-# *Secrets of the JavaScript Ninja*, page 83.
-# Single-quote fix from Rick Strahl.
-# With alterations for arbitrary delimiters, and to preserve whitespace.
-_.template = (str, data) ->
-  c = _.templateSettings
-  endMatch = new RegExp("'(?=[^"+c.end.substr(0, 1)+"]*"+escapeRegExp(c.end)+")","g")
-  fn = new Function 'obj',
-    'var p=[],print=function(){p.push.apply(p,arguments);};' +
-    'with(obj||{}){p.push(\'' +
-    str.replace(/\r/g, '\\r')
-       .replace(/\n/g, '\\n')
-       .replace(/\t/g, '\\t')
-       .replace(endMatch,"���")
-       .split("'").join("\\'")
-       .split("���").join("'")
-       .replace(c.interpolate, "',$1,'")
-       .split(c.start).join("');")
-       .split(c.end).join("p.push('") +
-       "');}return p.join('');"
-  if data then fn(data) else fn
-
-
-# Aliases
-# -------
-
-_.forEach = _.each
-_.foldl = _.inject = _.reduce
-_.foldr = _.reduceRight
-_.select = _.filter
-_.all = _.every
-_.any = _.some
-_.contains = _.include
-_.head = _.first
-_.tail = _.rest
-_.methods = _.functions
-
-
-# Setup the OOP Wrapper
-# ---------------------
-
-# If Underscore is called as a function, it returns a wrapped object that
-# can be used OO-style. This wrapper holds altered versions of all the
-# underscore functions. Wrapped objects may be chained.
-wrapper = (obj) ->
-  this._wrapped = obj
-  this
-
-
-# Helper function to continue chaining intermediate results.
-result = (obj, chain) ->
-  if chain then _(obj).chain() else obj
-
-
-# A method to easily add functions to the OOP wrapper.
-addToWrapper = (name, func) ->
-  wrapper.prototype[name] = ->
-    args = _.toArray arguments
-    unshift.call args, this._wrapped
-    result func.apply(_, args), this._chain
-
-
-# Add all ofthe Underscore functions to the wrapper object.
-_.mixin _
-
-
-# Add all mutator Array functions to the wrapper.
-_.each ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], (name) ->
-  method = Array.prototype[name]
-  wrapper.prototype[name] = ->
-    method.apply(this._wrapped, arguments)
-    result(this._wrapped, this._chain)
-
-
-# Add all accessor Array functions to the wrapper.
-_.each ['concat', 'join', 'slice'], (name) ->
-  method = Array.prototype[name]
-  wrapper.prototype[name] = ->
-    result(method.apply(this._wrapped, arguments), this._chain)
-
-
-# Start chaining a wrapped Underscore object.
-wrapper::chain = ->
-  this._chain = true
-  this
-
-
-# Extracts the result from a wrapped and chained object.
-wrapper::value = -> this._wrapped
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-coffeescript</code>.</p>
-
-    <p>The CoffeeScript mode was written by Jeff Pickhardt (<a href="LICENSE">license</a>).</p>
-
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/css/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/css/index.html
deleted file mode 100644 (file)
index ae2c3bf..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: CSS mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="css.js"></script>
-    <style>.CodeMirror {background: #f8f8f8;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: CSS mode</h1>
-    <form><textarea id="code" name="code">
-/* Some example CSS */
-
-@import url("something.css");
-
-body {
-  margin: 0;
-  padding: 3em 6em;
-  font-family: tahoma, arial, sans-serif;
-  color: #000;
-}
-
-#navigation a {
-  font-weight: bold;
-  text-decoration: none !important;
-}
-
-h1 {
-  font-size: 2.5em;
-}
-
-h2 {
-  font-size: 1.7em;
-}
-
-h1:before, h2:before {
-  content: "::";
-}
-
-code {
-  font-family: courier, monospace;
-  font-size: 80%;
-  color: #418A8A;
-}
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/css</code>.</p>
-
-    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>,  <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>
-
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/css/scss.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/css/scss.html
deleted file mode 100644 (file)
index b90cbe8..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: SCSS mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="css.js"></script>
-    <style>.CodeMirror {background: #f8f8f8;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: SCSS mode</h1>
-    <form><textarea id="code" name="code">
-/* Some example SCSS */
-
-@import "compass/css3";
-$variable: #333;
-
-$blue: #3bbfce;
-$margin: 16px;
-
-.content-navigation {
-  #nested {
-    background-color: black;
-  }
-  border-color: $blue;
-  color:
-    darken($blue, 9%);
-}
-
-.border {
-  padding: $margin / 2;
-  margin: $margin / 2;
-  border-color: $blue;
-}
-
-@mixin table-base {
-  th {
-    text-align: center;
-    font-weight: bold;
-  }
-  td, th {padding: 2px}
-}
-
-table.hl {
-  margin: 2em 0;
-  td.ln {
-    text-align: right;
-  }
-}
-
-li {
-  font: {
-    family: serif;
-    weight: bold;
-    size: 1.2em;
-  }
-}
-
-@mixin left($dist) {
-  float: left;
-  margin-left: $dist;
-}
-
-#data {
-  @include left(10px);
-  @include table-base;
-}
-
-.source {
-  @include flow-into(target);
-  border: 10px solid green;
-  margin: 20px;
-  width: 200px; }
-
-.new-container {
-  @include flow-from(target);
-  border: 10px solid red;
-  margin: 20px;
-  width: 200px; }
-
-body {
-  margin: 0;
-  padding: 3em 6em;
-  font-family: tahoma, arial, sans-serif;
-  color: #000;
-}
-
-@mixin yellow() {
-  background: yellow;
-}
-
-.big {
-  font-size: 14px;
-}
-
-.nested {
-  @include border-radius(3px);
-  @extend .big;
-  p {
-    background: whitesmoke;
-    a {
-      color: red;
-    }
-  }
-}
-
-#navigation a {
-  font-weight: bold;
-  text-decoration: none !important;
-}
-
-h1 {
-  font-size: 2.5em;
-}
-
-h2 {
-  font-size: 1.7em;
-}
-
-h1:before, h2:before {
-  content: "::";
-}
-
-code {
-  font-family: courier, monospace;
-  font-size: 80%;
-  color: #418A8A;
-}
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        mode: "text/x-scss"
-      });
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/scss</code>.</p>
-
-    <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#scss_*">normal</a>,  <a href="../../test/index.html#verbose,scss_*">verbose</a>.</p>
-
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlembedded/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlembedded/index.html
deleted file mode 100644 (file)
index 5a37dd6..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: Html Embedded Scripts mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../xml/xml.js"></script>
-    <script src="../javascript/javascript.js"></script>
-    <script src="../css/css.js"></script>
-    <script src="../htmlmixed/htmlmixed.js"></script>
-    <script src="htmlembedded.js"></script>
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: Html Embedded Scripts mode</h1>
-
-<form><textarea id="code" name="code">
-<%
-function hello(who) {
-       return "Hello " + who;
-}
-%>
-This is an example of EJS (embedded javascript)
-<p>The program says <%= hello("world") %>.</p>
-<script>
-       alert("And here is some normal JS code"); // also colored
-</script>
-</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        mode: "application/x-ejs",
-        indentUnit: 4,
-        indentWithTabs: true,
-        enterMode: "keep",
-        tabMode: "shift"
-      });
-    </script>
-
-    <p>Mode for html embedded scripts like JSP and ASP.NET. Depends on HtmlMixed which in turn depends on
-    JavaScript, CSS and XML.<br />Other dependancies include those of the scriping language chosen.</p>
-
-    <p><strong>MIME types defined:</strong> <code>application/x-aspx</code> (ASP.NET), 
-    <code>application/x-ejs</code> (Embedded Javascript), <code>application/x-jsp</code> (JavaServer Pages)</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlmixed/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/htmlmixed/index.html
deleted file mode 100644 (file)
index c56559e..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: HTML mixed mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../xml/xml.js"></script>
-    <script src="../javascript/javascript.js"></script>
-    <script src="../css/css.js"></script>
-    <script src="../vbscript/vbscript.js"></script>
-    <script src="htmlmixed.js"></script>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror: HTML mixed mode</h1>
-    <form><textarea id="code" name="code">
-<html style="color: green">
-  <!-- this is a comment -->
-  <head>
-    <title>Mixed HTML Example</title>
-    <style type="text/css">
-      h1 {font-family: comic sans; color: #f0f;}
-      div {background: yellow !important;}
-      body {
-        max-width: 50em;
-        margin: 1em 2em 1em 5em;
-      }
-    </style>
-  </head>
-  <body>
-    <h1>Mixed HTML Example</h1>
-    <script>
-      function jsFunc(arg1, arg2) {
-        if (arg1 && arg2) document.body.innerHTML = "achoo";
-      }
-    </script>
-  </body>
-</html>
-</textarea></form>
-    <script>
-      // Define an extended mixed-mode that understands vbscript and
-      // leaves mustache/handlebars embedded templates in html mode
-      var mixedMode = {
-        name: "htmlmixed",
-        scriptTypes: [{matches: /\/x-handlebars-template|\/x-mustache/i,
-                       mode: null},
-                      {matches: /(text|application)\/(x-)?vb(a|script)/i,
-                       mode: "vbscript"}]
-      };
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: mixedMode, tabMode: "indent"});
-    </script>
-
-    <p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p>
-
-    <p>It takes an optional mode configuration
-    option, <code>scriptTypes</code>, which can be used to add custom
-    behavior for specific <code>&lt;script type="..."></code> tags. If
-    given, it should hold an array of <code>{matches, mode}</code>
-    objects, where <code>matches</code> is a string or regexp that
-    matches the script type, and <code>mode</code> is
-    either <code>null</code>, for script types that should stay in
-    HTML mode, or a <a href="../../doc/manual.html#option_mode">mode
-    spec</a> corresponding to the mode that should be used for the
-    script.</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/html</code>
-    (redefined, only takes effect if you load this parser after the
-    XML parser).</p>
-
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/index.html
deleted file mode 100644 (file)
index db063b7..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: JavaScript mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../../addon/edit/matchbrackets.js"></script>
-    <script src="../../addon/edit/continuecomment.js"></script>
-    <script src="../../addon/comment/comment.js"></script>
-    <script src="javascript.js"></script>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror: JavaScript mode</h1>
-
-<div><textarea id="code" name="code">
-// Demo code (the actual new parser character stream implementation)
-
-function StringStream(string) {
-  this.pos = 0;
-  this.string = string;
-}
-
-StringStream.prototype = {
-  done: function() {return this.pos >= this.string.length;},
-  peek: function() {return this.string.charAt(this.pos);},
-  next: function() {
-    if (this.pos &lt; this.string.length)
-      return this.string.charAt(this.pos++);
-  },
-  eat: function(match) {
-    var ch = this.string.charAt(this.pos);
-    if (typeof match == "string") var ok = ch == match;
-    else var ok = ch &amp;&amp; match.test ? match.test(ch) : match(ch);
-    if (ok) {this.pos++; return ch;}
-  },
-  eatWhile: function(match) {
-    var start = this.pos;
-    while (this.eat(match));
-    if (this.pos > start) return this.string.slice(start, this.pos);
-  },
-  backUp: function(n) {this.pos -= n;},
-  column: function() {return this.pos;},
-  eatSpace: function() {
-    var start = this.pos;
-    while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
-    return this.pos - start;
-  },
-  match: function(pattern, consume, caseInsensitive) {
-    if (typeof pattern == "string") {
-      function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
-      if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
-        if (consume !== false) this.pos += str.length;
-        return true;
-      }
-    }
-    else {
-      var match = this.string.slice(this.pos).match(pattern);
-      if (match &amp;&amp; consume !== false) this.pos += match[0].length;
-      return match;
-    }
-  }
-};
-</textarea></div>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        continueComments: "Enter",
-        extraKeys: {"Ctrl-Q": "toggleComment"}
-      });
-    </script>
-
-    <p>
-      JavaScript mode supports a two configuration
-      options:
-      <ul>
-        <li><code>json</code> which will set the mode to expect JSON
-        data rather than a JavaScript program.</li>
-        <li><code>typescript</code> which will activate additional
-        syntax highlighting and some other things for TypeScript code
-        (<a href="typescript.html">demo</a>).</li>
-        <li><code>statementIndent</code> which (given a number) will
-        determine the amount of indentation to use for statements
-        continued on a new line.</li>
-      </ul>
-    </p>
-
-    <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/typescript.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/javascript/typescript.html
deleted file mode 100644 (file)
index 58315e7..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: TypeScript mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="javascript.js"></script>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-  </head>
-  <body>
-    <h1>CodeMirror: TypeScript mode</h1>
-
-<div><textarea id="code" name="code">
-class Greeter {
-       greeting: string;
-       constructor (message: string) {
-               this.greeting = message;
-       }
-       greet() {
-               return "Hello, " + this.greeting;
-       }
-}   
-
-var greeter = new Greeter("world");
-
-var button = document.createElement('button')
-button.innerText = "Say Hello"
-button.onclick = function() {
-       alert(greeter.greet())
-}
-
-document.body.appendChild(button)
-
-</textarea></div>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        mode: "text/typescript"
-      });
-    </script>
-
-    <p>This is a specialization of the <a href="index.html">JavaScript mode</a>.</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/less/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/less/index.html
deleted file mode 100644 (file)
index 78c1e53..0000000
+++ /dev/null
@@ -1,741 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: LESS mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../../addon/edit/matchbrackets.js"></script>
-    <script src="less.js"></script>
-    <style>.CodeMirror {background: #f8f8f8; border: 1px solid #ddd; font-size:12px; height: 400px}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-    <link rel="stylesheet" href="../../theme/lesser-dark.css">
-  </head>
-  <body>
-    <h1>CodeMirror: LESS mode</h1>
-    <form><textarea id="code" name="code">@media screen and (device-aspect-ratio: 16/9) { … }
-@media screen and (device-aspect-ratio: 32/18) { … }
-@media screen and (device-aspect-ratio: 1280/720) { … }
-@media screen and (device-aspect-ratio: 2560/1440) { … }
-
-html:lang(fr-be)
-html:lang(de)
-:lang(fr-be) > q
-:lang(de) > q
-
-tr:nth-child(2n+1) /* represents every odd row of an HTML table */
-tr:nth-child(odd)  /* same */
-tr:nth-child(2n+0) /* represents every even row of an HTML table */
-tr:nth-child(even) /* same */
-
-/* Alternate paragraph colours in CSS */
-p:nth-child(4n+1) { color: navy; }
-p:nth-child(4n+2) { color: green; }
-p:nth-child(4n+3) { color: maroon; }
-p:nth-child(4n+4) { color: purple; }
-
-:nth-child(10n-1)  /* represents the 9th, 19th, 29th, etc, element */
-:nth-child(10n+9)  /* Same */
-:nth-child(10n+-1) /* Syntactically invalid, and would be ignored */
-
-:nth-child( 3n + 1 )
-:nth-child( +3n - 2 )
-:nth-child( -n+ 6)
-:nth-child( +6 )
-
-html|tr:nth-child(-n+6)  /* represents the 6 first rows of XHTML tables */
-
-img:nth-of-type(2n+1) { float: right; }
-img:nth-of-type(2n) { float: left; }
-
-body > h2:nth-of-type(n+2):nth-last-of-type(n+2)
-body > h2:not(:first-of-type):not(:last-of-type)
-
-html|*:not(:link):not(:visited)
-*|*:not(:hover)
-p::first-line { text-transform: uppercase }
-
-p { color: red; font-size: 12pt }
-p::first-letter { color: green; font-size: 200% }
-p::first-line { color: blue }
-
-p { line-height: 1.1 }
-p::first-letter { font-size: 3em; font-weight: normal }
-span { font-weight: bold }
-
-*               /* a=0 b=0 c=0 -> specificity =   0 */
-LI              /* a=0 b=0 c=1 -> specificity =   1 */
-UL LI           /* a=0 b=0 c=2 -> specificity =   2 */
-UL OL+LI        /* a=0 b=0 c=3 -> specificity =   3 */
-H1 + *[REL=up]  /* a=0 b=1 c=1 -> specificity =  11 */
-UL OL LI.red    /* a=0 b=1 c=3 -> specificity =  13 */
-LI.red.level    /* a=0 b=2 c=1 -> specificity =  21 */
-#x34y           /* a=1 b=0 c=0 -> specificity = 100 */
-#s12:not(FOO)   /* a=1 b=0 c=1 -> specificity = 101 */
-
-@namespace foo url(http://www.example.com);
-foo|h1 { color: blue }  /* first rule */
-foo|* { color: yellow } /* second rule */
-|h1 { color: red }      /* ...*/
-*|h1 { color: green }
-h1 { color: green }
-
-span[hello="Ocean"][goodbye="Land"]
-
-a[rel~="copyright"] { ... }
-a[href="http://www.w3.org/"] { ... }
-
-DIALOGUE[character=romeo]
-DIALOGUE[character=juliet]
-
-[att^=val]
-[att$=val]
-[att*=val]
-
-@namespace foo "http://www.example.com";
-[foo|att=val] { color: blue }
-[*|att] { color: yellow }
-[|att] { color: green }
-[att] { color: green }
-
-
-*:target { color : red }
-*:target::before { content : url(target.png) }
-
-E[foo]{
-  padding:65px;
-}
-E[foo] ~ F{
-  padding:65px;
-}
-E#myid{
-  padding:65px;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
-  padding: 0;
-  border: 0;
-}
-.btn {
-  // reset here as of 2.0.3 due to Recess property order
-  border-color: #ccc;
-  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
-}
-fieldset span button, fieldset span input[type="file"] {
-  font-size:12px;
-       font-family:Arial, Helvetica, sans-serif;
-}
-.el tr:nth-child(even):last-child td:first-child{
-       -moz-border-radius-bottomleft:3px;
-       -webkit-border-bottom-left-radius:3px;
-       border-bottom-left-radius:3px;
-}
-
-/* Some LESS code */
-
-button {
-    width:  32px;
-    height: 32px;
-    border: 0;
-    margin: 4px;
-    cursor: pointer;
-}
-button.icon-plus { background: url(http://dahlström.net/tmp/sharp-icons/svg-icon-target.svg#plus) no-repeat; }
-button.icon-chart { background: url(http://dahlström.net/tmp/sharp-icons/svg-icon-target.svg#chart) no-repeat; }
-
-button:hover { background-color: #999; }
-button:active { background-color: #666; }
-
-@test_a: #eeeQQQ;//this is not a valid hex value and thus parsed as an element id
-@test_b: #eeeFFF //this is a valid hex value but the declaration doesn't end with a semicolon and thus parsed as an element id
-
-#eee aaa .box
-{
-  #test bbb {
-    width: 500px;
-    height: 250px;
-    background-image: url(dir/output/sheep.png), url( betweengrassandsky.png );
-    background-position: center bottom, left top;
-    background-repeat: no-repeat;
-  }
-}
-
-@base: #f938ab;
-
-.box-shadow(@style, @c) when (iscolor(@c)) {
-  box-shadow:         @style @c;
-  -webkit-box-shadow: @style @c;
-  -moz-box-shadow:    @style @c;
-}
-.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
-  .box-shadow(@style, rgba(0, 0, 0, @alpha));
-}
-
-@color: #4D926F;
-
-#header {
-  color: @color;
-  color: #000000;
-}
-h2 {
-  color: @color;
-}
-
-.rounded-corners (@radius: 5px) {
-  border-radius: @radius;
-  -webkit-border-radius: @radius;
-  -moz-border-radius: @radius;
-}
-
-#header {
-  .rounded-corners;
-}
-#footer {
-  .rounded-corners(10px);
-}
-
-.box-shadow (@x: 0, @y: 0, @blur: 1px, @alpha) {
-  @val: @x @y @blur rgba(0, 0, 0, @alpha);
-
-  box-shadow:         @val;
-  -webkit-box-shadow: @val;
-  -moz-box-shadow:    @val;
-}
-.box { @base: #f938ab;
-  color:        saturate(@base, 5%);
-  border-color: lighten(@base, 30%);
-  div { .box-shadow(0, 0, 5px, 0.4) }
-}
-
-@import url("something.css");
-
-@light-blue:   hsl(190, 50%, 65%);
-@light-yellow: desaturate(#fefec8, 10%);
-@dark-yellow:  desaturate(darken(@light-yellow, 10%), 40%);
-@darkest:      hsl(20, 0%, 15%);
-@dark:         hsl(190, 20%, 30%);
-@medium:       hsl(10, 60%, 30%);
-@light:        hsl(90, 40%, 20%);
-@lightest:     hsl(90, 20%, 90%);
-@highlight:    hsl(80, 50%, 90%);
-@blue:         hsl(210, 60%, 20%);
-@alpha-blue:   hsla(210, 60%, 40%, 0.5);
-
-.box-shadow (@x, @y, @blur, @alpha) {
-  @value: @x @y @blur rgba(0, 0, 0, @alpha);
-  box-shadow:         @value;
-  -moz-box-shadow:    @value;
-  -webkit-box-shadow: @value;
-}
-.border-radius (@radius) {
-  border-radius: @radius;
-  -moz-border-radius: @radius;
-  -webkit-border-radius: @radius;
-}
-
-.border-radius (@radius, bottom) {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-  -moz-border-top-right-radius: 0;
-  -moz-border-top-left-radius: 0;
-  -webkit-border-top-left-radius: 0;
-  -webkit-border-top-right-radius: 0;
-}
-.border-radius (@radius, right) {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-  -moz-border-bottom-left-radius: 0;
-  -moz-border-top-left-radius: 0;
-  -webkit-border-bottom-left-radius: 0;
-  -webkit-border-top-left-radius: 0;
-}
-.box-shadow-inset (@x, @y, @blur, @color) {
-  box-shadow: @x @y @blur @color inset;
-  -moz-box-shadow: @x @y @blur @color inset;
-  -webkit-box-shadow: @x @y @blur @color inset;
-}
-.code () {
-  font-family: 'Bitstream Vera Sans Mono',
-               'DejaVu Sans Mono',
-               'Monaco',
-               Courier,
-               monospace !important;
-}
-.wrap () {
-  text-wrap: wrap;
-  white-space: pre-wrap;       /* css-3 */
-  white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
-  white-space: -pre-wrap;      /* Opera 4-6 */
-  white-space: -o-pre-wrap;    /* Opera 7 */
-  word-wrap: break-word;       /* Internet Explorer 5.5+ */
-}
-
-html { margin: 0 }
-body {
-  background-color: @darkest;
-  margin: 0 auto;
-  font-family: Arial, sans-serif;
-  font-size: 100%;
-  overflow-x: hidden;
-}
-nav, header, footer, section, article {
-  display: block;
-}
-a {
-  color: #b83000;
-}
-h1 a {
-  color: black;
-  text-decoration: none;
-}
-a:hover {
-  text-decoration: underline;
-}
-h1, h2, h3, h4 {
-  margin: 0;
-  font-weight: normal;
-}
-ul, li {
-  list-style-type: none;
-}
-code { .code; }
-code {
-  .string, .regexp { color: @dark }
-  .keyword { font-weight: bold }
-  .comment { color: rgba(0, 0, 0, 0.5) }
-  .number { color: @blue }
-  .class, .special { color: rgba(0, 50, 100, 0.8) }
-}
-pre {
-  padding: 0 30px;
-  .wrap;
-}
-blockquote {
-  font-style: italic;
-}
-body > footer {
-  text-align: left;
-  margin-left: 10px;
-  font-style: italic;
-  font-size: 18px;
-  color: #888;
-}
-
-#logo {
-  margin-top: 30px;
-  margin-bottom: 30px;
-  display: block;
-  width: 199px;
-  height: 81px;
-  background: url(/images/logo.png) no-repeat;
-}
-nav {
-  margin-left: 15px;
-}
-nav a, #dropdown li {
-  display: inline-block;
-  color: white;
-  line-height: 42px;
-  margin: 0;
-  padding: 0px 15px;
-  text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.5);
-  text-decoration: none;
-  border: 2px solid transparent;
-  border-width: 0 2px;
-  &:hover {
-    .dark-red; 
-    text-decoration: none;
-  }
-}
-.dark-red {
-    @red: @medium;
-    border: 2px solid darken(@red, 25%);
-    border-left-color: darken(@red, 15%);
-    border-right-color: darken(@red, 15%);
-    border-bottom: 0;
-    border-top: 0;
-    background-color: darken(@red, 10%);
-}
-
-.content {
-  margin: 0 auto;
-  width: 980px;
-}
-
-#menu {
-  position: absolute;
-  width: 100%;
-  z-index: 3;
-  clear: both;
-  display: block;
-  background-color: @blue;
-  height: 42px;
-  border-top: 2px solid lighten(@alpha-blue, 20%);
-  border-bottom: 2px solid darken(@alpha-blue, 25%);
-  .box-shadow(0, 1px, 8px, 0.6);
-  -moz-box-shadow: 0 0 0 #000; // Because firefox sucks.
-
-  &.docked {
-    background-color: hsla(210, 60%, 40%, 0.4);
-  }
-  &:hover {
-    background-color: @blue;
-  }
-
-  #dropdown {
-    margin: 0 0 0 117px;
-    padding: 0;
-    padding-top: 5px;
-    display: none;
-    width: 190px;
-    border-top: 2px solid @medium;
-    color: @highlight;
-    border: 2px solid darken(@medium, 25%);
-    border-left-color: darken(@medium, 15%);
-    border-right-color: darken(@medium, 15%);
-    border-top-width: 0;
-    background-color: darken(@medium, 10%);
-    ul {
-      padding: 0px;  
-    }
-    li {
-      font-size: 14px;
-      display: block;
-      text-align: left;
-      padding: 0;
-      border: 0;
-      a {
-        display: block;
-        padding: 0px 15px;  
-        text-decoration: none;
-        color: white;  
-        &:hover {
-          background-color: darken(@medium, 15%);
-          text-decoration: none;
-        }
-      }
-    }
-    .border-radius(5px, bottom);
-    .box-shadow(0, 6px, 8px, 0.5);
-  }
-}
-
-#main {
-  margin: 0 auto;
-  width: 100%;
-  background-color: @light-blue;
-  border-top: 8px solid darken(@light-blue, 5%);
-
-  #intro {
-    background-color: lighten(@light-blue, 25%);
-    float: left;
-    margin-top: -8px;
-    margin-right: 5px;
-
-    height: 380px;
-    position: relative;
-    z-index: 2;
-    font-family: 'Droid Serif', 'Georgia';
-    width: 395px;
-    padding: 45px 20px 23px 30px;
-    border: 2px dashed darken(@light-blue, 10%);
-    .box-shadow(1px, 0px, 6px, 0.5);
-    border-bottom: 0;
-    border-top: 0;
-    #download { color: transparent; border: 0; float: left; display: inline-block; margin: 15px 0 15px -5px; }
-    #download img { display: inline-block}
-    #download-info {
-      code {
-        font-size: 13px;  
-      }
-      color: @blue + #333; display: inline; float: left; margin: 36px 0 0 15px }
-  }
-  h2 {
-    span {
-      color: @medium;  
-    }
-    color: @blue;
-    margin: 20px 0;
-    font-size: 24px;
-    line-height: 1.2em;
-  }
-  h3 {
-    color: @blue;
-    line-height: 1.4em;
-    margin: 30px 0 15px 0;
-    font-size: 1em;
-    text-shadow: 0px 0px 0px @lightest;
-    span { color: @medium }
-  }
-  #example {
-    p {
-      font-size: 18px;
-      color: @blue;
-      font-weight: bold;
-      text-shadow: 0px 1px 1px @lightest;
-    }
-    pre {
-      margin: 0;
-      text-shadow: 0 -1px 1px @darkest;
-      margin-top: 20px;
-      background-color: desaturate(@darkest, 8%);
-      border: 0;
-      width: 450px;
-      color: lighten(@lightest, 2%);
-      background-repeat: repeat;
-      padding: 15px;
-      border: 1px dashed @lightest;
-      line-height: 15px;
-      .box-shadow(0, 0px, 15px, 0.5);
-      .code;
-      .border-radius(2px);
-      code .attribute { color: hsl(40, 50%, 70%) }
-      code .variable  { color: hsl(120, 10%, 50%) }
-      code .element   { color: hsl(170, 20%, 50%) }
-
-      code .string, .regexp { color: hsl(75, 50%, 65%) }
-      code .class { color: hsl(40, 40%, 60%); font-weight: normal }
-      code .id { color: hsl(50, 40%, 60%); font-weight: normal }
-      code .comment { color: rgba(255, 255, 255, 0.2) }
-      code .number, .color { color: hsl(10, 40%, 50%) }
-      code .class, code .mixin, .special { color: hsl(190, 20%, 50%) }
-      #time { color: #aaa }
-    }
-    float: right;
-    font-size: 12px;
-    margin: 0;
-    margin-top: 15px;
-    padding: 0;
-    width: 500px;
-  }
-}
-
-
-.page {
-  .content {
-    width: 870px;
-    padding: 45px;
-  }
-  margin: 0 auto;
-  font-family: 'Georgia', serif;
-  font-size: 18px;
-  line-height: 26px;
-  padding: 0 60px;
-  code {
-    font-size: 16px;  
-  }
-  pre {
-    border-width: 1px;
-    border-style: dashed;
-    padding: 15px;
-    margin: 15px 0;
-  }
-  h1 {
-    text-align: left;
-    font-size: 40px;
-    margin-top: 15px;
-    margin-bottom: 35px;
-  }
-  p + h1 { margin-top: 60px }
-  h2, h3 {
-    margin: 30px 0 15px 0;
-  }
-  p + h2, pre + h2, code + h2 {
-    border-top: 6px solid rgba(255, 255, 255, 0.1);
-    padding-top: 30px;
-  }
-  h3 {
-    margin: 15px 0;
-  }
-}
-
-
-#docs {
-  @bg: lighten(@light-blue, 5%);
-  border-top: 2px solid lighten(@bg, 5%);
-  color: @blue;
-  background-color: @light-blue;
-  .box-shadow(0, -2px, 5px, 0.2);
-
-  h1 {
-    font-family: 'Droid Serif', 'Georgia', serif;
-    padding-top: 30px;
-    padding-left: 45px;
-    font-size: 44px;
-    text-align: left;
-    margin: 30px 0 !important;
-    text-shadow: 0px 1px 1px @lightest;
-    font-weight: bold;
-  }
-  .content {
-    clear: both;
-    border-color: transparent;
-    background-color: lighten(@light-blue, 25%);
-    .box-shadow(0, 5px, 5px, 0.4);
-  }
-  pre {
-    @background: lighten(@bg, 30%);
-    color: lighten(@blue, 10%);
-    background-color: @background;
-    border-color: lighten(@light-blue, 25%);
-    border-width: 2px;
-    code .attribute { color: hsl(40, 50%, 30%) }
-    code .variable  { color: hsl(120, 10%, 30%) }
-    code .element   { color: hsl(170, 20%, 30%) }
-
-    code .string, .regexp { color: hsl(75, 50%, 35%) }
-    code .class { color: hsl(40, 40%, 30%); font-weight: normal }
-    code .id { color: hsl(50, 40%, 30%); font-weight: normal }
-    code .comment { color: rgba(0, 0, 0, 0.4) }
-    code .number, .color { color: hsl(10, 40%, 30%) }
-    code .class, code .mixin, .special { color: hsl(190, 20%, 30%) }
-  }
-  pre code                    { font-size: 15px  }
-  p + h2, pre + h2, code + h2 { border-top-color: rgba(0, 0, 0, 0.1) }
-}
-
-td {
-  padding-right: 30px;  
-}
-#synopsis {
-  .box-shadow(0, 5px, 5px, 0.2);
-}
-#synopsis, #about {
-  h2 {
-    font-size: 30px;  
-    padding: 10px 0;
-  }
-  h1 + h2 {
-      margin-top: 15px;  
-  }
-  h3 { font-size: 22px }
-
-  .code-example {
-    border-spacing: 0;
-    border-width: 1px;
-    border-style: dashed;
-    padding: 0;
-    pre { border: 0; margin: 0 }
-    td {
-      border: 0;
-      margin: 0;
-      background-color: desaturate(darken(@darkest, 5%), 20%);
-      vertical-align: top;
-      padding: 0;
-    }
-    tr { padding: 0 }
-  }
-  .css-output {
-    td {
-      border-left: 0;  
-    }
-  }
-  .less-example {
-    //border-right: 1px dotted rgba(255, 255, 255, 0.5) !important;
-  }
-  .css-output, .less-example {
-    width: 390px;
-  }
-  pre {
-    padding: 20px;
-    line-height: 20px;
-    font-size: 14px;
-  }
-}
-#about, #synopsis, #guide {
-  a {
-    text-decoration: none;
-    color: @light-yellow;
-    border-bottom: 1px dashed rgba(255, 255, 255, 0.2);
-    &:hover {
-      text-decoration: none;
-      border-bottom: 1px dashed @light-yellow;
-    }
-  }
-  @bg: desaturate(darken(@darkest, 5%), 20%);
-  text-shadow: 0 -1px 1px lighten(@bg, 5%);
-  color: @highlight;
-  background-color: @bg;
-  .content {
-    background-color: desaturate(@darkest, 20%);
-    clear: both;
-    .box-shadow(0, 5px, 5px, 0.4);
-  }
-  h1, h2, h3 {
-    color: @dark-yellow;
-  }
-  pre {
-      code .attribute { color: hsl(40, 50%, 70%) }
-      code .variable  { color: hsl(120, 10%, 50%) }
-      code .element   { color: hsl(170, 20%, 50%) }
-
-      code .string, .regexp { color: hsl(75, 50%, 65%) }
-      code .class { color: hsl(40, 40%, 60%); font-weight: normal }
-      code .id { color: hsl(50, 40%, 60%); font-weight: normal }
-      code .comment { color: rgba(255, 255, 255, 0.2) }
-      code .number, .color { color: hsl(10, 40%, 50%) }
-      code .class, code .mixin, .special { color: hsl(190, 20%, 50%) }
-    background-color: @bg;
-    border-color: darken(@light-yellow, 5%);
-  }
-  code {
-    color: darken(@dark-yellow, 5%);
-    .string, .regexp { color: desaturate(@light-blue, 15%) }
-    .keyword { color: hsl(40, 40%, 60%); font-weight: normal }
-    .comment { color: rgba(255, 255, 255, 0.2) }
-    .number { color: lighten(@blue, 10%) }
-    .class, .special { color: hsl(190, 20%, 50%) }
-  }
-}
-#guide {
-  background-color: @darkest;
-  .content {
-    background-color: transparent;
-  }
-
-}
-
-#about {
-  background-color: @darkest !important;
-  .content {
-    background-color: desaturate(lighten(@darkest, 3%), 5%);
-  }
-}
-#synopsis {
-  background-color: desaturate(lighten(@darkest, 3%), 5%) !important;
-  .content {
-    background-color: desaturate(lighten(@darkest, 3%), 5%);
-  }
-  pre {}
-}
-#synopsis, #guide {
-  .content {
-    .box-shadow(0, 0px, 0px, 0.0);
-  }
-}
-#about footer {
-  margin-top: 30px;
-  padding-top: 30px;
-  border-top: 6px solid rgba(0, 0, 0, 0.1);
-  text-align: center;
-  font-size: 16px;
-  color: rgba(255, 255, 255, 0.35);
-  #copy { font-size: 12px }
-  text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.02);
-}
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        theme: "lesser-dark",
-        lineNumbers : true,
-        matchBrackets : true
-      });
-    </script>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-less</code>, <code>text/css</code> (if not previously defined).</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/php/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/php/index.html
deleted file mode 100644 (file)
index 3d4c336..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: PHP mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="../../addon/edit/matchbrackets.js"></script>
-    <script src="../htmlmixed/htmlmixed.js"></script>
-    <script src="../xml/xml.js"></script>
-    <script src="../javascript/javascript.js"></script>
-    <script src="../css/css.js"></script>
-    <script src="../clike/clike.js"></script>
-    <script src="php.js"></script>
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: PHP mode</h1>
-
-<form><textarea id="code" name="code">
-<?php
-function hello($who) {
-       return "Hello " . $who;
-}
-?>
-<p>The program says <?= hello("World") ?>.</p>
-<script>
-       alert("And here is some JS code"); // also colored
-</script>
-</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        matchBrackets: true,
-        mode: "application/x-httpd-php",
-        indentUnit: 4,
-        indentWithTabs: true,
-        enterMode: "keep",
-        tabMode: "shift"
-      });
-    </script>
-
-    <p>Simple HTML/PHP mode based on
-    the <a href="../clike/">C-like</a> mode. Depends on XML,
-    JavaScript, CSS, HTMLMixed, and C-like modes.</p>
-
-    <p><strong>MIME types defined:</strong> <code>application/x-httpd-php</code> (HTML with PHP code), <code>text/x-php</code> (plain, non-wrapped PHP code).</p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/shell/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/shell/index.html
deleted file mode 100644 (file)
index 9a2ef7c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>CodeMirror: Shell mode</title>
-
-<link rel=stylesheet href=../../lib/codemirror.css>
-<link rel=stylesheet href=../../doc/docs.css>
-
-<style type=text/css>
-  .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
-</style>
-
-<script src=../../lib/codemirror.js></script>
-<script src="../../addon/edit/matchbrackets.js"></script>
-<script src=shell.js></script>
-
-<h1>CodeMirror: Shell mode</h1>
-
-<textarea id=code>
-#!/bin/bash
-
-# clone the repository
-git clone http://github.com/garden/tree
-
-# generate HTTPS credentials
-cd tree
-openssl genrsa -aes256 -out https.key 1024
-openssl req -new -nodes -key https.key -out https.csr
-openssl x509 -req -days 365 -in https.csr -signkey https.key -out https.crt
-cp https.key{,.orig}
-openssl rsa -in https.key.orig -out https.key
-
-# start the server in HTTPS mode
-cd web
-sudo node ../server.js 443 'yes' &gt;&gt; ../node.log &amp;
-
-# here is how to stop the server
-for pid in `ps aux | grep 'node ../server.js' | awk '{print $2}'` ; do
-  sudo kill -9 $pid 2&gt; /dev/null
-done
-
-exit 0</textarea>
-
-<script>
-  var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
-    mode: 'shell',
-    lineNumbers: true,
-    matchBrackets: true
-  });
-</script>
-
-<p><strong>MIME types defined:</strong> <code>text/x-sh</code>.</p>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/smarty/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/smarty/index.html
deleted file mode 100644 (file)
index 6b7debe..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: Smarty mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="smarty.js"></script>
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: Smarty mode</h1>
-
-    <form><textarea id="code" name="code">
-{extends file="parent.tpl"}
-{include file="template.tpl"}
-
-{* some example Smarty content *}
-{if isset($name) && $name == 'Blog'}
-  This is a {$var}.
-  {$integer = 451}, {$array[] = "a"}, {$stringvar = "string"}
-  {assign var='bob' value=$var.prop}
-{elseif $name == $foo}
-  {function name=menu level=0}
-    {foreach $data as $entry}
-      {if is_array($entry)}
-        - {$entry@key}
-        {menu data=$entry level=$level+1}
-      {else}
-        {$entry}
-      {/if}
-    {/foreach}
-  {/function}
-{/if}</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        lineNumbers: true,
-        mode: "smarty"
-      });
-    </script>
-
-    <br />
-
-    <form><textarea id="code2" name="code2">
-{--extends file="parent.tpl"--}
-{--include file="template.tpl"--}
-
-{--* some example Smarty content *--}
-{--if isset($name) && $name == 'Blog'--}
-  This is a {--$var--}.
-  {--$integer = 451--}, {--$array[] = "a"--}, {--$stringvar = "string"--}
-  {--assign var='bob' value=$var.prop--}
-{--elseif $name == $foo--}
-  {--function name=menu level=0--}
-    {--foreach $data as $entry--}
-      {--if is_array($entry)--}
-        - {--$entry@key--}
-        {--menu data=$entry level=$level+1--}
-      {--else--}
-        {--$entry--}
-      {--/if--}
-    {--/foreach--}
-  {--/function--}
-{--/if--}</textarea></form>
-
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code2"), {
-        lineNumbers: true,
-        mode: {
-          name: "smarty",
-          leftDelimiter: "{--",
-          rightDelimiter: "--}"
-        }
-      });
-    </script>
-
-    <p>A plain text/Smarty mode which allows for custom delimiter tags (defaults to <b>{</b> and <b>}</b>).</p>
-
-    <p><strong>MIME types defined:</strong> <code>text/x-smarty</code></p>
-  </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/sql/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/sql/index.html
deleted file mode 100644 (file)
index 8a2495c..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <title>SQL Mode for CodeMirror</title>
-        <link rel="stylesheet" href="../../lib/codemirror.css" />
-        <script src="../../lib/codemirror.js"></script>
-        <script src="../../lib/codemirror.js"></script>
-        <script src="sql.js"></script>
-        <style>
-.CodeMirror {
-    border-top: 1px solid black;
-    border-bottom: 1px solid black;
-}
-        </style>
-        <link rel="stylesheet" href="../../doc/docs.css">
-        <script>
-var init = function() {
-    var mime = 'text/x-mariadb';
-
-    // get mime type
-    if (window.location.href.indexOf('mime=') > -1) {
-        mime = window.location.href.substr(window.location.href.indexOf('mime=') + 5);
-    }
-
-    window.editor = CodeMirror.fromTextArea(document.getElementById('code'), {
-        mode: mime,
-        indentWithTabs: true,
-        smartIndent: true,
-        lineNumbers: true,
-        matchBrackets : true,
-        autofocus: true
-    });
-};
-        </script>
-    </head>
-    <body onload="init();">
-        <h1>SQL Mode for CodeMirror</h1>
-        <form>
-            <textarea id="code" name="code">-- SQL Mode for CodeMirror
-SELECT SQL_NO_CACHE DISTINCT
-               @var1 AS `val1`, @'val2', @global.'sql_mode',
-               1.1 AS `float_val`, .14 AS `another_float`, 0.09e3 AS `int_with_esp`,
-               0xFA5 AS `hex`, x'fa5' AS `hex2`, 0b101 AS `bin`, b'101' AS `bin2`,
-               DATE '1994-01-01' AS `sql_date`, { T "1994-01-01" } AS `odbc_date`,
-               'myString', UNKNOWN
-       FROM DUAL
-       -- space needed after '--'
-       # 1 line comment
-       /* multiline
-       comment! */
-       LIMIT 1 OFFSET 0;
-</textarea>
-            </form>
-            <p><strong>MIME types defined:</strong> 
-            <code><a href="?mime=text/x-sql">text/x-sql</a></code>,
-            <code><a href="?mime=text/x-mysql">text/x-mysql</a></code>,
-            <code><a href="?mime=text/x-mariadb">text/x-mariadb</a></code>,
-            <code><a href="?mime=text/x-plsql">text/x-plsql</a></code>.
-        </p>
-        <p>
-            <strong>Tests:</strong>
-            <a href="../../test/index.html#sql_*">normal</a>,
-            <a href="../../test/index.html#verbose,sql_*">verbose</a>.
-        </p>
-    </body>
-</html>
diff --git a/wcfsetup/install/files/js/3rdParty/codemirror/mode/xml/index.html b/wcfsetup/install/files/js/3rdParty/codemirror/mode/xml/index.html
deleted file mode 100644 (file)
index 9628d95..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>CodeMirror: XML mode</title>
-    <link rel="stylesheet" href="../../lib/codemirror.css">
-    <script src="../../lib/codemirror.js"></script>
-    <script src="xml.js"></script>
-    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
-    <link rel="stylesheet" href="../../doc/docs.css">
-  </head>
-  <body>
-    <h1>CodeMirror: XML mode</h1>
-    <form><textarea id="code" name="code">
-&lt;html style="color: green"&gt;
-  &lt;!-- this is a comment --&gt;
-  &lt;head&gt;
-    &lt;title&gt;HTML Example&lt;/title&gt;
-  &lt;/head&gt;
-  &lt;body&gt;
-    The indentation tries to be &lt;em&gt;somewhat &amp;quot;do what
-    I mean&amp;quot;&lt;/em&gt;... but might not match your style.
-  &lt;/body&gt;
-&lt;/html&gt;
-</textarea></form>
-    <script>
-      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
-        mode: {name: "xml", alignCDATA: true},
-        lineNumbers: true
-      });
-    </script>
-    <p>The XML mode supports two configuration parameters:</p>
-    <dl>
-      <dt><code>htmlMode (boolean)</code></dt>
-      <dd>This switches the mode to parse HTML instead of XML. This
-      means attributes do not have to be quoted, and some elements
-      (such as <code>br</code>) do not require a closing tag.</dd>
-      <dt><code>alignCDATA (boolean)</code></dt>
-      <dd>Setting this to true will force the opening tag of CDATA
-      blocks to not be indented.</dd>
-    </dl>
-
-    <p><strong>MIME types defined:</strong> <code>application/xml</code>, <code>text/html</code>.</p>
-  </body>
-</html>