diff --git a/libraries.txt b/libraries.txt
index 7e0bd5b7..32effda4 100644
--- a/libraries.txt
+++ b/libraries.txt
@@ -1,36 +1,36 @@
 This is a list of the third party libraries/code used in the application, not
 including Python modules installed via Pip which are listed in requirements.txt.
 
-Library             Version     Licence      URL
-=======             =======     =======      ===
-QT                  4.6.2+      LGPL v2.1/3  http://www.qt.io/
-Bootstrap           3.3.4       MIT          http://getbootstrap.com/
-jQuery              1.11.1      MIT          http://jquery.com/
-Modernizr           2.6.2       MIT/BSD      http://modernizr.com/
-AlertifyJS          1.7.1       MIT          http://alertifyjs.com/ *** Do not update - changed to GPL3 in 1.8.0 ***
-CodeMirror          5.14.2      MIT          http://codemirror.net/
-aciTree             4.5.0-rc.7  MIT/GPL      http://acoderinsights.ro/en/aciTree-tree-view-with-jQuery
-contextMenu         2.1.0       MIT          https://github.com/swisnl/jQuery-contextMenu
-wcDocker            0f5690318c  MIT/GPL      https://github.com/WebCabin/wcDocker
-Require.js          2.1.18      BSD/MIT      http://requirejs.org/
-Underscore.js       1.8.3       MIT          http://underscorejs.org/
-Underscore.string   387ab72d49  MIT          http://epeli.github.io/underscore.string/
-Backform.js         5859b4f9db  MIT          https://github.com/AmiliaApp/backform
-Backbone            1.1.2       MIT          http://backbonejs.org
-font-Awesome        4.5         SIL OFL      http://fortawesome.github.io/Font-Awesome/
-font-mfizz          2.3         MIT          http://fizzed.com/oss/font-mfizz
-backgrid.js         0.3.5       MIT          http://backgridjs.com/
-backbone.undo       0.2         MIT          http://backbone.undojs.com/
-bootstrap-switch    3.3.2       MIT          http://www.bootstrap-switch.org/
-select2             4.0.1       MIT          https://select2.github.io/
-backgrid-filter     01b2b21     MIT          https://github.com/wyuenho/backgrid-filter
-backbone.paginator  2.0.3       MIT          http://github.com/backbone-paginator/backbone.paginator
-backgrid-paginator  03632df     MIT          https://github.com/wyuenho/backgrid-paginator
-backgrid-select-all 1a00053     MIT          https://github.com/wyuenho/backgrid-select-all
-dropzone            4e20bd4     MIT          https://github.com/enyo/dropzone
-Filemanager         7e060c2     MIT          https://github.com/simogeo/Filemanager
-Unit (Length)       d8e6237     MIT          https://github.com/heygrady/Units/blob/master/Length.min.js
-Natural Sort        9565816     MIT          https://github.com/javve/natural-sort/blob/master/index.js
-SlickGrid           2.2.4       MIT          https://github.com/6pac/SlickGrid
-jQuery-UI           1.11.3      MIT          https://jqueryui.com/
-BigNumber           3.0.1       MIT          http://mikemcl.github.io/bignumber.js
\ No newline at end of file
+Library             Version        Licence      URL
+=======             =======        =======      ===
+QT                  4.6.2+         LGPL v2.1/3  http://www.qt.io/
+Bootstrap           3.3.4          MIT          http://getbootstrap.com/
+jQuery              1.11.1         MIT          http://jquery.com/
+Modernizr           2.6.2          MIT/BSD      http://modernizr.com/
+AlertifyJS          1.7.1          MIT          http://alertifyjs.com/ *** Do not update - changed to GPL3 in 1.8.0 ***
+CodeMirror          5.14.2         MIT          http://codemirror.net/
+aciTree             4.5.0-rc.7     MIT/GPL      http://acoderinsights.ro/en/aciTree-tree-view-with-jQuery
+contextMenu         2.1.0          MIT          https://github.com/swisnl/jQuery-contextMenu
+wcDocker            0f5690318c     MIT/GPL      https://github.com/WebCabin/wcDocker
+Require.js          2.1.18         BSD/MIT      http://requirejs.org/
+Underscore.js       1.8.3          MIT          http://underscorejs.org/
+Underscore.string   387ab72d49     MIT          http://epeli.github.io/underscore.string/
+Backform.js         5859b4f9db     MIT          https://github.com/AmiliaApp/backform
+Backbone            1.1.2          MIT          http://backbonejs.org
+font-Awesome        4.5            SIL OFL      http://fortawesome.github.io/Font-Awesome/
+font-mfizz          2.3            MIT          http://fizzed.com/oss/font-mfizz
+backgrid.js         0.3.5          MIT          http://backgridjs.com/
+backbone.undo       0.2            MIT          http://backbone.undojs.com/
+bootstrap-switch    3.3.2          MIT          http://www.bootstrap-switch.org/
+select2             4.0.1          MIT          https://select2.github.io/
+backgrid-filter     01b2b21        MIT          https://github.com/wyuenho/backgrid-filter
+backbone.paginator  2.0.3          MIT          http://github.com/backbone-paginator/backbone.paginator
+backgrid-paginator  03632df        MIT          https://github.com/wyuenho/backgrid-paginator
+backgrid-select-all 1a00053        MIT          https://github.com/wyuenho/backgrid-select-all
+dropzone            4e20bd4        MIT          https://github.com/enyo/dropzone
+Filemanager         7e060c2        MIT          https://github.com/simogeo/Filemanager
+Unit (Length)       d8e6237        MIT          https://github.com/heygrady/Units/blob/master/Length.min.js
+Natural Sort        9565816        MIT          https://github.com/javve/natural-sort/blob/master/index.js
+SlickGrid           2.3.7-8ff6814  MIT          https://github.com/6pac/SlickGrid
+jQuery-UI           1.11.3         MIT          https://jqueryui.com/
+BigNumber           3.0.1          MIT          http://mikemcl.github.io/bignumber.js
\ No newline at end of file
diff --git a/web/karma.conf.js b/web/karma.conf.js
index 713b9f05..39697ca7 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -17,6 +17,7 @@ module.exports = function (config) {
       {pattern: 'pgadmin/browser/static/js/**/*.js', included: false},
       'regression/javascript/**/*.jsx',
       'regression/javascript/**/*.js',
+      'pgadmin/static/bundle/slickgrid.js',
     ],
 
     // list of files to exclude
@@ -30,6 +31,7 @@ module.exports = function (config) {
     preprocessors: {
       'regression/javascript/**/*.js': ['webpack'],
       'regression/javascript/**/*.jsx': ['webpack'],
+      'pgadmin/static/bundle/slickgrid.js': ['webpack'],
     },
 
     webpack: webpackConfig,
diff --git a/web/package.json b/web/package.json
index cd8992f9..1eacdff8 100644
--- a/web/package.json
+++ b/web/package.json
@@ -4,6 +4,7 @@
     "babel-loader": "~6.4.1",
     "babel-preset-es2015": "~6.24.0",
     "babel-preset-react": "~6.23.0",
+    "css-loader": "^0.28.4",
     "enzyme": "~2.8.2",
     "enzyme-matchers": "^3.1.0",
     "eslint": "^3.19.0",
@@ -19,7 +20,9 @@
     "karma-requirejs": "~1.1.0",
     "karma-sourcemap-loader": "~0.3.7",
     "karma-webpack": "~2.0.3",
+    "raw-loader": "^0.5.1",
     "react-addons-test-utils": "~15.4.2",
+    "style-loader": "^0.18.2",
     "webpack": "~2.3.1"
   },
   "dependencies": {
@@ -36,12 +39,13 @@
     "react": "~15.4.2",
     "react-dom": "~15.4.2",
     "requirejs": "~2.3.3",
+    "slickgrid": "git+https://github.com/6pac/SlickGrid.git#2.3.7",
     "underscore": "~1.8.3",
     "watchify": "~3.9.0"
   },
   "scripts": {
     "linter": "yarn run eslint pgadmin/static/jsx/**/*.jsx pgadmin/static/js/selection/*.js regression/javascript/**/*.jsx regression/javascript/**/*.js *.js",
-    "webpacker": "yarn run webpack -- --optimize-minimize --config webpack.config.js",
+    "webpacker": "yarn run webpack -- --config webpack.config.js",
     "webpacker:dev": "yarn run webpack -- --config webpack.config.js",
     "bundle": "yarn run linter && yarn run webpacker",
     "bundle:dev": "yarn run linter && yarn run webpacker:dev",
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/bundle/components.js
similarity index 64%
rename from web/pgadmin/static/jsx/components.jsx
rename to web/pgadmin/static/bundle/components.js
index 6ff34e4c..221beff1 100644
--- a/web/pgadmin/static/jsx/components.jsx
+++ b/web/pgadmin/static/bundle/components.js
@@ -1,7 +1,6 @@
-
 import React from 'react';
 import {render} from 'react-dom';
-import QueryHistory from './history/query_history';
+import QueryHistory from '../jsx/history/query_history';
 
 export {
   render,
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
new file mode 100644
index 00000000..0d82a6bd
--- /dev/null
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -0,0 +1,13 @@
+import 'slickgrid/slick.grid.css';
+import 'slickgrid/slick-default-theme.css';
+import 'slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
+import 'slickgrid/slick.core';
+import 'slickgrid/slick.grid';
+import 'slickgrid/slick.editors';
+import 'slickgrid/slick.formatters';
+import 'slickgrid/plugins/slick.autotooltips';
+import 'slickgrid/plugins/slick.cellrangedecorator';
+import 'slickgrid/plugins/slick.cellrangeselector';
+import 'slickgrid/lib/jquery.event.drag-2.3.0';
+
+export default window.Slick;
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/xcell_selection_model.js b/web/pgadmin/static/js/selection/xcell_selection_model.js
index 974b7479..8a128c43 100644
--- a/web/pgadmin/static/js/selection/xcell_selection_model.js
+++ b/web/pgadmin/static/js/selection/xcell_selection_model.js
@@ -2,10 +2,9 @@ define([
   'jquery',
   'underscore',
   'sources/selection/range_selection_helper',
-  'sources/slickgrid/pgslick.cellrangeselector',
 
   'slickgrid',
-], function ($, _, RangeSelectionHelper, PGCellRangeSelector) {
+], function ($, _, RangeSelectionHelper) {
   var XCellSelectionModel = function (options) {
 
     var KEY_ARROW_RIGHT = 39;
@@ -17,7 +16,7 @@ define([
     var _grid;
     var _ranges = [];
     var _self = this;
-    var _selector = new PGCellRangeSelector({
+    var _selector = new Slick.CellRangeSelector({
       'selectionCss': {
         'border': '2px solid black',
       },
diff --git a/web/pgadmin/static/js/slickgrid/pgslick.cellrangedecorator.js b/web/pgadmin/static/js/slickgrid/pgslick.cellrangedecorator.js
deleted file mode 100644
index 8b0e340f..00000000
--- a/web/pgadmin/static/js/slickgrid/pgslick.cellrangedecorator.js
+++ /dev/null
@@ -1,73 +0,0 @@
-define([
-  'jquery',
-
-  'slickgrid',
-], function ($) {
-  /***
-   * Displays an overlay on top of a given cell range.
-   *
-   * TODO:
-   * Currently, it blocks mouse events to DOM nodes behind it.
-   * Use FF and WebKit-specific "pointer-events" CSS style, or some kind of event forwarding.
-   * Could also construct the borders separately using 4 individual DIVs.
-   *
-   * @param {Grid} grid
-   * @param {Object} options
-   */
-  var PGCellRangeDecorator = function (grid, options) {
-    var _elem;
-    var _defaults = {
-      selectionCssClass: 'slick-range-decorator',
-      selectionCss: {
-        "zIndex": "9999",
-        "border": "2px dashed red"
-      }
-    };
-
-    options = $.extend(true, {}, _defaults, options);
-
-
-    function show(range) {
-      if (!_elem) {
-        _elem = $("<div></div>", {css: options.selectionCss})
-            .addClass(options.selectionCssClass)
-            .css("position", "absolute")
-            .appendTo(grid.getCanvasNode());
-      }
-
-      var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
-      var to = grid.getCellNodeBox(range.toRow, range.toCell);
-
-      // TODO: This is the original Slickgrid code temporary fix to solve
-      // pgAdmin alignment of the selection box on the bottom right corner
-      // _elem.css({
-      //   top: from.top - 1,
-      //   left: from.left - 1,
-      //   height: to.bottom - from.top - 2,
-      //   width: to.right - from.left - 2
-      // });
-
-      _elem.css({
-        top: from.top - 1,
-        left: from.left - 1,
-        height: to.bottom - from.top + 2,
-        width: to.right - from.left + 1
-      });
-
-      return _elem;
-    }
-
-    function hide() {
-      if (_elem) {
-        _elem.remove();
-        _elem = null;
-      }
-    }
-
-    $.extend(this, {
-      "show": show,
-      "hide": hide
-    });
-  };
-  return PGCellRangeDecorator;
-});
diff --git a/web/pgadmin/static/js/slickgrid/pgslick.cellrangeselector.js b/web/pgadmin/static/js/slickgrid/pgslick.cellrangeselector.js
deleted file mode 100644
index 6a8649bc..00000000
--- a/web/pgadmin/static/js/slickgrid/pgslick.cellrangeselector.js
+++ /dev/null
@@ -1,119 +0,0 @@
-define([
-  'jquery',
-  'sources/slickgrid/pgslick.cellrangedecorator',
-
-  'slickgrid',
-], function ($, PGCellRangeDecorator) {
-
-  var PGCellRangeSelector = function (options) {
-    var _grid;
-    var _canvas;
-    var _currentlySelectedRange;
-    var _dragging;
-    var _decorator;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _defaults = {
-      selectionCss: {
-        "border": "2px dashed blue"
-      }
-    };
-
-
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _decorator = new PGCellRangeDecorator(grid, options);
-      _grid = grid;
-      _canvas = _grid.getCanvasNode();
-      _handler
-        .subscribe(_grid.onDragInit, handleDragInit)
-        .subscribe(_grid.onDragStart, handleDragStart)
-        .subscribe(_grid.onDrag, handleDrag)
-        .subscribe(_grid.onDragEnd, handleDragEnd);
-    }
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-    function handleDragInit(e, dd) {
-      // prevent the grid from cancelling drag'n'drop by default
-      e.stopImmediatePropagation();
-    }
-
-    function handleDragStart(e, dd) {
-      var cell = _grid.getCellFromEvent(e);
-      if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
-        if (_grid.canCellBeSelected(cell.row, cell.cell)) {
-          _dragging = true;
-          e.stopImmediatePropagation();
-        }
-      }
-      if (!_dragging) {
-        return;
-      }
-
-      _grid.focus();
-
-      var start = _grid.getCellFromPoint(
-          dd.startX - $(_canvas).offset().left,
-          dd.startY - $(_canvas).offset().top);
-
-      dd.range = {start: start, end: {}};
-      _currentlySelectedRange = dd.range;
-      return _decorator.show(new Slick.Range(start.row, start.cell));
-    }
-
-    function handleDrag(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-      e.stopImmediatePropagation();
-
-      var end = _grid.getCellFromPoint(
-          e.pageX - $(_canvas).offset().left,
-          e.pageY - $(_canvas).offset().top);
-
-      if (!_grid.canCellBeSelected(end.row, end.cell)) {
-        return;
-      }
-
-      dd.range.end = end;
-      _currentlySelectedRange = dd.range;
-      _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
-    }
-
-    function handleDragEnd(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-
-      _dragging = false;
-      e.stopImmediatePropagation();
-
-      _decorator.hide();
-      _self.onCellRangeSelected.notify({
-        range: new Slick.Range(
-            dd.range.start.row,
-            dd.range.start.cell,
-            dd.range.end.row,
-            dd.range.end.cell
-        )
-      });
-    }
-
-    function getCurrentRange() {
-      return _currentlySelectedRange;
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-      "getCurrentRange": getCurrentRange,
-
-      "onBeforeCellRangeSelected": new Slick.Event(),
-      "onCellRangeSelected": new Slick.Event()
-    });
-  };
-  return PGCellRangeSelector;
-});
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/README.md b/web/pgadmin/static/vendor/slickgrid/README.md
deleted file mode 100644
index e8a1ad7a..00000000
--- a/web/pgadmin/static/vendor/slickgrid/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-## This is the 6pac SlickGrid repo
-
-This is the acknowledged most active non-customised fork of SlickGrid.
-
-It aims to be a viable alternative master repo, building on the legacy of the mleibman/SlickGrid master branch, keeping libraries up to date and applying small, safe core patches and enhancements without turning into a personalised build.
-
-Check out the [examples](https://github.com/6pac/SlickGrid/wiki/Examples) for examples demonstrating new features and use cases, such as dynamic grid creation and editors with third party controls.
-
-Also check out the [wiki](https://github.com/6pac/SlickGrid/wiki) for news and documentation.
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.css b/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.css
deleted file mode 100644
index bcbb3758..00000000
--- a/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.slick-columnpicker {
-  border: 1px solid #718BB7;
-  background: #f0f0f0;
-  padding: 6px;
-  -moz-box-shadow: 2px 2px 2px silver;
-  -webkit-box-shadow: 2px 2px 2px silver;
-  box-shadow: 2px 2px 2px silver;
-  min-width: 100px;
-  cursor: default;
-}
-
-.slick-columnpicker li {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-
-.slick-columnpicker input {
-  margin: 4px;
-}
-
-.slick-columnpicker li a {
-  display: block;
-  padding: 4px;
-  font-weight: bold;
-}
-
-.slick-columnpicker li a:hover {
-  background: white;
-}
diff --git a/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.js b/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.js
deleted file mode 100644
index 93a6be5b..00000000
--- a/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.js
+++ /dev/null
@@ -1,153 +0,0 @@
-(function ($) {
-  function SlickColumnPicker(columns, grid, options) {
-    var $menu;
-    var columnCheckboxes;
-
-    var defaults = {
-      fadeSpeed:250
-    };
-
-    function init() {
-      grid.onHeaderContextMenu.subscribe(handleHeaderContextMenu);
-      grid.onColumnsReordered.subscribe(updateColumnOrder);
-      options = $.extend({}, defaults, options);
-
-      $menu = $("<span class='slick-columnpicker' style='display:none;position:absolute;z-index:20;overflow-y:scroll;' />").appendTo(document.body);
-
-      $menu.on("mouseleave", function (e) {
-        $(this).fadeOut(options.fadeSpeed)
-      });
-      $menu.on("click", updateColumn);
-
-    }
-
-    function destroy() {
-      grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu);
-      grid.onColumnsReordered.unsubscribe(updateColumnOrder);
-      $menu.remove();
-    }
-
-    function handleHeaderContextMenu(e, args) {
-      e.preventDefault();
-      $menu.empty();
-      updateColumnOrder();
-      columnCheckboxes = [];
-
-      var $li, $input;
-      for (var i = 0; i < columns.length; i++) {
-        $li = $("<li />").appendTo($menu);
-        $input = $("<input type='checkbox' />").data("column-id", columns[i].id);
-        columnCheckboxes.push($input);
-
-        if (grid.getColumnIndex(columns[i].id) != null) {
-          $input.attr("checked", "checked");
-        }
-
-        $("<label />")
-            .html(columns[i].name)
-            .prepend($input)
-            .appendTo($li);
-      }
-
-      $("<hr/>").appendTo($menu);
-      $li = $("<li />").appendTo($menu);
-      $input = $("<input type='checkbox' />").data("option", "autoresize");
-      $("<label />")
-          .text("Force fit columns")
-          .prepend($input)
-          .appendTo($li);
-      if (grid.getOptions().forceFitColumns) {
-        $input.attr("checked", "checked");
-      }
-
-      $li = $("<li />").appendTo($menu);
-      $input = $("<input type='checkbox' />").data("option", "syncresize");
-      $("<label />")
-          .text("Synchronous resize")
-          .prepend($input)
-          .appendTo($li);
-      if (grid.getOptions().syncColumnCellResize) {
-        $input.attr("checked", "checked");
-      }
-
-      $menu
-          .css("top", e.pageY - 10)
-          .css("left", e.pageX - 10)
-          .css("max-height", $(window).height() - e.pageY -10)
-          .fadeIn(options.fadeSpeed);
-    }
-
-    function updateColumnOrder() {
-      // Because columns can be reordered, we have to update the `columns`
-      // to reflect the new order, however we can't just take `grid.getColumns()`,
-      // as it does not include columns currently hidden by the picker.
-      // We create a new `columns` structure by leaving currently-hidden
-      // columns in their original ordinal position and interleaving the results
-      // of the current column sort.
-      var current = grid.getColumns().slice(0);
-      var ordered = new Array(columns.length);
-      for (var i = 0; i < ordered.length; i++) {
-        if ( grid.getColumnIndex(columns[i].id) === undefined ) {
-          // If the column doesn't return a value from getColumnIndex,
-          // it is hidden. Leave it in this position.
-          ordered[i] = columns[i];
-        } else {
-          // Otherwise, grab the next visible column.
-          ordered[i] = current.shift();
-        }
-      }
-      columns = ordered;
-    }
-
-    function updateColumn(e) {
-      if ($(e.target).data("option") == "autoresize") {
-        if (e.target.checked) {
-          grid.setOptions({forceFitColumns:true});
-          grid.autosizeColumns();
-        } else {
-          grid.setOptions({forceFitColumns:false});
-        }
-        return;
-      }
-
-      if ($(e.target).data("option") == "syncresize") {
-        if (e.target.checked) {
-          grid.setOptions({syncColumnCellResize:true});
-        } else {
-          grid.setOptions({syncColumnCellResize:false});
-        }
-        return;
-      }
-
-      if ($(e.target).is(":checkbox")) {
-        var visibleColumns = [];
-        $.each(columnCheckboxes, function (i, e) {
-          if ($(this).is(":checked")) {
-            visibleColumns.push(columns[i]);
-          }
-        });
-
-        if (!visibleColumns.length) {
-          $(e.target).attr("checked", "checked");
-          return;
-        }
-
-        grid.setColumns(visibleColumns);
-      }
-    }
-
-    function getAllColumns() {
-      return columns;
-    }
-
-    init();
-
-    return {
-      "getAllColumns": getAllColumns,
-      "destroy": destroy
-    };
-  }
-
-  // Slick.Controls.ColumnPicker
-  $.extend(true, window, { Slick:{ Controls:{ ColumnPicker:SlickColumnPicker }}});
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.css b/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.css
deleted file mode 100644
index e360ec67..00000000
--- a/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.css
+++ /dev/null
@@ -1,41 +0,0 @@
-.slick-pager {
-  width: 100%;
-  height: 26px;
-  border: 1px solid gray;
-  border-top: 0;
-  background: url('../images/header-columns-bg.gif') repeat-x center bottom;
-  vertical-align: middle;
-}
-
-.slick-pager .slick-pager-status {
-  display: inline-block;
-  padding: 6px;
-}
-
-.slick-pager .ui-icon-container {
-  display: inline-block;
-  margin: 2px;
-  border-color: gray;
-}
-
-.slick-pager .slick-pager-nav {
-  display: inline-block;
-  float: left;
-  padding: 2px;
-}
-
-.slick-pager .slick-pager-settings {
-  display: block;
-  float: right;
-  padding: 2px;
-}
-
-.slick-pager .slick-pager-settings * {
-  vertical-align: middle;
-}
-
-.slick-pager .slick-pager-settings a {
-  padding: 2px;
-  text-decoration: underline;
-  cursor: pointer;
-}
diff --git a/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.js b/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.js
deleted file mode 100644
index b9c6b741..00000000
--- a/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.js
+++ /dev/null
@@ -1,147 +0,0 @@
-(function ($) {
-  function SlickGridPager(dataView, grid, $container) {
-    var $status;
-
-    function init() {
-      dataView.onPagingInfoChanged.subscribe(function (e, pagingInfo) {
-        updatePager(pagingInfo);
-      });
-
-      constructPagerUI();
-      updatePager(dataView.getPagingInfo());
-    }
-
-    function getNavState() {
-      var cannotLeaveEditMode = !Slick.GlobalEditorLock.commitCurrentEdit();
-      var pagingInfo = dataView.getPagingInfo();
-      var lastPage = pagingInfo.totalPages - 1;
-
-      return {
-        canGotoFirst: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
-        canGotoLast: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum != lastPage,
-        canGotoPrev: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
-        canGotoNext: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum < lastPage,
-        pagingInfo: pagingInfo
-      }
-    }
-
-    function setPageSize(n) {
-      dataView.setRefreshHints({
-        isFilterUnchanged: true
-      });
-      dataView.setPagingOptions({pageSize: n});
-    }
-
-    function gotoFirst() {
-      if (getNavState().canGotoFirst) {
-        dataView.setPagingOptions({pageNum: 0});
-      }
-    }
-
-    function gotoLast() {
-      var state = getNavState();
-      if (state.canGotoLast) {
-        dataView.setPagingOptions({pageNum: state.pagingInfo.totalPages - 1});
-      }
-    }
-
-    function gotoPrev() {
-      var state = getNavState();
-      if (state.canGotoPrev) {
-        dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum - 1});
-      }
-    }
-
-    function gotoNext() {
-      var state = getNavState();
-      if (state.canGotoNext) {
-        dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum + 1});
-      }
-    }
-
-    function constructPagerUI() {
-      $container.empty();
-
-      var $nav = $("<span class='slick-pager-nav' />").appendTo($container);
-      var $settings = $("<span class='slick-pager-settings' />").appendTo($container);
-      $status = $("<span class='slick-pager-status' />").appendTo($container);
-
-      $settings
-          .append("<span class='slick-pager-settings-expanded' style='display:none'>Show: <a data=0>All</a><a data='-1'>Auto</a><a data=25>25</a><a data=50>50</a><a data=100>100</a></span>");
-
-      $settings.find("a[data]").click(function (e) {
-        var pagesize = $(e.target).attr("data");
-        if (pagesize != undefined) {
-          if (pagesize == -1) {
-            var vp = grid.getViewport();
-            setPageSize(vp.bottom - vp.top);
-          } else {
-            setPageSize(parseInt(pagesize));
-          }
-        }
-      });
-
-      var icon_prefix = "<span class='ui-state-default ui-corner-all ui-icon-container'><span class='ui-icon ";
-      var icon_suffix = "' /></span>";
-
-      $(icon_prefix + "ui-icon-lightbulb" + icon_suffix)
-          .click(function () {
-            $(".slick-pager-settings-expanded").toggle()
-          })
-          .appendTo($settings);
-
-      $(icon_prefix + "ui-icon-seek-first" + icon_suffix)
-          .click(gotoFirst)
-          .appendTo($nav);
-
-      $(icon_prefix + "ui-icon-seek-prev" + icon_suffix)
-          .click(gotoPrev)
-          .appendTo($nav);
-
-      $(icon_prefix + "ui-icon-seek-next" + icon_suffix)
-          .click(gotoNext)
-          .appendTo($nav);
-
-      $(icon_prefix + "ui-icon-seek-end" + icon_suffix)
-          .click(gotoLast)
-          .appendTo($nav);
-
-      $container.find(".ui-icon-container")
-          .hover(function () {
-            $(this).toggleClass("ui-state-hover");
-          });
-
-      $container.children().wrapAll("<div class='slick-pager' />");
-    }
-
-
-    function updatePager(pagingInfo) {
-      var state = getNavState();
-
-      $container.find(".slick-pager-nav span").removeClass("ui-state-disabled");
-      if (!state.canGotoFirst) {
-        $container.find(".ui-icon-seek-first").addClass("ui-state-disabled");
-      }
-      if (!state.canGotoLast) {
-        $container.find(".ui-icon-seek-end").addClass("ui-state-disabled");
-      }
-      if (!state.canGotoNext) {
-        $container.find(".ui-icon-seek-next").addClass("ui-state-disabled");
-      }
-      if (!state.canGotoPrev) {
-        $container.find(".ui-icon-seek-prev").addClass("ui-state-disabled");
-      }
-
-      if (pagingInfo.pageSize == 0) {
-        $status.text("Showing all " + pagingInfo.totalRows + " rows");
-      } else {
-        $status.text("Showing page " + (pagingInfo.pageNum + 1) + " of " + pagingInfo.totalPages);
-      }
-    }
-
-    init();
-  }
-
-  // Slick.Controls.Pager
-  $.extend(true, window, { Slick:{ Controls:{ Pager:SlickGridPager }}});
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/images/CheckboxN.png b/web/pgadmin/static/vendor/slickgrid/images/CheckboxN.png
deleted file mode 100644
index 072ecbb96435c4822374cb3116fca5819194363e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/CheckboxY.png b/web/pgadmin/static/vendor/slickgrid/images/CheckboxY.png
deleted file mode 100644
index 467f3010896f438d0ede54760ba1aec7da3161ed..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/actions.gif b/web/pgadmin/static/vendor/slickgrid/images/actions.gif
deleted file mode 100644
index 026dd108edb433b2592695258f5a26fead66a7bf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/ajax-loader-small.gif b/web/pgadmin/static/vendor/slickgrid/images/ajax-loader-small.gif
deleted file mode 100644
index 5b33f7e54f4e55b6b8774d86d96895db9af044b4..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/arrow_redo.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_redo.png
deleted file mode 100644
index 4f7f55d6f2f41754d868fe3ffb85212b57d939ce..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/arrow_right_peppermint.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_right_peppermint.png
deleted file mode 100644
index 87225678667a823d75f5e3212c373ae39f909386..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/arrow_right_spearmint.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_right_spearmint.png
deleted file mode 100644
index 277ddde3848ebd8322c3d1d047314faee841078e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/arrow_undo.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_undo.png
deleted file mode 100644
index bc9924ac0793d1bd183f16b4b3513ef7050140a9..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/bullet_blue.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_blue.png
deleted file mode 100644
index 79d978c36a5bd95d9a255d96a06970f2ca7e98d7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/bullet_star.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_star.png
deleted file mode 100644
index 142ea482a527acce8042adbb0e42f19a083b677f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_minus.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_minus.png
deleted file mode 100644
index f5aa0450d437b2dfbc97cfc2cb6f7c13cee75ab5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_plus.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_plus.png
deleted file mode 100644
index a96505342397eca5b40c767dfaba1422f5fc8cce..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/calendar.gif b/web/pgadmin/static/vendor/slickgrid/images/calendar.gif
deleted file mode 100644
index 90fd2e17fe247d3252977a0fb5b9e15aa0a513fb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/collapse.gif b/web/pgadmin/static/vendor/slickgrid/images/collapse.gif
deleted file mode 100644
index 01e691450c48632dc92a40a8c2b509bf99987225..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/comment_yellow.gif b/web/pgadmin/static/vendor/slickgrid/images/comment_yellow.gif
deleted file mode 100644
index df7158a47713eaba957b506048235a44ea204b7e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/down.gif b/web/pgadmin/static/vendor/slickgrid/images/down.gif
deleted file mode 100644
index 9bd9447552a7ee77440787a945ce61f26bd9a079..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/drag-handle.png b/web/pgadmin/static/vendor/slickgrid/images/drag-handle.png
deleted file mode 100644
index ad7531cf046278081efe4b36e4f32d9e99bcc108..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/editor-helper-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/editor-helper-bg.gif
deleted file mode 100644
index 2daa973bc525c83872e4a0357b756727ca7eaa49..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/expand.gif b/web/pgadmin/static/vendor/slickgrid/images/expand.gif
deleted file mode 100644
index 1b24ef1248de55c6140895f6760758a1579f14cf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/header-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-bg.gif
deleted file mode 100644
index fe7dd1c1ebedc02d4e1aabf91fe43e1bcae824e7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/header-columns-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-columns-bg.gif
deleted file mode 100644
index 8d459a304e0b224f8c28d6b7b585da7019d28cce..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/header-columns-over-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-columns-over-bg.gif
deleted file mode 100644
index f9c07af1347fc44dcabb1a9d22458deb195fd92b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/help.png b/web/pgadmin/static/vendor/slickgrid/images/help.png
deleted file mode 100644
index 85eca0950fbe19e870f7701b0bfac6b9a96b317b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/info.gif b/web/pgadmin/static/vendor/slickgrid/images/info.gif
deleted file mode 100644
index 5769434fb244628e2a7637ae9efe4bb041aa8971..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/listview.gif b/web/pgadmin/static/vendor/slickgrid/images/listview.gif
deleted file mode 100644
index 3ec25ca71979f1e2f0632060d8a295b5c668cb4b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/pencil.gif b/web/pgadmin/static/vendor/slickgrid/images/pencil.gif
deleted file mode 100644
index 29f78f433d0924b4ba58baf95a26403ee959388a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/row-over-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/row-over-bg.gif
deleted file mode 100644
index b288e38739ad9914b73eb32837303a11a37f354a..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/sort-asc.gif b/web/pgadmin/static/vendor/slickgrid/images/sort-asc.gif
deleted file mode 100644
index 67a2a4c669fc5821a07fc486228d626e16d6ad9e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/sort-asc.png b/web/pgadmin/static/vendor/slickgrid/images/sort-asc.png
deleted file mode 100644
index 8604ff4e07c3bf339eb6e3fa1a8c3c34ee7f89f6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/sort-desc.gif b/web/pgadmin/static/vendor/slickgrid/images/sort-desc.gif
deleted file mode 100644
index 34db47c3b1eecab2d3873ee2fc556cd3a6e322f9..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/sort-desc.png b/web/pgadmin/static/vendor/slickgrid/images/sort-desc.png
deleted file mode 100644
index a2a6adf9366d1d5f8b08ee30f691b1ee96be0924..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/stripes.png b/web/pgadmin/static/vendor/slickgrid/images/stripes.png
deleted file mode 100644
index c3c4b28a80f82ed57433fdd2f113147a7160f064..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/tag_red.png b/web/pgadmin/static/vendor/slickgrid/images/tag_red.png
deleted file mode 100644
index d290fcd791ec801429fc32f166878c1f22c7e8ae..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/tick.png b/web/pgadmin/static/vendor/slickgrid/images/tick.png
deleted file mode 100644
index 3899d71dfa7355eba66d13e93290d58f16c31600..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/user_identity.gif b/web/pgadmin/static/vendor/slickgrid/images/user_identity.gif
deleted file mode 100644
index 095831ba424e31859de4aaca93ded96618a6e186..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/images/user_identity_plus.gif b/web/pgadmin/static/vendor/slickgrid/images/user_identity_plus.gif
deleted file mode 100644
index b276a81c786561a82422555b598bbc07e63bf82b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.autotooltips.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.autotooltips.js
deleted file mode 100644
index ffa93e0d..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.autotooltips.js
+++ /dev/null
@@ -1,83 +0,0 @@
-(function ($) {
-  // Register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "AutoTooltips": AutoTooltips
-    }
-  });
-
-  /**
-   * AutoTooltips plugin to show/hide tooltips when columns are too narrow to fit content.
-   * @constructor
-   * @param {boolean} [options.enableForCells=true]        - Enable tooltip for grid cells
-   * @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells
-   * @param {number}  [options.maxToolTipLength=null]      - The maximum length for a tooltip
-   */
-  function AutoTooltips(options) {
-    var _grid;
-    var _self = this;
-    var _defaults = {
-      enableForCells: true,
-      enableForHeaderCells: false,
-      maxToolTipLength: null
-    };
-    
-    /**
-     * Initialize plugin.
-     */
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      if (options.enableForCells) _grid.onMouseEnter.subscribe(handleMouseEnter);
-      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.subscribe(handleHeaderMouseEnter);
-    }
-    
-    /**
-     * Destroy plugin.
-     */
-    function destroy() {
-      if (options.enableForCells) _grid.onMouseEnter.unsubscribe(handleMouseEnter);
-      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.unsubscribe(handleHeaderMouseEnter);
-    }
-    
-    /**
-     * Handle mouse entering grid cell to add/remove tooltip.
-     * @param {jQuery.Event} e - The event
-     */
-    function handleMouseEnter(e) {
-      var cell = _grid.getCellFromEvent(e);
-      if (cell) {
-        var $node = $(_grid.getCellNode(cell.row, cell.cell));
-        var text;
-        if ($node.innerWidth() < $node[0].scrollWidth) {
-          text = $.trim($node.text());
-          if (options.maxToolTipLength && text.length > options.maxToolTipLength) {
-            text = text.substr(0, options.maxToolTipLength - 3) + "...";
-          }
-        } else {
-          text = "";
-        }
-        $node.attr("title", text);
-      }
-    }
-    
-    /**
-     * Handle mouse entering header cell to add/remove tooltip.
-     * @param {jQuery.Event} e     - The event
-     * @param {object} args.column - The column definition
-     */
-    function handleHeaderMouseEnter(e, args) {
-      var column = args.column,
-          $node = $(e.target).closest(".slick-header-column");
-      if (column && !column.toolTip) {
-        $node.attr("title", ($node.innerWidth() < $node[0].scrollWidth) ? column.name : "");
-      }
-    }
-    
-    // Public API
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellcopymanager.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellcopymanager.js
deleted file mode 100644
index 66c2376c..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellcopymanager.js
+++ /dev/null
@@ -1,88 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CellCopyManager": CellCopyManager
-    }
-  });
-
-
-  function CellCopyManager() {
-    var _grid;
-    var _self = this;
-    var _copiedRanges;
-
-    function init(grid) {
-      _grid = grid;
-      _grid.onKeyDown.subscribe(handleKeyDown);
-    }
-
-    function destroy() {
-      _grid.onKeyDown.unsubscribe(handleKeyDown);
-    }
-
-    function handleKeyDown(e, args) {
-      var ranges;
-      if (!_grid.getEditorLock().isActive()) {
-        if (e.which == $.ui.keyCode.ESCAPE) {
-          if (_copiedRanges) {
-            e.preventDefault();
-            clearCopySelection();
-            _self.onCopyCancelled.notify({ranges: _copiedRanges});
-            _copiedRanges = null;
-          }
-        }
-
-        if (e.which == 67 && (e.ctrlKey || e.metaKey)) {
-          ranges = _grid.getSelectionModel().getSelectedRanges();
-          if (ranges.length != 0) {
-            e.preventDefault();
-            _copiedRanges = ranges;
-            markCopySelection(ranges);
-            _self.onCopyCells.notify({ranges: ranges});
-          }
-        }
-
-        if (e.which == 86 && (e.ctrlKey || e.metaKey)) {
-          if (_copiedRanges) {
-            e.preventDefault();
-            ranges = _grid.getSelectionModel().getSelectedRanges();
-            _self.onPasteCells.notify({from: _copiedRanges, to: ranges});
-            if (!_grid.getOptions().preserveCopiedSelectionOnPaste) {
-              clearCopySelection();
-              _copiedRanges = null;
-            }
-          }
-        }
-      }
-    }
-
-    function markCopySelection(ranges) {
-      var columns = _grid.getColumns();
-      var hash = {};
-      for (var i = 0; i < ranges.length; i++) {
-        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
-          hash[j] = {};
-          for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {
-            hash[j][columns[k].id] = "copied";
-          }
-        }
-      }
-      _grid.setCellCssStyles("copy-manager", hash);
-    }
-
-    function clearCopySelection() {
-      _grid.removeCellCssStyles("copy-manager");
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-      "clearCopySelection": clearCopySelection,
-
-      "onCopyCells": new Slick.Event(),
-      "onCopyCancelled": new Slick.Event(),
-      "onPasteCells": new Slick.Event()
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellexternalcopymanager.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellexternalcopymanager.js
deleted file mode 100644
index fec7cb2a..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellexternalcopymanager.js
+++ /dev/null
@@ -1,449 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CellExternalCopyManager": CellExternalCopyManager
-    }
-  });
-
-
-  function CellExternalCopyManager(options) {
-    /*
-      This manager enables users to copy/paste data from/to an external Spreadsheet application
-      such as MS-Excel® or OpenOffice-Spreadsheet.
-      
-      Since it is not possible to access directly the clipboard in javascript, the plugin uses
-      a trick to do it's job. After detecting the keystroke, we dynamically create a textarea
-      where the browser copies/pastes the serialized data. 
-      
-      options:
-        copiedCellStyle : sets the css className used for copied cells. default : "copied"
-        copiedCellStyleLayerKey : sets the layer key for setting css values of copied cells. default : "copy-manager"
-        dataItemColumnValueExtractor : option to specify a custom column value extractor function
-        dataItemColumnValueSetter : option to specify a custom column value setter function
-        clipboardCommandHandler : option to specify a custom handler for paste actions
-        includeHeaderWhenCopying : set to true and the plugin will take the name property from each column (which is usually what appears in your header) and put that as the first row of the text that's copied to the clipboard
-        bodyElement: option to specify a custom DOM element which to will be added the hidden textbox. It's useful if the grid is inside a modal dialog.
-        onCopyInit: optional handler to run when copy action initializes
-        onCopySuccess: optional handler to run when copy action is complete
-        newRowCreator: function to add rows to table if paste overflows bottom of table
-        readOnlyMode: suppresses paste
-    */
-    var _grid;
-    var _self = this;
-    var _copiedRanges;
-    var _options = options || {};
-    var _copiedCellStyleLayerKey = _options.copiedCellStyleLayerKey || "copy-manager";
-    var _copiedCellStyle = _options.copiedCellStyle || "copied";
-    var _clearCopyTI = 0;
-    var _bodyElement = _options.bodyElement || document.body;
-    var _onCopyInit = _options.onCopyInit || null;
-    var _onCopySuccess = _options.onCopySuccess || null;
-    
-    var keyCodes = {
-      'C': 67,
-      'V': 86,
-      'ESC': 27,
-      'INSERT': 45
-    };
-
-    function init(grid) {
-      _grid = grid;
-      _grid.onKeyDown.subscribe(handleKeyDown);
-      
-      // we need a cell selection model
-      var cellSelectionModel = grid.getSelectionModel();
-      if (!cellSelectionModel){
-        throw new Error("Selection model is mandatory for this plugin. Please set a selection model on the grid before adding this plugin: grid.setSelectionModel(new Slick.CellSelectionModel())");
-      }
-      // we give focus on the grid when a selection is done on it.
-      // without this, if the user selects a range of cell without giving focus on a particular cell, the grid doesn't get the focus and key stroke handles (ctrl+c) don't work
-      cellSelectionModel.onSelectedRangesChanged.subscribe(function(e, args){
-        _grid.focus();
-      });
-    }
-
-    function destroy() {
-      _grid.onKeyDown.unsubscribe(handleKeyDown);
-    }
-    
-    function getDataItemValueForColumn(item, columnDef) {
-      if (_options.dataItemColumnValueExtractor) {
-        var dataItemColumnValueExtractorValue = _options.dataItemColumnValueExtractor(item, columnDef);
-
-        if (dataItemColumnValueExtractorValue)
-          return dataItemColumnValueExtractorValue;
-      }
-
-      var retVal = '';
-
-      // if a custom getter is not defined, we call serializeValue of the editor to serialize
-      if (columnDef.editor){
-        var editorArgs = {
-          'container':$("<p>"),  // a dummy container
-          'column':columnDef,
-          'position':{'top':0, 'left':0},  // a dummy position required by some editors
-          'grid':_grid
-        };
-        var editor = new columnDef.editor(editorArgs);
-        editor.loadValue(item);
-        retVal = editor.serializeValue();
-        editor.destroy();
-      }
-      else {
-        retVal = item[columnDef.field];
-      }
-
-      return retVal;
-    }
-    
-    function setDataItemValueForColumn(item, columnDef, value) {
-      if (_options.dataItemColumnValueSetter) {
-        return _options.dataItemColumnValueSetter(item, columnDef, value);
-      }
-
-      // if a custom setter is not defined, we call applyValue of the editor to unserialize
-      if (columnDef.editor){
-        var editorArgs = {
-          'container':$("body"),  // a dummy container
-          'column':columnDef,
-          'position':{'top':0, 'left':0},  // a dummy position required by some editors
-          'grid':_grid
-        };
-        var editor = new columnDef.editor(editorArgs);
-        editor.loadValue(item);
-        editor.applyValue(item, value);
-        editor.destroy();
-      }
-    }
-    
-    
-    function _createTextBox(innerText){
-      var ta = document.createElement('textarea');
-      ta.style.position = 'absolute';
-      ta.style.left = '-1000px';
-      ta.style.top = document.body.scrollTop + 'px';
-      ta.value = innerText;
-      _bodyElement.appendChild(ta);
-      ta.select();
-      
-      return ta;
-    }
-    
-    function _decodeTabularData(_grid, ta){
-      var columns = _grid.getColumns();
-      var clipText = ta.value;
-      var clipRows = clipText.split(/[\n\f\r]/);
-      // trim trailing CR if present
-      if (clipRows[clipRows.length - 1]=="") { clipRows.pop(); }
-      
-      var clippedRange = [];
-      var j = 0;
-      
-      _bodyElement.removeChild(ta);
-      for (var i=0; i<clipRows.length; i++) {
-        if (clipRows[i]!="")
-          clippedRange[j++] = clipRows[i].split("\t");
-          else
-          clippedRange[i] = [""];
-      }
-      var selectedCell = _grid.getActiveCell();
-      var ranges = _grid.getSelectionModel().getSelectedRanges();
-      var selectedRange = ranges && ranges.length ? ranges[0] : null;   // pick only one selection
-      var activeRow = null;
-      var activeCell = null;
-      
-      if (selectedRange){
-        activeRow = selectedRange.fromRow;
-        activeCell = selectedRange.fromCell;
-      } else if (selectedCell){
-        activeRow = selectedCell.row;
-        activeCell = selectedCell.cell;
-      } else {
-        // we don't know where to paste
-        return;
-      }
-      
-      var oneCellToMultiple = false;
-      var destH = clippedRange.length;
-      var destW = clippedRange.length ? clippedRange[0].length : 0;
-      if (clippedRange.length == 1 && clippedRange[0].length == 1 && selectedRange){
-        oneCellToMultiple = true;
-        destH = selectedRange.toRow - selectedRange.fromRow +1;
-        destW = selectedRange.toCell - selectedRange.fromCell +1;
-      }
-      var availableRows = _grid.getData().length - activeRow;
-      var addRows = 0;
-      if(availableRows < destH)
-      {
-        var d = _grid.getData();
-        for(addRows = 1; addRows <= destH - availableRows; addRows++)
-          d.push({});
-        _grid.setData(d);
-        _grid.render();
-      }
-
-      var overflowsBottomOfGrid = activeRow + destH > _grid.getDataLength();
-
-      if (_options.newRowCreator && overflowsBottomOfGrid) {
-
-        var newRowsNeeded = activeRow + destH - _grid.getDataLength();
-
-        _options.newRowCreator(newRowsNeeded);
-
-      }
-
-      var clipCommand = {
-
-        isClipboardCommand: true,
-        clippedRange: clippedRange,
-        oldValues: [],
-        cellExternalCopyManager: _self,
-        _options: _options,
-        setDataItemValueForColumn: setDataItemValueForColumn,
-        markCopySelection: markCopySelection,
-        oneCellToMultiple: oneCellToMultiple,
-        activeRow: activeRow,
-        activeCell: activeCell,
-        destH: destH,
-        destW: destW,
-        maxDestY: _grid.getDataLength(),
-        maxDestX: _grid.getColumns().length,
-        h: 0,
-        w: 0,
-          
-        execute: function() {
-          this.h=0;
-          for (var y = 0; y < this.destH; y++){
-            this.oldValues[y] = [];
-            this.w=0;
-            this.h++;
-            for (var x = 0; x < this.destW; x++){
-              this.w++;
-              var desty = activeRow + y;
-              var destx = activeCell + x;
-              
-              if (desty < this.maxDestY && destx < this.maxDestX ) {
-                var nd = _grid.getCellNode(desty, destx);
-                var dt = _grid.getDataItem(desty);
-                this.oldValues[y][x] = dt[columns[destx]['field']];
-                if (oneCellToMultiple)
-                  this.setDataItemValueForColumn(dt, columns[destx], clippedRange[0][0]);
-                else
-                  this.setDataItemValueForColumn(dt, columns[destx], clippedRange[y] ? clippedRange[y][x] : '');
-                _grid.updateCell(desty, destx);
-                _grid.onCellChange.notify({
-                    row: desty,
-                    cell: destx,
-                    item: dt,
-                    grid: _grid
-                });
-
-              }
-            }
-          }
-          
-          var bRange = {
-            'fromCell': activeCell,
-            'fromRow': activeRow,
-            'toCell': activeCell+this.w-1,
-            'toRow': activeRow+this.h-1
-          }
-
-          this.markCopySelection([bRange]);
-          _grid.getSelectionModel().setSelectedRanges([bRange]);
-          this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});
-        },
-
-        undo: function() {
-          for (var y = 0; y < this.destH; y++){
-            for (var x = 0; x < this.destW; x++){
-              var desty = activeRow + y;
-              var destx = activeCell + x;
-              
-              if (desty < this.maxDestY && destx < this.maxDestX ) {
-                var nd = _grid.getCellNode(desty, destx);
-                var dt = _grid.getDataItem(desty);
-                if (oneCellToMultiple)
-                  this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[0][0]);
-                else
-                  this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[y][x]);
-                _grid.updateCell(desty, destx);
-                _grid.onCellChange.notify({
-                    row: desty,
-                    cell: destx,
-                    item: dt,
-                    grid: _grid
-                });
-              }
-            }
-          }
-          
-          var bRange = {
-            'fromCell': activeCell,
-            'fromRow': activeRow,
-            'toCell': activeCell+this.w-1,
-            'toRow': activeRow+this.h-1
-          }
-
-          this.markCopySelection([bRange]);
-          _grid.getSelectionModel().setSelectedRanges([bRange]);
-          this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});
-          
-          if(addRows > 1){            
-            var d = _grid.getData();
-            for(; addRows > 1; addRows--)
-              d.splice(d.length - 1, 1);
-            _grid.setData(d);
-            _grid.render();
-          }
-        }
-      };
-
-      if(_options.clipboardCommandHandler) {
-        _options.clipboardCommandHandler(clipCommand);
-      }
-      else {
-        clipCommand.execute();
-      }
-    }
-    
-    
-    function handleKeyDown(e, args) {
-      var ranges;
-      if (!_grid.getEditorLock().isActive() || _grid.getOptions().autoEdit) {
-        if (e.which == keyCodes.ESC) {
-          if (_copiedRanges) {
-            e.preventDefault();
-            clearCopySelection();
-            _self.onCopyCancelled.notify({ranges: _copiedRanges});
-            _copiedRanges = null;
-          }
-        }
-
-        if ((e.which === keyCodes.C || e.which === keyCodes.INSERT) && (e.ctrlKey || e.metaKey) && !e.shiftKey) {    // CTRL+C or CTRL+INS
-          if (_onCopyInit) {
-            _onCopyInit.call();
-          }
-          ranges = _grid.getSelectionModel().getSelectedRanges();
-          if (ranges.length != 0) {
-            _copiedRanges = ranges;
-            markCopySelection(ranges);
-            _self.onCopyCells.notify({ranges: ranges});
-            
-            var columns = _grid.getColumns();
-            var clipText = "";
-
-            for (var rg = 0; rg < ranges.length; rg++){
-                var range = ranges[rg];
-                var clipTextRows = [];
-                for (var i=range.fromRow; i< range.toRow+1 ; i++){
-                    var clipTextCells = [];
-                    var dt = _grid.getDataItem(i);
-                    
-                    if (clipTextRows == "" && _options.includeHeaderWhenCopying) {
-                        var clipTextHeaders = [];
-                        for (var j = range.fromCell; j < range.toCell + 1 ; j++) {
-                            if (columns[j].name.length > 0)
-                                clipTextHeaders.push(columns[j].name);
-                        }
-                        clipTextRows.push(clipTextHeaders.join("\t"));
-                    }
-
-                    for (var j=range.fromCell; j< range.toCell+1 ; j++){
-                        clipTextCells.push(getDataItemValueForColumn(dt, columns[j]));
-                    }
-                    clipTextRows.push(clipTextCells.join("\t"));
-                }
-                clipText += clipTextRows.join("\r\n") + "\r\n";
-            }
-            
-            if(window.clipboardData) {
-                window.clipboardData.setData("Text", clipText);
-                return true;
-            }
-            else {
-                var focusEl = document.activeElement;
-
-                var ta = _createTextBox(clipText);
-
-                ta.focus();
-                
-                setTimeout(function(){
-                     _bodyElement.removeChild(ta);
-                    // restore focus
-                    if (focusEl)
-                        focusEl.focus();
-                    else
-                        console.log("Not element to restore focus to after copy?");
-
-                }, 100);
-
-                if (_onCopySuccess) {
-                    var rowCount = 0;
-                    // If it's cell selection, use the toRow/fromRow fields
-                    if (ranges.length === 1) {
-                        rowCount = (ranges[0].toRow + 1) - ranges[0].fromRow;
-                    }
-                    else {
-                        rowCount = ranges.length;
-                    }
-                    _onCopySuccess.call(this, rowCount);
-                }
-
-                return false;
-            }
-          }
-        }
-
-        if (!_options.readOnlyMode && (
-         (e.which === keyCodes.V && (e.ctrlKey || e.metaKey) && !e.shiftKey)
-          || (e.which === keyCodes.INSERT && e.shiftKey && !e.ctrlKey)
-         )) {    // CTRL+V or Shift+INS
-            var ta = _createTextBox('');
-            
-            setTimeout(function(){
-                _decodeTabularData(_grid, ta);
-            }, 100);
-            
-            return false;
-        }
-      }
-    }
-
-    function markCopySelection(ranges) {
-      clearCopySelection();
-      
-      var columns = _grid.getColumns();
-      var hash = {};
-      for (var i = 0; i < ranges.length; i++) {
-        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
-          hash[j] = {};
-          for (var k = ranges[i].fromCell; k <= ranges[i].toCell && k<columns.length; k++) {
-            hash[j][columns[k].id] = _copiedCellStyle;
-          }
-        }
-      }
-      _grid.setCellCssStyles(_copiedCellStyleLayerKey, hash);
-      clearTimeout(_clearCopyTI);
-      _clearCopyTI = setTimeout(function(){
-        _self.clearCopySelection();
-      }, 2000);
-    }
-
-    function clearCopySelection() {
-      _grid.removeCellCssStyles(_copiedCellStyleLayerKey);
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-      "clearCopySelection": clearCopySelection,
-      "handleKeyDown":handleKeyDown,
-      
-      "onCopyCells": new Slick.Event(),
-      "onCopyCancelled": new Slick.Event(),
-      "onPasteCells": new Slick.Event()
-    });
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangedecorator.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangedecorator.js
deleted file mode 100644
index 0cbe71d4..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangedecorator.js
+++ /dev/null
@@ -1,66 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CellRangeDecorator": CellRangeDecorator
-    }
-  });
-
-  /***
-   * Displays an overlay on top of a given cell range.
-   *
-   * TODO:
-   * Currently, it blocks mouse events to DOM nodes behind it.
-   * Use FF and WebKit-specific "pointer-events" CSS style, or some kind of event forwarding.
-   * Could also construct the borders separately using 4 individual DIVs.
-   *
-   * @param {Grid} grid
-   * @param {Object} options
-   */
-  function CellRangeDecorator(grid, options) {
-    var _elem;
-    var _defaults = {
-      selectionCssClass: 'slick-range-decorator',
-      selectionCss: {
-        "zIndex": "9999",
-        "border": "2px dashed red"
-      }
-    };
-
-    options = $.extend(true, {}, _defaults, options);
-
-
-    function show(range) {
-      if (!_elem) {
-        _elem = $("<div></div>", {css: options.selectionCss})
-            .addClass(options.selectionCssClass)
-            .css("position", "absolute")
-            .appendTo(grid.getCanvasNode());
-      }
-
-      var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
-      var to = grid.getCellNodeBox(range.toRow, range.toCell);
-
-      _elem.css({
-        top: from.top - 1,
-        left: from.left - 1,
-        height: to.bottom - from.top - 2,
-        width: to.right - from.left - 2
-      });
-
-      return _elem;
-    }
-
-    function hide() {
-      if (_elem) {
-        _elem.remove();
-        _elem = null;
-      }
-    }
-
-    $.extend(this, {
-      "show": show,
-      "hide": hide
-    });
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangeselector.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangeselector.js
deleted file mode 100644
index 8d97d6bf..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangeselector.js
+++ /dev/null
@@ -1,120 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CellRangeSelector": CellRangeSelector
-    }
-  });
-
-
-  function CellRangeSelector(options) {
-    var _grid;
-    var _canvas;
-    var _currentlySelectedRange;
-    var _dragging;
-    var _decorator;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _defaults = {
-      selectionCss: {
-        "border": "2px dashed blue"
-      }
-    };
-
-
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _decorator = new Slick.CellRangeDecorator(grid, options);
-      _grid = grid;
-      _canvas = _grid.getCanvasNode();
-      _handler
-        .subscribe(_grid.onDragInit, handleDragInit)
-        .subscribe(_grid.onDragStart, handleDragStart)
-        .subscribe(_grid.onDrag, handleDrag)
-        .subscribe(_grid.onDragEnd, handleDragEnd);
-    }
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-    function handleDragInit(e, dd) {
-      // prevent the grid from cancelling drag'n'drop by default
-      e.stopImmediatePropagation();
-    }
-
-    function handleDragStart(e, dd) {
-      var cell = _grid.getCellFromEvent(e);
-      if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
-        if (_grid.canCellBeSelected(cell.row, cell.cell)) {
-          _dragging = true;
-          e.stopImmediatePropagation();
-        }
-      }
-      if (!_dragging) {
-        return;
-      }
-
-      _grid.focus();
-
-      var start = _grid.getCellFromPoint(
-          dd.startX - $(_canvas).offset().left,
-          dd.startY - $(_canvas).offset().top);
-
-      dd.range = {start: start, end: {}};
-      _currentlySelectedRange = dd.range;
-      return _decorator.show(new Slick.Range(start.row, start.cell));
-    }
-
-    function handleDrag(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-      e.stopImmediatePropagation();
-
-      var end = _grid.getCellFromPoint(
-          e.pageX - $(_canvas).offset().left,
-          e.pageY - $(_canvas).offset().top);
-
-      if (!_grid.canCellBeSelected(end.row, end.cell)) {
-        return;
-      }
-
-      dd.range.end = end;
-      _currentlySelectedRange = dd.range;
-      _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
-    }
-
-    function handleDragEnd(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-
-      _dragging = false;
-      e.stopImmediatePropagation();
-
-      _decorator.hide();
-      _self.onCellRangeSelected.notify({
-        range: new Slick.Range(
-            dd.range.start.row,
-            dd.range.start.cell,
-            dd.range.end.row,
-            dd.range.end.cell
-        )
-      });
-    }
-
-    function getCurrentRange() {
-      return _currentlySelectedRange;
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-      "getCurrentRange": getCurrentRange,
-
-      "onBeforeCellRangeSelected": new Slick.Event(),
-      "onCellRangeSelected": new Slick.Event()
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellselectionmodel.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellselectionmodel.js
deleted file mode 100644
index 47cb0cf6..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellselectionmodel.js
+++ /dev/null
@@ -1,159 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CellSelectionModel": CellSelectionModel
-    }
-  });
-
-
-  function CellSelectionModel(options) {
-    var _grid;
-    var _canvas;
-    var _ranges = [];
-    var _self = this;
-    var _selector = new Slick.CellRangeSelector({
-      "selectionCss": {
-        "border": "2px solid black"
-      }
-    });
-    var _options;
-    var _defaults = {
-      selectActiveCell: true
-    };
-
-
-    function init(grid) {
-      _options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      _canvas = _grid.getCanvasNode();
-      _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
-      _grid.onKeyDown.subscribe(handleKeyDown);
-      grid.registerPlugin(_selector);
-      _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
-      _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
-    }
-
-    function destroy() {
-      _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
-      _grid.onKeyDown.unsubscribe(handleKeyDown);
-      _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
-      _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
-      _grid.unregisterPlugin(_selector);
-    }
-
-    function removeInvalidRanges(ranges) {
-      var result = [];
-
-      for (var i = 0; i < ranges.length; i++) {
-        var r = ranges[i];
-        if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
-          result.push(r);
-        }
-      }
-
-      return result;
-    }
-
-    function setSelectedRanges(ranges) {
-      // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged
-      if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }
-
-      _ranges = removeInvalidRanges(ranges);
-      _self.onSelectedRangesChanged.notify(_ranges);
-    }
-
-    function getSelectedRanges() {
-      return _ranges;
-    }
-
-    function handleBeforeCellRangeSelected(e, args) {
-      if (_grid.getEditorLock().isActive()) {
-        e.stopPropagation();
-        return false;
-      }
-    }
-
-    function handleCellRangeSelected(e, args) {
-      _grid.setActiveCell(args.range.fromRow, args.range.fromCell, false, false, true);
-      setSelectedRanges([args.range]);
-    }
-
-    function handleActiveCellChange(e, args) {
-      if (_options.selectActiveCell && args.row != null && args.cell != null) {
-        setSelectedRanges([new Slick.Range(args.row, args.cell)]);
-      }
-    }
-    
-    function handleKeyDown(e) {
-      /***
-       * Кey codes
-       * 37 left
-       * 38 up
-       * 39 right
-       * 40 down                     
-       */                                         
-      var ranges, last;
-      var active = _grid.getActiveCell();
-      var metaKey = e.ctrlKey || e.metaKey;
-
-      if ( active && e.shiftKey && !metaKey && !e.altKey &&
-          (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
-      
-        ranges = getSelectedRanges();
-        if (!ranges.length)
-         ranges.push(new Slick.Range(active.row, active.cell));
-         
-        // keyboard can work with last range only          
-        last = ranges.pop();
-        
-        // can't handle selection out of active cell
-        if (!last.contains(active.row, active.cell))
-          last = new Slick.Range(active.row, active.cell);
-        
-        var dRow = last.toRow - last.fromRow,
-            dCell = last.toCell - last.fromCell,
-            // walking direction
-            dirRow = active.row == last.fromRow ? 1 : -1,
-            dirCell = active.cell == last.fromCell ? 1 : -1;
-                 
-        if (e.which == 37) {
-          dCell -= dirCell; 
-        } else if (e.which == 39) {
-          dCell += dirCell ; 
-        } else if (e.which == 38) {
-          dRow -= dirRow; 
-        } else if (e.which == 40) {
-          dRow += dirRow; 
-        }
-        
-        // define new selection range 
-        var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
-        if (removeInvalidRanges([new_last]).length) {
-          ranges.push(new_last);
-          var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;
-          var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;
-         _grid.scrollRowIntoView(viewRow);
-         _grid.scrollCellIntoView(viewRow, viewCell);
-        }
-        else 
-          ranges.push(last);
-
-        setSelectedRanges(ranges);  
-       
-        e.preventDefault();
-        e.stopPropagation();        
-      }           
-    }
-
-    $.extend(this, {
-      "getSelectedRanges": getSelectedRanges,
-      "setSelectedRanges": setSelectedRanges,
-
-      "init": init,
-      "destroy": destroy,
-
-      "onSelectedRangesChanged": new Slick.Event()
-    });
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.checkboxselectcolumn.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.checkboxselectcolumn.js
deleted file mode 100644
index 83d8d500..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.checkboxselectcolumn.js
+++ /dev/null
@@ -1,153 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "CheckboxSelectColumn": CheckboxSelectColumn
-    }
-  });
-
-
-  function CheckboxSelectColumn(options) {
-    var _grid;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _selectedRowsLookup = {};
-    var _defaults = {
-      columnId: "_checkbox_selector",
-      cssClass: null,
-      toolTip: "Select/Deselect All",
-      width: 30
-    };
-
-    var _options = $.extend(true, {}, _defaults, options);
-
-    function init(grid) {
-      _grid = grid;
-      _handler
-        .subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
-        .subscribe(_grid.onClick, handleClick)
-        .subscribe(_grid.onHeaderClick, handleHeaderClick)
-        .subscribe(_grid.onKeyDown, handleKeyDown);
-    }
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-    function handleSelectedRowsChanged(e, args) {
-      var selectedRows = _grid.getSelectedRows();
-      var lookup = {}, row, i;
-      for (i = 0; i < selectedRows.length; i++) {
-        row = selectedRows[i];
-        lookup[row] = true;
-        if (lookup[row] !== _selectedRowsLookup[row]) {
-          _grid.invalidateRow(row);
-          delete _selectedRowsLookup[row];
-        }
-      }
-      for (i in _selectedRowsLookup) {
-        _grid.invalidateRow(i);
-      }
-      _selectedRowsLookup = lookup;
-      _grid.render();
-
-      if (selectedRows.length && selectedRows.length == _grid.getDataLength()) {
-        _grid.updateColumnHeader(_options.columnId, "<input type='checkbox' checked='checked'>", _options.toolTip);
-      } else {
-        _grid.updateColumnHeader(_options.columnId, "<input type='checkbox'>", _options.toolTip);
-      }
-    }
-
-    function handleKeyDown(e, args) {
-      if (e.which == 32) {
-        if (_grid.getColumns()[args.cell].id === _options.columnId) {
-          // if editing, try to commit
-          if (!_grid.getEditorLock().isActive() || _grid.getEditorLock().commitCurrentEdit()) {
-            toggleRowSelection(args.row);
-          }
-          e.preventDefault();
-          e.stopImmediatePropagation();
-        }
-      }
-    }
-
-    function handleClick(e, args) {
-      // clicking on a row select checkbox
-      if (_grid.getColumns()[args.cell].id === _options.columnId && $(e.target).is(":checkbox")) {
-        // if editing, try to commit
-        if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
-          e.preventDefault();
-          e.stopImmediatePropagation();
-          return;
-        }
-
-        toggleRowSelection(args.row);
-        e.stopPropagation();
-        e.stopImmediatePropagation();
-      }
-    }
-
-    function toggleRowSelection(row) {
-      if (_selectedRowsLookup[row]) {
-        _grid.setSelectedRows($.grep(_grid.getSelectedRows(), function (n) {
-          return n != row
-        }));
-      } else {
-        _grid.setSelectedRows(_grid.getSelectedRows().concat(row));
-      }
-    }
-
-    function handleHeaderClick(e, args) {
-      if (args.column.id == _options.columnId && $(e.target).is(":checkbox")) {
-        // if editing, try to commit
-        if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
-          e.preventDefault();
-          e.stopImmediatePropagation();
-          return;
-        }
-
-        if ($(e.target).is(":checked")) {
-          var rows = [];
-          for (var i = 0; i < _grid.getDataLength(); i++) {
-            rows.push(i);
-          }
-          _grid.setSelectedRows(rows);
-        } else {
-          _grid.setSelectedRows([]);
-        }
-        e.stopPropagation();
-        e.stopImmediatePropagation();
-      }
-    }
-
-    function getColumnDefinition() {
-      return {
-        id: _options.columnId,
-        name: "<input type='checkbox'>",
-        toolTip: _options.toolTip,
-        field: "sel",
-        width: _options.width,
-        resizable: false,
-        sortable: false,
-        cssClass: _options.cssClass,
-        formatter: checkboxSelectionFormatter
-      };
-    }
-
-    function checkboxSelectionFormatter(row, cell, value, columnDef, dataContext) {
-      if (dataContext) {
-        return _selectedRowsLookup[row]
-            ? "<input type='checkbox' checked='checked'>"
-            : "<input type='checkbox'>";
-      }
-      return null;
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-
-      "getColumnDefinition": getColumnDefinition
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.css b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.css
deleted file mode 100644
index 0ba79ea0..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.css
+++ /dev/null
@@ -1,39 +0,0 @@
-.slick-column-name,
-.slick-sort-indicator {
-  /**
-   * This makes all "float:right" elements after it that spill over to the next line
-   * display way below the lower boundary of the column thus hiding them.
-   */
-  display: inline-block;
-  float: left;
-  margin-bottom: 100px;
-}
-
-.slick-header-button {
-  display: inline-block;
-  float: right;
-  vertical-align: top;
-  margin: 1px;
-  /**
-  * This makes all "float:right" elements after it that spill over to the next line
-  * display way below the lower boundary of the column thus hiding them.
-  */
-  margin-bottom: 100px;
-  height: 15px;
-  width: 15px;
-  background-repeat: no-repeat;
-  background-position: center center;
-  cursor: pointer;
-}
-
-.slick-header-button-hidden {
-  width: 0;
-
-  -webkit-transition: 0.2s width;
-  -ms-transition: 0.2s width;
-  transition: 0.2s width;
-}
-
-.slick-header-column:hover > .slick-header-button {
-  width: 15px;
-}
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.js
deleted file mode 100644
index d7c06195..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.js
+++ /dev/null
@@ -1,177 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "Plugins": {
-        "HeaderButtons": HeaderButtons
-      }
-    }
-  });
-
-
-  /***
-   * A plugin to add custom buttons to column headers.
-   *
-   * USAGE:
-   *
-   * Add the plugin .js & .css files and register it with the grid.
-   *
-   * To specify a custom button in a column header, extend the column definition like so:
-   *
-   *   var columns = [
-   *     {
-   *       id: 'myColumn',
-   *       name: 'My column',
-   *
-   *       // This is the relevant part
-   *       header: {
-   *          buttons: [
-   *              {
-   *                // button options
-   *              },
-   *              {
-   *                // button options
-   *              }
-   *          ]
-   *       }
-   *     }
-   *   ];
-   *
-   * Available button options:
-   *    cssClass:     CSS class to add to the button.
-   *    image:        Relative button image path.
-   *    tooltip:      Button tooltip.
-   *    showOnHover:  Only show the button on hover.
-   *    handler:      Button click handler.
-   *    command:      A command identifier to be passed to the onCommand event handlers.
-   *
-   * The plugin exposes the following events:
-   *    onCommand:    Fired on button click for buttons with 'command' specified.
-   *        Event args:
-   *            grid:     Reference to the grid.
-   *            column:   Column definition.
-   *            command:  Button command identified.
-   *            button:   Button options.  Note that you can change the button options in your
-   *                      event handler, and the column header will be automatically updated to
-   *                      reflect them.  This is useful if you want to implement something like a
-   *                      toggle button.
-   *
-   *
-   * @param options {Object} Options:
-   *    buttonCssClass:   a CSS class to use for buttons (default 'slick-header-button')
-   * @class Slick.Plugins.HeaderButtons
-   * @constructor
-   */
-  function HeaderButtons(options) {
-    var _grid;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _defaults = {
-      buttonCssClass: "slick-header-button"
-    };
-
-
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      _handler
-        .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
-        .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
-
-      // Force the grid to re-render the header now that the events are hooked up.
-      _grid.setColumns(_grid.getColumns());
-    }
-
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-
-    function handleHeaderCellRendered(e, args) {
-      var column = args.column;
-
-      if (column.header && column.header.buttons) {
-        // Append buttons in reverse order since they are floated to the right.
-        var i = column.header.buttons.length;
-        while (i--) {
-          var button = column.header.buttons[i];
-          var btn = $("<div></div>")
-            .addClass(options.buttonCssClass)
-            .data("column", column)
-            .data("button", button);
-
-          if (button.showOnHover) {
-            btn.addClass("slick-header-button-hidden");
-          }
-
-          if (button.image) {
-            btn.css("backgroundImage", "url(" + button.image + ")");
-          }
-
-          if (button.cssClass) {
-            btn.addClass(button.cssClass);
-          }
-
-          if (button.tooltip) {
-            btn.attr("title", button.tooltip);
-          }
-
-          if (button.command) {
-            btn.data("command", button.command);
-          }
-
-          if (button.handler) {
-            btn.on("click", button.handler);
-          }
-
-          btn
-            .on("click", handleButtonClick)
-            .appendTo(args.node);
-        }
-      }
-    }
-
-
-    function handleBeforeHeaderCellDestroy(e, args) {
-      var column = args.column;
-
-      if (column.header && column.header.buttons) {
-        // Removing buttons via jQuery will also clean up any event handlers and data.
-        // NOTE: If you attach event handlers directly or using a different framework,
-        //       you must also clean them up here to avoid memory leaks.
-        $(args.node).find("." + options.buttonCssClass).remove();
-      }
-    }
-
-
-    function handleButtonClick(e) {
-      var command = $(this).data("command");
-      var columnDef = $(this).data("column");
-      var button = $(this).data("button");
-
-      if (command != null) {
-        _self.onCommand.notify({
-            "grid": _grid,
-            "column": columnDef,
-            "command": command,
-            "button": button
-          }, e, _self);
-
-        // Update the header in case the user updated the button definition in the handler.
-        _grid.updateColumnHeader(columnDef.id);
-      }
-
-      // Stop propagation so that it doesn't register as a header click event.
-      e.preventDefault();
-      e.stopPropagation();
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-
-      "onCommand": new Slick.Event()
-    });
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.css b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.css
deleted file mode 100644
index 8b0b6a9f..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.css
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Menu button */
-.slick-header-menubutton {
-  position: absolute;
-  right: 0;
-  top: 0;
-  bottom: 0;
-  width: 14px;
-  background-repeat: no-repeat;
-  background-position: left center;
-  background-image: url(../images/down.gif);
-  cursor: pointer;
-
-  display: none;
-  border-left: thin ridge silver;
-}
-
-.slick-header-column:hover > .slick-header-menubutton,
-.slick-header-column-active .slick-header-menubutton {
-  display: inline-block;
-}
-
-/* Menu */
-.slick-header-menu {
-  position: absolute;
-  display: inline-block;
-  margin: 0;
-  padding: 2px;
-  cursor: default;
-}
-
-
-/* Menu items */
-.slick-header-menuitem {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  cursor: pointer;
-}
-
-.slick-header-menuicon {
-  display: inline-block;
-  width: 16px;
-  height: 16px;
-  vertical-align: middle;
-  margin-right: 4px;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-
-.slick-header-menucontent {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-
-/* Disabled */
-.slick-header-menuitem-disabled {
-  color: silver;
-}
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.js
deleted file mode 100644
index c4032301..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.js
+++ /dev/null
@@ -1,275 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "Plugins": {
-        "HeaderMenu": HeaderMenu
-      }
-    }
-  });
-
-
-  /***
-   * A plugin to add drop-down menus to column headers.
-   *
-   * USAGE:
-   *
-   * Add the plugin .js & .css files and register it with the grid.
-   *
-   * To specify a menu in a column header, extend the column definition like so:
-   *
-   *   var columns = [
-   *     {
-   *       id: 'myColumn',
-   *       name: 'My column',
-   *
-   *       // This is the relevant part
-   *       header: {
-   *          menu: {
-   *              items: [
-   *                {
-   *                  // menu item options
-   *                },
-   *                {
-   *                  // menu item options
-   *                }
-   *              ]
-   *          }
-   *       }
-   *     }
-   *   ];
-   *
-   *
-   * Available menu options:
-   *    tooltip:      Menu button tooltip.
-   *
-   *
-   * Available menu item options:
-   *    title:        Menu item text.
-   *    disabled:     Whether the item is disabled.
-   *    tooltip:      Item tooltip.
-   *    command:      A command identifier to be passed to the onCommand event handlers.
-   *    iconCssClass: A CSS class to be added to the menu item icon.
-   *    iconImage:    A url to the icon image.
-   *
-   *
-   * The plugin exposes the following events:
-   *    onBeforeMenuShow:   Fired before the menu is shown.  You can customize the menu or dismiss it by returning false.
-   *        Event args:
-   *            grid:     Reference to the grid.
-   *            column:   Column definition.
-   *            menu:     Menu options.  Note that you can change the menu items here.
-   *
-   *    onCommand:    Fired on menu item click for buttons with 'command' specified.
-   *        Event args:
-   *            grid:     Reference to the grid.
-   *            column:   Column definition.
-   *            command:  Button command identified.
-   *            button:   Button options.  Note that you can change the button options in your
-   *                      event handler, and the column header will be automatically updated to
-   *                      reflect them.  This is useful if you want to implement something like a
-   *                      toggle button.
-   *
-   *
-   * @param options {Object} Options:
-   *    buttonCssClass:   an extra CSS class to add to the menu button
-   *    buttonImage:      a url to the menu button image (default '../images/down.gif')
-   * @class Slick.Plugins.HeaderButtons
-   * @constructor
-   */
-  function HeaderMenu(options) {
-    var _grid;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _defaults = {
-      buttonCssClass: null,
-      buttonImage: null
-    };
-    var $menu;
-    var $activeHeaderColumn;
-
-
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      _handler
-        .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
-        .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);
-
-      // Force the grid to re-render the header now that the events are hooked up.
-      _grid.setColumns(_grid.getColumns());
-
-      // Hide the menu on outside click.
-      $(document.body).on("mousedown", handleBodyMouseDown);
-    }
-
-
-    function destroy() {
-      _handler.unsubscribeAll();
-      $(document.body).off("mousedown", handleBodyMouseDown);
-    }
-
-
-    function handleBodyMouseDown(e) {
-      if ($menu && $menu[0] != e.target && !$.contains($menu[0], e.target)) {
-        hideMenu();
-      }
-    }
-
-
-    function hideMenu() {
-      if ($menu) {
-        $menu.remove();
-        $menu = null;
-        $activeHeaderColumn
-          .removeClass("slick-header-column-active");
-      }
-    }
-
-    function handleHeaderCellRendered(e, args) {
-      var column = args.column;
-      var menu = column.header && column.header.menu;
-
-      if (menu) {
-        var $el = $("<div></div>")
-          .addClass("slick-header-menubutton")
-          .data("column", column)
-          .data("menu", menu);
-
-        if (options.buttonCssClass) {
-          $el.addClass(options.buttonCssClass);
-        }
-
-        if (options.buttonImage) {
-          $el.css("background-image", "url(" + options.buttonImage + ")");
-        }
-
-        if (menu.tooltip) {
-          $el.attr("title", menu.tooltip);
-        }
-
-        $el
-          .on("click", showMenu)
-          .appendTo(args.node);
-      }
-    }
-
-
-    function handleBeforeHeaderCellDestroy(e, args) {
-      var column = args.column;
-
-      if (column.header && column.header.menu) {
-        $(args.node).find(".slick-header-menubutton").remove();
-      }
-    }
-
-
-    function showMenu(e) {
-      var $menuButton = $(this);
-      var menu = $menuButton.data("menu");
-      var columnDef = $menuButton.data("column");
-
-      // Let the user modify the menu or cancel altogether,
-      // or provide alternative menu implementation.
-      if (_self.onBeforeMenuShow.notify({
-          "grid": _grid,
-          "column": columnDef,
-          "menu": menu
-        }, e, _self) == false) {
-        return;
-      }
-
-
-      if (!$menu) {
-        $menu = $("<div class='slick-header-menu'></div>")
-          .appendTo(_grid.getContainerNode());
-      }
-      $menu.empty();
-
-
-      // Construct the menu items.
-      for (var i = 0; i < menu.items.length; i++) {
-        var item = menu.items[i];
-
-        var $li = $("<div class='slick-header-menuitem'></div>")
-          .data("command", item.command || '')
-          .data("column", columnDef)
-          .data("item", item)
-          .on("click", handleMenuItemClick)
-          .appendTo($menu);
-
-        if (item.disabled) {
-          $li.addClass("slick-header-menuitem-disabled");
-        }
-
-        if (item.tooltip) {
-          $li.attr("title", item.tooltip);
-        }
-
-        var $icon = $("<div class='slick-header-menuicon'></div>")
-          .appendTo($li);
-
-        if (item.iconCssClass) {
-          $icon.addClass(item.iconCssClass);
-        }
-
-        if (item.iconImage) {
-          $icon.css("background-image", "url(" + item.iconImage + ")");
-        }
-
-        $("<span class='slick-header-menucontent'></span>")
-          .text(item.title)
-          .appendTo($li);
-      }
-
-
-      // Position the menu.
-      $menu
-        .offset({ top: $(this).offset().top + $(this).height(), left: $(this).offset().left });
-
-
-      // Mark the header as active to keep the highlighting.
-      $activeHeaderColumn = $menuButton.closest(".slick-header-column");
-      $activeHeaderColumn
-        .addClass("slick-header-column-active");
-
-      // Stop propagation so that it doesn't register as a header click event.
-      e.preventDefault();
-      e.stopPropagation();
-    }
-
-
-    function handleMenuItemClick(e) {
-      var command = $(this).data("command");
-      var columnDef = $(this).data("column");
-      var item = $(this).data("item");
-
-      if (item.disabled) {
-        return;
-      }
-
-      hideMenu();
-
-      if (command != null && command != '') {
-        _self.onCommand.notify({
-            "grid": _grid,
-            "column": columnDef,
-            "command": command,
-            "item": item
-          }, e, _self);
-      }
-
-      // Stop propagation so that it doesn't register as a header click event.
-      e.preventDefault();
-      e.stopPropagation();
-    }
-
-    $.extend(this, {
-      "init": init,
-      "destroy": destroy,
-
-      "onBeforeMenuShow": new Slick.Event(),
-      "onCommand": new Slick.Event()
-    });
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowmovemanager.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowmovemanager.js
deleted file mode 100644
index 5f87a1ed..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowmovemanager.js
+++ /dev/null
@@ -1,138 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "RowMoveManager": RowMoveManager
-    }
-  });
-
-  function RowMoveManager(options) {
-    var _grid;
-    var _canvas;
-    var _dragging;
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _defaults = {
-      cancelEditOnDrag: false
-    };
-
-    function init(grid) {
-      options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      _canvas = _grid.getCanvasNode();
-      _handler
-        .subscribe(_grid.onDragInit, handleDragInit)
-        .subscribe(_grid.onDragStart, handleDragStart)
-        .subscribe(_grid.onDrag, handleDrag)
-        .subscribe(_grid.onDragEnd, handleDragEnd);
-    }
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-    function handleDragInit(e, dd) {
-      // prevent the grid from cancelling drag'n'drop by default
-      e.stopImmediatePropagation();
-    }
-
-    function handleDragStart(e, dd) {
-      var cell = _grid.getCellFromEvent(e);
-
-      if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
-        _grid.getEditorLock().cancelCurrentEdit();
-      }
-
-      if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) {
-        return false;
-      }
-
-      _dragging = true;
-      e.stopImmediatePropagation();
-
-      var selectedRows = _grid.getSelectedRows();
-
-      if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) {
-        selectedRows = [cell.row];
-        _grid.setSelectedRows(selectedRows);
-      }
-
-      var rowHeight = _grid.getOptions().rowHeight;
-
-      dd.selectedRows = selectedRows;
-
-      dd.selectionProxy = $("<div class='slick-reorder-proxy'/>")
-          .css("position", "absolute")
-          .css("zIndex", "99999")
-          .css("width", $(_canvas).innerWidth())
-          .css("height", rowHeight * selectedRows.length)
-          .appendTo(_canvas);
-
-      dd.guide = $("<div class='slick-reorder-guide'/>")
-          .css("position", "absolute")
-          .css("zIndex", "99998")
-          .css("width", $(_canvas).innerWidth())
-          .css("top", -1000)
-          .appendTo(_canvas);
-
-      dd.insertBefore = -1;
-    }
-
-    function handleDrag(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-
-      e.stopImmediatePropagation();
-
-      var top = e.pageY - $(_canvas).offset().top;
-      dd.selectionProxy.css("top", top - 5);
-
-      var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
-      if (insertBefore !== dd.insertBefore) {
-        var eventData = {
-          "rows": dd.selectedRows,
-          "insertBefore": insertBefore
-        };
-
-        if (_self.onBeforeMoveRows.notify(eventData) === false) {
-          dd.guide.css("top", -1000);
-          dd.canMove = false;
-        } else {
-          dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
-          dd.canMove = true;
-        }
-
-        dd.insertBefore = insertBefore;
-      }
-    }
-
-    function handleDragEnd(e, dd) {
-      if (!_dragging) {
-        return;
-      }
-      _dragging = false;
-      e.stopImmediatePropagation();
-
-      dd.guide.remove();
-      dd.selectionProxy.remove();
-
-      if (dd.canMove) {
-        var eventData = {
-          "rows": dd.selectedRows,
-          "insertBefore": dd.insertBefore
-        };
-        // TODO:  _grid.remapCellCssClasses ?
-        _self.onMoveRows.notify(eventData);
-      }
-    }
-
-    $.extend(this, {
-      "onBeforeMoveRows": new Slick.Event(),
-      "onMoveRows": new Slick.Event(),
-
-      "init": init,
-      "destroy": destroy
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel.js
deleted file mode 100644
index 95c12ab5..00000000
--- a/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel.js
+++ /dev/null
@@ -1,189 +0,0 @@
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "RowSelectionModel": RowSelectionModel
-    }
-  });
-
-  function RowSelectionModel(options) {
-    var _grid;
-    var _ranges = [];
-    var _self = this;
-    var _handler = new Slick.EventHandler();
-    var _inHandler;
-    var _options;
-    var _defaults = {
-      selectActiveRow: true
-    };
-
-    function init(grid) {
-      _options = $.extend(true, {}, _defaults, options);
-      _grid = grid;
-      _handler.subscribe(_grid.onActiveCellChanged,
-          wrapHandler(handleActiveCellChange));
-      _handler.subscribe(_grid.onKeyDown,
-          wrapHandler(handleKeyDown));
-      _handler.subscribe(_grid.onClick,
-          wrapHandler(handleClick));
-    }
-
-    function destroy() {
-      _handler.unsubscribeAll();
-    }
-
-    function wrapHandler(handler) {
-      return function () {
-        if (!_inHandler) {
-          _inHandler = true;
-          handler.apply(this, arguments);
-          _inHandler = false;
-        }
-      };
-    }
-
-    function rangesToRows(ranges) {
-      var rows = [];
-      for (var i = 0; i < ranges.length; i++) {
-        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
-          rows.push(j);
-        }
-      }
-      return rows;
-    }
-
-    function rowsToRanges(rows) {
-      var ranges = [];
-      var lastCell = _grid.getColumns().length - 1;
-      for (var i = 0; i < rows.length; i++) {
-        ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
-      }
-      return ranges;
-    }
-
-    function getRowsRange(from, to) {
-      var i, rows = [];
-      for (i = from; i <= to; i++) {
-        rows.push(i);
-      }
-      for (i = to; i < from; i++) {
-        rows.push(i);
-      }
-      return rows;
-    }
-
-    function getSelectedRows() {
-      return rangesToRows(_ranges);
-    }
-
-    function setSelectedRows(rows) {
-      setSelectedRanges(rowsToRanges(rows));
-    }
-
-    function setSelectedRanges(ranges) {
-      // simple check for: empty selection didn't change, prevent firing onSelectedRangesChanged
-      if ((!_ranges || _ranges.length === 0) && (!ranges || ranges.length === 0)) { return; }
-      _ranges = ranges;
-      _self.onSelectedRangesChanged.notify(_ranges);
-    }
-
-    function getSelectedRanges() {
-      return _ranges;
-    }
-
-    function handleActiveCellChange(e, data) {
-      if (_options.selectActiveRow && data.row != null) {
-        setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
-      }
-    }
-
-    function handleKeyDown(e) {
-      var activeRow = _grid.getActiveCell();
-      if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
-        var selectedRows = getSelectedRows();
-        selectedRows.sort(function (x, y) {
-          return x - y
-        });
-
-        if (!selectedRows.length) {
-          selectedRows = [activeRow.row];
-        }
-
-        var top = selectedRows[0];
-        var bottom = selectedRows[selectedRows.length - 1];
-        var active;
-
-        if (e.which == 40) {
-          active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
-        } else {
-          active = activeRow.row < bottom ? --bottom : --top;
-        }
-
-        if (active >= 0 && active < _grid.getDataLength()) {
-          _grid.scrollRowIntoView(active);
-          var tempRanges = rowsToRanges(getRowsRange(top, bottom));
-          setSelectedRanges(tempRanges);
-        }
-
-        e.preventDefault();
-        e.stopPropagation();
-      }
-    }
-
-    function handleClick(e) {
-      var cell = _grid.getCellFromEvent(e);
-      if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
-        return false;
-      }
-
-      if (!_grid.getOptions().multiSelect || (
-          !e.ctrlKey && !e.shiftKey && !e.metaKey)) {
-        return false;
-      }
-
-      var selection = rangesToRows(_ranges);
-      var idx = $.inArray(cell.row, selection);
-
-      if (idx === -1 && (e.ctrlKey || e.metaKey)) {
-        selection.push(cell.row);
-        _grid.setActiveCell(cell.row, cell.cell);
-      } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
-        selection = $.grep(selection, function (o, i) {
-          return (o !== cell.row);
-        });
-        _grid.setActiveCell(cell.row, cell.cell);
-      } else if (selection.length && e.shiftKey) {
-        var last = selection.pop();
-        var from = Math.min(cell.row, last);
-        var to = Math.max(cell.row, last);
-        selection = [];
-        for (var i = from; i <= to; i++) {
-          if (i !== last) {
-            selection.push(i);
-          }
-        }
-        selection.push(last);
-        _grid.setActiveCell(cell.row, cell.cell);
-      }
-
-      var tempRanges = rowsToRanges(selection);
-      setSelectedRanges(tempRanges);
-      e.stopImmediatePropagation();
-
-      return true;
-    }
-
-    $.extend(this, {
-      "getSelectedRows": getSelectedRows,
-      "setSelectedRows": setSelectedRows,
-
-      "getSelectedRanges": getSelectedRanges,
-      "setSelectedRanges": setSelectedRanges,
-
-      "init": init,
-      "destroy": destroy,
-
-      "onSelectedRangesChanged": new Slick.Event()
-    });
-  }
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/slick-default-theme.css b/web/pgadmin/static/vendor/slickgrid/slick-default-theme.css
deleted file mode 100644
index efc74154..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick-default-theme.css
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-IMPORTANT:
-In order to preserve the uniform grid appearance, all cell styles need to have padding, margin and border sizes.
-No built-in (selected, editable, highlight, flashing, invalid, loading, :focus) or user-specified CSS
-classes should alter those!
-*/
-
-.slick-header-columns {
-  background: url('images/header-columns-bg.gif') repeat-x center bottom;
-  border-bottom: 1px solid silver;
-}
-
-.slick-header-column {
-  background: url('images/header-columns-bg.gif') repeat-x center bottom;
-  border-right: 1px solid silver;
-}
-
-.slick-header-column:hover, .slick-header-column-active {
-  background: white url('images/header-columns-over-bg.gif') repeat-x center bottom;
-}
-
-.slick-headerrow {
-  background: #fafafa;
-}
-
-.slick-headerrow-column {
-  background: #fafafa;
-  border-bottom: 0;
-  height: 100%;
-}
-
-.slick-row.ui-state-active {
-  background: #F5F7D7;
-}
-
-.slick-row {
-  position: absolute;
-  background: white;
-  border: 0px;
-  line-height: 20px;
-}
-
-.slick-row.selected {
-  z-index: 10;
-  background: #DFE8F6;
-}
-
-.slick-cell {
-  padding-left: 4px;
-  padding-right: 4px;
-}
-
-.slick-group {
-  border-bottom: 2px solid silver;
-}
-
-.slick-group-toggle {
-  width: 9px;
-  height: 9px;
-  margin-right: 5px;
-}
-
-.slick-group-toggle.expanded {
-  background: url(images/collapse.gif) no-repeat center center;
-}
-
-.slick-group-toggle.collapsed {
-  background: url(images/expand.gif) no-repeat center center;
-}
-
-.slick-group-totals {
-  color: gray;
-  background: white;
-}
-
-.slick-cell.selected {
-  background-color: beige;
-}
-
-.slick-cell.active {
-  border-color: gray;
-  border-style: solid;
-}
-
-.slick-sortable-placeholder {
-  background: silver !important;
-}
-
-.slick-row.odd {
-  background: #fafafa;
-}
-
-.slick-row.ui-state-active {
-  background: #F5F7D7;
-}
-
-.slick-row.loading {
-  opacity: 0.5;
-  filter: alpha(opacity = 50);
-}
-
-.slick-cell.invalid {
-  border-color: red;
-  -moz-animation-duration: 0.2s;
-  -webkit-animation-duration: 0.2s;
-  -moz-animation-name: slickgrid-invalid-hilite;
-  -webkit-animation-name: slickgrid-invalid-hilite;  
-}
-
-@-moz-keyframes slickgrid-invalid-hilite {
-  from { box-shadow: 0 0 6px red; }
-  to { box-shadow: none; }
-}
-
-@-webkit-keyframes slickgrid-invalid-hilite {
-  from { box-shadow: 0 0 6px red; }
-  to { box-shadow: none; }
-}
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.core.js b/web/pgadmin/static/vendor/slickgrid/slick.core.js
deleted file mode 100644
index 1846a50a..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.core.js
+++ /dev/null
@@ -1,485 +0,0 @@
-/***
- * Contains core SlickGrid classes.
- * @module Core
- * @namespace Slick
- */
-
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "Event": Event,
-      "EventData": EventData,
-      "EventHandler": EventHandler,
-      "Range": Range,
-      "NonDataRow": NonDataItem,
-      "Group": Group,
-      "GroupTotals": GroupTotals,
-      "EditorLock": EditorLock,
-
-      /***
-       * A global singleton editor lock.
-       * @class GlobalEditorLock
-       * @static
-       * @constructor
-       */
-      "GlobalEditorLock": new EditorLock(),
-
-      "keyCode": {
-        BACKSPACE: 8,
-        DELETE: 46,
-        DOWN: 40,
-        END: 35,
-        ENTER: 13,
-        ESCAPE: 27,
-        HOME: 36,
-        INSERT: 45,
-        LEFT: 37,
-        PAGE_DOWN: 34,
-        PAGE_UP: 33,
-        RIGHT: 39,
-        TAB: 9,
-        UP: 38
-      },
-      "preClickClassName" : "slick-edit-preclick"
-    }
-  });
-
-  /***
-   * An event object for passing data to event handlers and letting them control propagation.
-   * <p>This is pretty much identical to how W3C and jQuery implement events.</p>
-   * @class EventData
-   * @constructor
-   */
-  function EventData() {
-    var isPropagationStopped = false;
-    var isImmediatePropagationStopped = false;
-
-    /***
-     * Stops event from propagating up the DOM tree.
-     * @method stopPropagation
-     */
-    this.stopPropagation = function () {
-      isPropagationStopped = true;
-    };
-
-    /***
-     * Returns whether stopPropagation was called on this event object.
-     * @method isPropagationStopped
-     * @return {Boolean}
-     */
-    this.isPropagationStopped = function () {
-      return isPropagationStopped;
-    };
-
-    /***
-     * Prevents the rest of the handlers from being executed.
-     * @method stopImmediatePropagation
-     */
-    this.stopImmediatePropagation = function () {
-      isImmediatePropagationStopped = true;
-    };
-
-    /***
-     * Returns whether stopImmediatePropagation was called on this event object.\
-     * @method isImmediatePropagationStopped
-     * @return {Boolean}
-     */
-    this.isImmediatePropagationStopped = function () {
-      return isImmediatePropagationStopped;
-    }
-  }
-
-  /***
-   * A simple publisher-subscriber implementation.
-   * @class Event
-   * @constructor
-   */
-  function Event() {
-    var handlers = [];
-
-    /***
-     * Adds an event handler to be called when the event is fired.
-     * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>
-     * object the event was fired with.<p>
-     * @method subscribe
-     * @param fn {Function} Event handler.
-     */
-    this.subscribe = function (fn) {
-      handlers.push(fn);
-    };
-
-    /***
-     * Removes an event handler added with <code>subscribe(fn)</code>.
-     * @method unsubscribe
-     * @param fn {Function} Event handler to be removed.
-     */
-    this.unsubscribe = function (fn) {
-      for (var i = handlers.length - 1; i >= 0; i--) {
-        if (handlers[i] === fn) {
-          handlers.splice(i, 1);
-        }
-      }
-    };
-
-    /***
-     * Fires an event notifying all subscribers.
-     * @method notify
-     * @param args {Object} Additional data object to be passed to all handlers.
-     * @param e {EventData}
-     *      Optional.
-     *      An <code>EventData</code> object to be passed to all handlers.
-     *      For DOM events, an existing W3C/jQuery event object can be passed in.
-     * @param scope {Object}
-     *      Optional.
-     *      The scope ("this") within which the handler will be executed.
-     *      If not specified, the scope will be set to the <code>Event</code> instance.
-     */
-    this.notify = function (args, e, scope) {
-      e = e || new EventData();
-      scope = scope || this;
-
-      var returnValue;
-      for (var i = 0; i < handlers.length && !(e.isPropagationStopped() || e.isImmediatePropagationStopped()); i++) {
-        returnValue = handlers[i].call(scope, e, args);
-      }
-
-      return returnValue;
-    };
-  }
-
-  function EventHandler() {
-    var handlers = [];
-
-    this.subscribe = function (event, handler) {
-      handlers.push({
-        event: event,
-        handler: handler
-      });
-      event.subscribe(handler);
-
-      return this;  // allow chaining
-    };
-
-    this.unsubscribe = function (event, handler) {
-      var i = handlers.length;
-      while (i--) {
-        if (handlers[i].event === event &&
-            handlers[i].handler === handler) {
-          handlers.splice(i, 1);
-          event.unsubscribe(handler);
-          return;
-        }
-      }
-
-      return this;  // allow chaining
-    };
-
-    this.unsubscribeAll = function () {
-      var i = handlers.length;
-      while (i--) {
-        handlers[i].event.unsubscribe(handlers[i].handler);
-      }
-      handlers = [];
-
-      return this;  // allow chaining
-    }
-  }
-
-  /***
-   * A structure containing a range of cells.
-   * @class Range
-   * @constructor
-   * @param fromRow {Integer} Starting row.
-   * @param fromCell {Integer} Starting cell.
-   * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.
-   * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.
-   */
-  function Range(fromRow, fromCell, toRow, toCell) {
-    if (toRow === undefined && toCell === undefined) {
-      toRow = fromRow;
-      toCell = fromCell;
-    }
-
-    /***
-     * @property fromRow
-     * @type {Integer}
-     */
-    this.fromRow = Math.min(fromRow, toRow);
-
-    /***
-     * @property fromCell
-     * @type {Integer}
-     */
-    this.fromCell = Math.min(fromCell, toCell);
-
-    /***
-     * @property toRow
-     * @type {Integer}
-     */
-    this.toRow = Math.max(fromRow, toRow);
-
-    /***
-     * @property toCell
-     * @type {Integer}
-     */
-    this.toCell = Math.max(fromCell, toCell);
-
-    /***
-     * Returns whether a range represents a single row.
-     * @method isSingleRow
-     * @return {Boolean}
-     */
-    this.isSingleRow = function () {
-      return this.fromRow == this.toRow;
-    };
-
-    /***
-     * Returns whether a range represents a single cell.
-     * @method isSingleCell
-     * @return {Boolean}
-     */
-    this.isSingleCell = function () {
-      return this.fromRow == this.toRow && this.fromCell == this.toCell;
-    };
-
-    /***
-     * Returns whether a range contains a given cell.
-     * @method contains
-     * @param row {Integer}
-     * @param cell {Integer}
-     * @return {Boolean}
-     */
-    this.contains = function (row, cell) {
-      return row >= this.fromRow && row <= this.toRow &&
-          cell >= this.fromCell && cell <= this.toCell;
-    };
-
-    /***
-     * Returns a readable representation of a range.
-     * @method toString
-     * @return {String}
-     */
-    this.toString = function () {
-      if (this.isSingleCell()) {
-        return "(" + this.fromRow + ":" + this.fromCell + ")";
-      }
-      else {
-        return "(" + this.fromRow + ":" + this.fromCell + " - " + this.toRow + ":" + this.toCell + ")";
-      }
-    }
-  }
-
-
-  /***
-   * A base class that all special / non-data rows (like Group and GroupTotals) derive from.
-   * @class NonDataItem
-   * @constructor
-   */
-  function NonDataItem() {
-    this.__nonDataRow = true;
-  }
-
-
-  /***
-   * Information about a group of rows.
-   * @class Group
-   * @extends Slick.NonDataItem
-   * @constructor
-   */
-  function Group() {
-    this.__group = true;
-
-    /**
-     * Grouping level, starting with 0.
-     * @property level
-     * @type {Number}
-     */
-    this.level = 0;
-
-    /***
-     * Number of rows in the group.
-     * @property count
-     * @type {Integer}
-     */
-    this.count = 0;
-
-    /***
-     * Grouping value.
-     * @property value
-     * @type {Object}
-     */
-    this.value = null;
-
-    /***
-     * Formatted display value of the group.
-     * @property title
-     * @type {String}
-     */
-    this.title = null;
-
-    /***
-     * Whether a group is collapsed.
-     * @property collapsed
-     * @type {Boolean}
-     */
-    this.collapsed = false;
-
-    /***
-     * GroupTotals, if any.
-     * @property totals
-     * @type {GroupTotals}
-     */
-    this.totals = null;
-
-    /**
-     * Rows that are part of the group.
-     * @property rows
-     * @type {Array}
-     */
-    this.rows = [];
-
-    /**
-     * Sub-groups that are part of the group.
-     * @property groups
-     * @type {Array}
-     */
-    this.groups = null;
-
-    /**
-     * A unique key used to identify the group.  This key can be used in calls to DataView
-     * collapseGroup() or expandGroup().
-     * @property groupingKey
-     * @type {Object}
-     */
-    this.groupingKey = null;
-  }
-
-  Group.prototype = new NonDataItem();
-
-  /***
-   * Compares two Group instances.
-   * @method equals
-   * @return {Boolean}
-   * @param group {Group} Group instance to compare to.
-   */
-  Group.prototype.equals = function (group) {
-    return this.value === group.value &&
-        this.count === group.count &&
-        this.collapsed === group.collapsed &&
-        this.title === group.title;
-  };
-
-  /***
-   * Information about group totals.
-   * An instance of GroupTotals will be created for each totals row and passed to the aggregators
-   * so that they can store arbitrary data in it.  That data can later be accessed by group totals
-   * formatters during the display.
-   * @class GroupTotals
-   * @extends Slick.NonDataItem
-   * @constructor
-   */
-  function GroupTotals() {
-    this.__groupTotals = true;
-
-    /***
-     * Parent Group.
-     * @param group
-     * @type {Group}
-     */
-    this.group = null;
-
-    /***
-     * Whether the totals have been fully initialized / calculated.
-     * Will be set to false for lazy-calculated group totals.
-     * @param initialized
-     * @type {Boolean}
-     */
-    this.initialized = false;
-  }
-
-  GroupTotals.prototype = new NonDataItem();
-
-  /***
-   * A locking helper to track the active edit controller and ensure that only a single controller
-   * can be active at a time.  This prevents a whole class of state and validation synchronization
-   * issues.  An edit controller (such as SlickGrid) can query if an active edit is in progress
-   * and attempt a commit or cancel before proceeding.
-   * @class EditorLock
-   * @constructor
-   */
-  function EditorLock() {
-    var activeEditController = null;
-
-    /***
-     * Returns true if a specified edit controller is active (has the edit lock).
-     * If the parameter is not specified, returns true if any edit controller is active.
-     * @method isActive
-     * @param editController {EditController}
-     * @return {Boolean}
-     */
-    this.isActive = function (editController) {
-      return (editController ? activeEditController === editController : activeEditController !== null);
-    };
-
-    /***
-     * Sets the specified edit controller as the active edit controller (acquire edit lock).
-     * If another edit controller is already active, and exception will be throw new Error(.
-     * @method activate
-     * @param editController {EditController} edit controller acquiring the lock
-     */
-    this.activate = function (editController) {
-      if (editController === activeEditController) { // already activated?
-        return;
-      }
-      if (activeEditController !== null) {
-        throw new Error("SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController");
-      }
-      if (!editController.commitCurrentEdit) {
-        throw new Error("SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()");
-      }
-      if (!editController.cancelCurrentEdit) {
-        throw new Error("SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()");
-      }
-      activeEditController = editController;
-    };
-
-    /***
-     * Unsets the specified edit controller as the active edit controller (release edit lock).
-     * If the specified edit controller is not the active one, an exception will be throw new Error(.
-     * @method deactivate
-     * @param editController {EditController} edit controller releasing the lock
-     */
-    this.deactivate = function (editController) {
-      if (activeEditController !== editController) {
-        throw new Error("SlickGrid.EditorLock.deactivate: specified editController is not the currently active one");
-      }
-      activeEditController = null;
-    };
-
-    /***
-     * Attempts to commit the current edit by calling "commitCurrentEdit" method on the active edit
-     * controller and returns whether the commit attempt was successful (commit may fail due to validation
-     * errors, etc.).  Edit controller's "commitCurrentEdit" must return true if the commit has succeeded
-     * and false otherwise.  If no edit controller is active, returns true.
-     * @method commitCurrentEdit
-     * @return {Boolean}
-     */
-    this.commitCurrentEdit = function () {
-      return (activeEditController ? activeEditController.commitCurrentEdit() : true);
-    };
-
-    /***
-     * Attempts to cancel the current edit by calling "cancelCurrentEdit" method on the active edit
-     * controller and returns whether the edit was successfully cancelled.  If no edit controller is
-     * active, returns true.
-     * @method cancelCurrentEdit
-     * @return {Boolean}
-     */
-    this.cancelCurrentEdit = function cancelCurrentEdit() {
-      return (activeEditController ? activeEditController.cancelCurrentEdit() : true);
-    };
-  }
-})(jQuery);
-
-
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.dataview.js b/web/pgadmin/static/vendor/slickgrid/slick.dataview.js
deleted file mode 100644
index b004b800..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.dataview.js
+++ /dev/null
@@ -1,1159 +0,0 @@
-(function ($) {
-  $.extend(true, window, {
-    Slick: {
-      Data: {
-        DataView: DataView,
-        Aggregators: {
-          Avg: AvgAggregator,
-          Min: MinAggregator,
-          Max: MaxAggregator,
-          Sum: SumAggregator
-        }
-      }
-    }
-  });
-
-
-  /***
-   * A sample Model implementation.
-   * Provides a filtered view of the underlying data.
-   *
-   * Relies on the data item having an "id" property uniquely identifying it.
-   */
-  function DataView(options) {
-    var self = this;
-
-    var defaults = {
-      groupItemMetadataProvider: null,
-      inlineFilters: false
-    };
-
-
-    // private
-    var idProperty = "id";  // property holding a unique row id
-    var items = [];         // data by index
-    var rows = [];          // data by row
-    var idxById = {};       // indexes by id
-    var rowsById = null;    // rows by id; lazy-calculated
-    var filter = null;      // filter function
-    var updated = null;     // updated item ids
-    var suspend = false;    // suspends the recalculation
-    var sortAsc = true;
-    var fastSortField;
-    var sortComparer;
-    var refreshHints = {};
-    var prevRefreshHints = {};
-    var filterArgs;
-    var filteredItems = [];
-    var compiledFilter;
-    var compiledFilterWithCaching;
-    var filterCache = [];
-
-    // grouping
-    var groupingInfoDefaults = {
-      getter: null,
-      formatter: null,
-      comparer: function(a, b) {
-        return (a.value === b.value ? 0 :
-          (a.value > b.value ? 1 : -1)
-        );
-      },
-      predefinedValues: [],
-      aggregators: [],
-      aggregateEmpty: false,
-      aggregateCollapsed: false,
-      aggregateChildGroups: false,
-      collapsed: false,
-      displayTotalsRow: true,
-      lazyTotalsCalculation: false
-    };
-    var groupingInfos = [];
-    var groups = [];
-    var toggledGroupsByLevel = [];
-    var groupingDelimiter = ':|:';
-
-    var pagesize = 0;
-    var pagenum = 0;
-    var totalRows = 0;
-
-    // events
-    var onRowCountChanged = new Slick.Event();
-    var onRowsChanged = new Slick.Event();
-    var onPagingInfoChanged = new Slick.Event();
-
-    options = $.extend(true, {}, defaults, options);
-
-
-    function beginUpdate() {
-      suspend = true;
-    }
-
-    function endUpdate() {
-      suspend = false;
-      refresh();
-    }
-
-    function setRefreshHints(hints) {
-      refreshHints = hints;
-    }
-
-    function setFilterArgs(args) {
-      filterArgs = args;
-    }
-
-    function updateIdxById(startingIndex) {
-      startingIndex = startingIndex || 0;
-      var id;
-      for (var i = startingIndex, l = items.length; i < l; i++) {
-        id = items[i][idProperty];
-        if (id === undefined) {
-          throw new Error("Each data element must implement a unique 'id' property");
-        }
-        idxById[id] = i;
-      }
-    }
-
-    function ensureIdUniqueness() {
-      var id;
-      for (var i = 0, l = items.length; i < l; i++) {
-        id = items[i][idProperty];
-        if (id === undefined || idxById[id] !== i) {
-          throw new Error("Each data element must implement a unique 'id' property");
-        }
-      }
-    }
-
-    function getItems() {
-      return items;
-    }
-
-    function setItems(data, objectIdProperty) {
-      if (objectIdProperty !== undefined) {
-        idProperty = objectIdProperty;
-      }
-      items = filteredItems = data;
-      idxById = {};
-      updateIdxById();
-      ensureIdUniqueness();
-      refresh();
-    }
-
-    function setPagingOptions(args) {
-      if (args.pageSize != undefined) {
-        pagesize = args.pageSize;
-        pagenum = pagesize ? Math.min(pagenum, Math.max(0, Math.ceil(totalRows / pagesize) - 1)) : 0;
-      }
-
-      if (args.pageNum != undefined) {
-        pagenum = Math.min(args.pageNum, Math.max(0, Math.ceil(totalRows / pagesize) - 1));
-      }
-
-      onPagingInfoChanged.notify(getPagingInfo(), null, self);
-
-      refresh();
-    }
-
-    function getPagingInfo() {
-      var totalPages = pagesize ? Math.max(1, Math.ceil(totalRows / pagesize)) : 1;
-      return {pageSize: pagesize, pageNum: pagenum, totalRows: totalRows, totalPages: totalPages, dataView: self};
-    }
-
-    function sort(comparer, ascending) {
-      sortAsc = ascending;
-      sortComparer = comparer;
-      fastSortField = null;
-      if (ascending === false) {
-        items.reverse();
-      }
-      items.sort(comparer);
-      if (ascending === false) {
-        items.reverse();
-      }
-      idxById = {};
-      updateIdxById();
-      refresh();
-    }
-
-    /***
-     * Provides a workaround for the extremely slow sorting in IE.
-     * Does a [lexicographic] sort on a give column by temporarily overriding Object.prototype.toString
-     * to return the value of that field and then doing a native Array.sort().
-     */
-    function fastSort(field, ascending) {
-      sortAsc = ascending;
-      fastSortField = field;
-      sortComparer = null;
-      var oldToString = Object.prototype.toString;
-      Object.prototype.toString = (typeof field == "function") ? field : function () {
-        return this[field]
-      };
-      // an extra reversal for descending sort keeps the sort stable
-      // (assuming a stable native sort implementation, which isn't true in some cases)
-      if (ascending === false) {
-        items.reverse();
-      }
-      items.sort();
-      Object.prototype.toString = oldToString;
-      if (ascending === false) {
-        items.reverse();
-      }
-      idxById = {};
-      updateIdxById();
-      refresh();
-    }
-
-    function reSort() {
-      if (sortComparer) {
-        sort(sortComparer, sortAsc);
-      } else if (fastSortField) {
-        fastSort(fastSortField, sortAsc);
-      }
-    }
-
-    function getFilteredItems(){
-      return filteredItems;
-    }
-
-
-    function getFilter(){
-      return filter;
-    }
-    
-    function setFilter(filterFn) {
-      filter = filterFn;
-      if (options.inlineFilters) {
-        compiledFilter = compileFilter();
-        compiledFilterWithCaching = compileFilterWithCaching();
-      }
-      refresh();
-    }
-
-    function getGrouping() {
-      return groupingInfos;
-    }
-
-    function setGrouping(groupingInfo) {
-      if (!options.groupItemMetadataProvider) {
-        options.groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider();
-      }
-
-      groups = [];
-      toggledGroupsByLevel = [];
-      groupingInfo = groupingInfo || [];
-      groupingInfos = (groupingInfo instanceof Array) ? groupingInfo : [groupingInfo];
-
-      for (var i = 0; i < groupingInfos.length; i++) {
-        var gi = groupingInfos[i] = $.extend(true, {}, groupingInfoDefaults, groupingInfos[i]);
-        gi.getterIsAFn = typeof gi.getter === "function";
-
-        // pre-compile accumulator loops
-        gi.compiledAccumulators = [];
-        var idx = gi.aggregators.length;
-        while (idx--) {
-          gi.compiledAccumulators[idx] = compileAccumulatorLoop(gi.aggregators[idx]);
-        }
-
-        toggledGroupsByLevel[i] = {};
-      }
-
-      refresh();
-    }
-
-    /**
-     * @deprecated Please use {@link setGrouping}.
-     */
-    function groupBy(valueGetter, valueFormatter, sortComparer) {
-      if (valueGetter == null) {
-        setGrouping([]);
-        return;
-      }
-
-      setGrouping({
-        getter: valueGetter,
-        formatter: valueFormatter,
-        comparer: sortComparer
-      });
-    }
-
-    /**
-     * @deprecated Please use {@link setGrouping}.
-     */
-    function setAggregators(groupAggregators, includeCollapsed) {
-      if (!groupingInfos.length) {
-        throw new Error("At least one grouping must be specified before calling setAggregators().");
-      }
-
-      groupingInfos[0].aggregators = groupAggregators;
-      groupingInfos[0].aggregateCollapsed = includeCollapsed;
-
-      setGrouping(groupingInfos);
-    }
-
-    function getItemByIdx(i) {
-      return items[i];
-    }
-
-    function getIdxById(id) {
-      return idxById[id];
-    }
-
-    function ensureRowsByIdCache() {
-      if (!rowsById) {
-        rowsById = {};
-        for (var i = 0, l = rows.length; i < l; i++) {
-          rowsById[rows[i][idProperty]] = i;
-        }
-      }
-    }
-
-    function getRowById(id) {
-      ensureRowsByIdCache();
-      return rowsById[id];
-    }
-
-    function getItemById(id) {
-      return items[idxById[id]];
-    }
-
-    function mapIdsToRows(idArray) {
-      var rows = [];
-      ensureRowsByIdCache();
-      for (var i = 0, l = idArray.length; i < l; i++) {
-        var row = rowsById[idArray[i]];
-        if (row != null) {
-          rows[rows.length] = row;
-        }
-      }
-      return rows;
-    }
-
-    function mapRowsToIds(rowArray) {
-      var ids = [];
-      for (var i = 0, l = rowArray.length; i < l; i++) {
-        if (rowArray[i] < rows.length) {
-          ids[ids.length] = rows[rowArray[i]][idProperty];
-        }
-      }
-      return ids;
-    }
-
-    function updateItem(id, item) {
-      if (idxById[id] === undefined || id !== item[idProperty]) {
-        throw new Error("Invalid or non-matching id");
-      }
-      items[idxById[id]] = item;
-      if (!updated) {
-        updated = {};
-      }
-      updated[id] = true;
-      refresh();
-    }
-
-    function insertItem(insertBefore, item) {
-      items.splice(insertBefore, 0, item);
-      updateIdxById(insertBefore);
-      refresh();
-    }
-
-    function addItem(item) {
-      items.push(item);
-      updateIdxById(items.length - 1);
-      refresh();
-    }
-
-    function deleteItem(id) {
-      var idx = idxById[id];
-      if (idx === undefined) {
-        throw new Error("Invalid id");
-      }
-      delete idxById[id];
-      items.splice(idx, 1);
-      updateIdxById(idx);
-      refresh();
-    }
-
-    function getLength() {
-      return rows.length;
-    }
-
-    function getItem(i) {
-      var item = rows[i];
-
-      // if this is a group row, make sure totals are calculated and update the title
-      if (item && item.__group && item.totals && !item.totals.initialized) {
-        var gi = groupingInfos[item.level];
-        if (!gi.displayTotalsRow) {
-          calculateTotals(item.totals);
-          item.title = gi.formatter ? gi.formatter(item) : item.value;
-        }
-      }
-      // if this is a totals row, make sure it's calculated
-      else if (item && item.__groupTotals && !item.initialized) {
-        calculateTotals(item);
-      }
-
-      return item;
-    }
-
-    function getItemMetadata(i) {
-      var item = rows[i];
-      if (item === undefined) {
-        return null;
-      }
-
-      // overrides for grouping rows
-      if (item.__group) {
-        return options.groupItemMetadataProvider.getGroupRowMetadata(item);
-      }
-
-      // overrides for totals rows
-      if (item.__groupTotals) {
-        return options.groupItemMetadataProvider.getTotalsRowMetadata(item);
-      }
-
-      return null;
-    }
-
-    function expandCollapseAllGroups(level, collapse) {
-      if (level == null) {
-        for (var i = 0; i < groupingInfos.length; i++) {
-          toggledGroupsByLevel[i] = {};
-          groupingInfos[i].collapsed = collapse;
-        }
-      } else {
-        toggledGroupsByLevel[level] = {};
-        groupingInfos[level].collapsed = collapse;
-      }
-      refresh();
-    }
-
-    /**
-     * @param level {Number} Optional level to collapse.  If not specified, applies to all levels.
-     */
-    function collapseAllGroups(level) {
-      expandCollapseAllGroups(level, true);
-    }
-
-    /**
-     * @param level {Number} Optional level to expand.  If not specified, applies to all levels.
-     */
-    function expandAllGroups(level) {
-      expandCollapseAllGroups(level, false);
-    }
-
-    function expandCollapseGroup(level, groupingKey, collapse) {
-      toggledGroupsByLevel[level][groupingKey] = groupingInfos[level].collapsed ^ collapse;
-      refresh();
-    }
-
-    /**
-     * @param varArgs Either a Slick.Group's "groupingKey" property, or a
-     *     variable argument list of grouping values denoting a unique path to the row.  For
-     *     example, calling collapseGroup('high', '10%') will collapse the '10%' subgroup of
-     *     the 'high' group.
-     */
-    function collapseGroup(varArgs) {
-      var args = Array.prototype.slice.call(arguments);
-      var arg0 = args[0];
-      if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {
-        expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, true);
-      } else {
-        expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), true);
-      }
-    }
-
-    /**
-     * @param varArgs Either a Slick.Group's "groupingKey" property, or a
-     *     variable argument list of grouping values denoting a unique path to the row.  For
-     *     example, calling expandGroup('high', '10%') will expand the '10%' subgroup of
-     *     the 'high' group.
-     */
-    function expandGroup(varArgs) {
-      var args = Array.prototype.slice.call(arguments);
-      var arg0 = args[0];
-      if (args.length == 1 && arg0.indexOf(groupingDelimiter) != -1) {
-        expandCollapseGroup(arg0.split(groupingDelimiter).length - 1, arg0, false);
-      } else {
-        expandCollapseGroup(args.length - 1, args.join(groupingDelimiter), false);
-      }
-    }
-
-    function getGroups() {
-      return groups;
-    }
-
-    function extractGroups(rows, parentGroup) {
-      var group;
-      var val;
-      var groups = [];
-      var groupsByVal = {};
-      var r;
-      var level = parentGroup ? parentGroup.level + 1 : 0;
-      var gi = groupingInfos[level];
-
-      for (var i = 0, l = gi.predefinedValues.length; i < l; i++) {
-        val = gi.predefinedValues[i];
-        group = groupsByVal[val];
-        if (!group) {
-          group = new Slick.Group();
-          group.value = val;
-          group.level = level;
-          group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : '') + val;
-          groups[groups.length] = group;
-          groupsByVal[val] = group;
-        }
-      }
-
-      for (var i = 0, l = rows.length; i < l; i++) {
-        r = rows[i];
-        val = gi.getterIsAFn ? gi.getter(r) : r[gi.getter];
-        group = groupsByVal[val];
-        if (!group) {
-          group = new Slick.Group();
-          group.value = val;
-          group.level = level;
-          group.groupingKey = (parentGroup ? parentGroup.groupingKey + groupingDelimiter : '') + val;
-          groups[groups.length] = group;
-          groupsByVal[val] = group;
-        }
-
-        group.rows[group.count++] = r;
-      }
-
-      if (level < groupingInfos.length - 1) {
-        for (var i = 0; i < groups.length; i++) {
-          group = groups[i];
-          group.groups = extractGroups(group.rows, group);
-        }
-      }      
-
-      groups.sort(groupingInfos[level].comparer);
-
-      return groups;
-    }
-
-    function calculateTotals(totals) {
-      var group = totals.group;
-      var gi = groupingInfos[group.level];
-      var isLeafLevel = (group.level == groupingInfos.length);
-      var agg, idx = gi.aggregators.length;
-
-      if (!isLeafLevel && gi.aggregateChildGroups) {
-        // make sure all the subgroups are calculated
-        var i = group.groups.length;
-        while (i--) {
-          if (!group.groups[i].totals.initialized) {
-            calculateTotals(group.groups[i].totals);
-          }
-        }
-      }
-
-      while (idx--) {
-        agg = gi.aggregators[idx];
-        agg.init();
-        if (!isLeafLevel && gi.aggregateChildGroups) {
-          gi.compiledAccumulators[idx].call(agg, group.groups);
-        } else {
-          gi.compiledAccumulators[idx].call(agg, group.rows);
-        }
-        agg.storeResult(totals);
-      }
-      totals.initialized = true;
-    }
-
-    function addGroupTotals(group) {
-      var gi = groupingInfos[group.level];
-      var totals = new Slick.GroupTotals();
-      totals.group = group;
-      group.totals = totals;
-      if (!gi.lazyTotalsCalculation) {
-        calculateTotals(totals);
-      }
-    }
-
-    function addTotals(groups, level) {
-      level = level || 0;
-      var gi = groupingInfos[level];
-      var groupCollapsed = gi.collapsed;
-      var toggledGroups = toggledGroupsByLevel[level];      
-      var idx = groups.length, g;
-      while (idx--) {
-        g = groups[idx];
-
-        if (g.collapsed && !gi.aggregateCollapsed) {
-          continue;
-        }
-
-        // Do a depth-first aggregation so that parent group aggregators can access subgroup totals.
-        if (g.groups) {
-          addTotals(g.groups, level + 1);
-        }
-
-        if (gi.aggregators.length && (
-            gi.aggregateEmpty || g.rows.length || (g.groups && g.groups.length))) {
-          addGroupTotals(g);
-        }
-
-        g.collapsed = groupCollapsed ^ toggledGroups[g.groupingKey];
-        g.title = gi.formatter ? gi.formatter(g) : g.value;
-      }
-    } 
-
-    function flattenGroupedRows(groups, level) {
-      level = level || 0;
-      var gi = groupingInfos[level];
-      var groupedRows = [], rows, gl = 0, g;
-      for (var i = 0, l = groups.length; i < l; i++) {
-        g = groups[i];
-        groupedRows[gl++] = g;
-
-        if (!g.collapsed) {
-          rows = g.groups ? flattenGroupedRows(g.groups, level + 1) : g.rows;
-          for (var j = 0, jj = rows.length; j < jj; j++) {
-            groupedRows[gl++] = rows[j];
-          }
-        }
-
-        if (g.totals && gi.displayTotalsRow && (!g.collapsed || gi.aggregateCollapsed)) {
-          groupedRows[gl++] = g.totals;
-        }
-      }
-      return groupedRows;
-    }
-
-    function getFunctionInfo(fn) {
-      var fnRegex = /^function[^(]*\(([^)]*)\)\s*{([\s\S]*)}$/;
-      var matches = fn.toString().match(fnRegex);
-      return {
-        params: matches[1].split(","),
-        body: matches[2]
-      };
-    }
-
-    function compileAccumulatorLoop(aggregator) {
-      var accumulatorInfo = getFunctionInfo(aggregator.accumulate);
-      var fn = new Function(
-          "_items",
-          "for (var " + accumulatorInfo.params[0] + ", _i=0, _il=_items.length; _i<_il; _i++) {" +
-              accumulatorInfo.params[0] + " = _items[_i]; " +
-              accumulatorInfo.body +
-          "}"
-      );
-      fn.displayName = fn.name = "compiledAccumulatorLoop";
-      return fn;
-    }
-
-    function compileFilter() {
-      var filterInfo = getFunctionInfo(filter);
-
-      var filterPath1 = "{ continue _coreloop; }$1";
-      var filterPath2 = "{ _retval[_idx++] = $item$; continue _coreloop; }$1";
-      // make some allowances for minification - there's only so far we can go with RegEx
-      var filterBody = filterInfo.body
-          .replace(/return false\s*([;}]|\}|$)/gi, filterPath1)
-          .replace(/return!1([;}]|\}|$)/gi, filterPath1)
-          .replace(/return true\s*([;}]|\}|$)/gi, filterPath2)
-          .replace(/return!0([;}]|\}|$)/gi, filterPath2)
-          .replace(/return ([^;}]+?)\s*([;}]|$)/gi,
-          "{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
-
-      // This preserves the function template code after JS compression,
-      // so that replace() commands still work as expected.
-      var tpl = [
-        //"function(_items, _args) { ",
-        "var _retval = [], _idx = 0; ",
-        "var $item$, $args$ = _args; ",
-        "_coreloop: ",
-        "for (var _i = 0, _il = _items.length; _i < _il; _i++) { ",
-        "$item$ = _items[_i]; ",
-        "$filter$; ",
-        "} ",
-        "return _retval; "
-        //"}"
-      ].join("");
-      tpl = tpl.replace(/\$filter\$/gi, filterBody);
-      tpl = tpl.replace(/\$item\$/gi, filterInfo.params[0]);
-      tpl = tpl.replace(/\$args\$/gi, filterInfo.params[1]);
-
-      var fn = new Function("_items,_args", tpl);
-      fn.displayName = fn.name = "compiledFilter";
-      return fn;
-    }
-
-    function compileFilterWithCaching() {
-      var filterInfo = getFunctionInfo(filter);
-
-      var filterPath1 = "{ continue _coreloop; }$1";
-      var filterPath2 = "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1";
-      // make some allowances for minification - there's only so far we can go with RegEx
-      var filterBody = filterInfo.body
-          .replace(/return false\s*([;}]|\}|$)/gi, filterPath1)
-          .replace(/return!1([;}]|\}|$)/gi, filterPath1)
-          .replace(/return true\s*([;}]|\}|$)/gi, filterPath2)
-          .replace(/return!0([;}]|\}|$)/gi, filterPath2)
-          .replace(/return ([^;}]+?)\s*([;}]|$)/gi,
-          "{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
-
-      // This preserves the function template code after JS compression,
-      // so that replace() commands still work as expected.
-      var tpl = [
-        //"function(_items, _args, _cache) { ",
-        "var _retval = [], _idx = 0; ",
-        "var $item$, $args$ = _args; ",
-        "_coreloop: ",
-        "for (var _i = 0, _il = _items.length; _i < _il; _i++) { ",
-        "$item$ = _items[_i]; ",
-        "if (_cache[_i]) { ",
-        "_retval[_idx++] = $item$; ",
-        "continue _coreloop; ",
-        "} ",
-        "$filter$; ",
-        "} ",
-        "return _retval; "
-        //"}"
-      ].join("");
-      tpl = tpl.replace(/\$filter\$/gi, filterBody);
-      tpl = tpl.replace(/\$item\$/gi, filterInfo.params[0]);
-      tpl = tpl.replace(/\$args\$/gi, filterInfo.params[1]);
-
-      var fn = new Function("_items,_args,_cache", tpl);
-      fn.displayName = fn.name = "compiledFilterWithCaching";
-      return fn;
-    }
-
-    function uncompiledFilter(items, args) {
-      var retval = [], idx = 0;
-
-      for (var i = 0, ii = items.length; i < ii; i++) {
-        if (filter(items[i], args)) {
-          retval[idx++] = items[i];
-        }
-      }
-
-      return retval;
-    }
-
-    function uncompiledFilterWithCaching(items, args, cache) {
-      var retval = [], idx = 0, item;
-
-      for (var i = 0, ii = items.length; i < ii; i++) {
-        item = items[i];
-        if (cache[i]) {
-          retval[idx++] = item;
-        } else if (filter(item, args)) {
-          retval[idx++] = item;
-          cache[i] = true;
-        }
-      }
-
-      return retval;
-    }
-
-    function getFilteredAndPagedItems(items) {
-      if (filter) {
-        var batchFilter = options.inlineFilters ? compiledFilter : uncompiledFilter;
-        var batchFilterWithCaching = options.inlineFilters ? compiledFilterWithCaching : uncompiledFilterWithCaching;
-
-        if (refreshHints.isFilterNarrowing) {
-          filteredItems = batchFilter(filteredItems, filterArgs);
-        } else if (refreshHints.isFilterExpanding) {
-          filteredItems = batchFilterWithCaching(items, filterArgs, filterCache);
-        } else if (!refreshHints.isFilterUnchanged) {
-          filteredItems = batchFilter(items, filterArgs);
-        }
-      } else {
-        // special case:  if not filtering and not paging, the resulting
-        // rows collection needs to be a copy so that changes due to sort
-        // can be caught
-        filteredItems = pagesize ? items : items.concat();
-      }
-
-      // get the current page
-      var paged;
-      if (pagesize) {
-        if (filteredItems.length <= pagenum * pagesize) {
-          if (filteredItems.length === 0) {
-            pagenum = 0;
-          } else {
-            pagenum = Math.floor((filteredItems.length - 1) / pagesize);
-          }
-        }
-        paged = filteredItems.slice(pagesize * pagenum, pagesize * pagenum + pagesize);
-      } else {
-        paged = filteredItems;
-      }
-      return {totalRows: filteredItems.length, rows: paged};
-    }
-
-    function getRowDiffs(rows, newRows) {
-      var item, r, eitherIsNonData, diff = [];
-      var from = 0, to = newRows.length;
-
-      if (refreshHints && refreshHints.ignoreDiffsBefore) {
-        from = Math.max(0,
-            Math.min(newRows.length, refreshHints.ignoreDiffsBefore));
-      }
-
-      if (refreshHints && refreshHints.ignoreDiffsAfter) {
-        to = Math.min(newRows.length,
-            Math.max(0, refreshHints.ignoreDiffsAfter));
-      }
-
-      for (var i = from, rl = rows.length; i < to; i++) {
-        if (i >= rl) {
-          diff[diff.length] = i;
-        } else {
-          item = newRows[i];
-          r = rows[i];
-
-          if ((groupingInfos.length && (eitherIsNonData = (item.__nonDataRow) || (r.__nonDataRow)) &&
-              item.__group !== r.__group ||
-              item.__group && !item.equals(r))
-              || (eitherIsNonData &&
-              // no good way to compare totals since they are arbitrary DTOs
-              // deep object comparison is pretty expensive
-              // always considering them 'dirty' seems easier for the time being
-              (item.__groupTotals || r.__groupTotals))
-              || item[idProperty] != r[idProperty]
-              || (updated && updated[item[idProperty]])
-              ) {
-            diff[diff.length] = i;
-          }
-        }
-      }
-      return diff;
-    }
-
-    function recalc(_items) {
-      rowsById = null;
-
-      if (refreshHints.isFilterNarrowing != prevRefreshHints.isFilterNarrowing ||
-          refreshHints.isFilterExpanding != prevRefreshHints.isFilterExpanding) {
-        filterCache = [];
-      }
-
-      var filteredItems = getFilteredAndPagedItems(_items);
-      totalRows = filteredItems.totalRows;
-      var newRows = filteredItems.rows;
-
-      groups = [];
-      if (groupingInfos.length) {
-        groups = extractGroups(newRows);
-        if (groups.length) {
-          addTotals(groups);
-          newRows = flattenGroupedRows(groups);
-        }
-      }
-
-      var diff = getRowDiffs(rows, newRows);
-
-      rows = newRows;
-
-      return diff;
-    }
-
-    function refresh() {
-      if (suspend) {
-        return;
-      }
-
-      var countBefore = rows.length;
-      var totalRowsBefore = totalRows;
-
-      var diff = recalc(items, filter); // pass as direct refs to avoid closure perf hit
-
-      // if the current page is no longer valid, go to last page and recalc
-      // we suffer a performance penalty here, but the main loop (recalc) remains highly optimized
-      if (pagesize && totalRows < pagenum * pagesize) {
-        pagenum = Math.max(0, Math.ceil(totalRows / pagesize) - 1);
-        diff = recalc(items, filter);
-      }
-
-      updated = null;
-      prevRefreshHints = refreshHints;
-      refreshHints = {};
-
-      if (totalRowsBefore !== totalRows) {
-        onPagingInfoChanged.notify(getPagingInfo(), null, self);
-      }
-      if (countBefore !== rows.length) {
-        onRowCountChanged.notify({previous: countBefore, current: rows.length, dataView: self}, null, self);
-      }
-      if (diff.length > 0) {
-        onRowsChanged.notify({rows: diff, dataView: self}, null, self);
-      }
-    }
-
-    /***
-     * Wires the grid and the DataView together to keep row selection tied to item ids.
-     * This is useful since, without it, the grid only knows about rows, so if the items
-     * move around, the same rows stay selected instead of the selection moving along
-     * with the items.
-     *
-     * NOTE:  This doesn't work with cell selection model.
-     *
-     * @param grid {Slick.Grid} The grid to sync selection with.
-     * @param preserveHidden {Boolean} Whether to keep selected items that go out of the
-     *     view due to them getting filtered out.
-     * @param preserveHiddenOnSelectionChange {Boolean} Whether to keep selected items
-     *     that are currently out of the view (see preserveHidden) as selected when selection
-     *     changes.
-     * @return {Slick.Event} An event that notifies when an internal list of selected row ids
-     *     changes.  This is useful since, in combination with the above two options, it allows
-     *     access to the full list selected row ids, and not just the ones visible to the grid.
-     * @method syncGridSelection
-     */
-    function syncGridSelection(grid, preserveHidden, preserveHiddenOnSelectionChange) {
-      var self = this;
-      var inHandler;
-      var selectedRowIds = self.mapRowsToIds(grid.getSelectedRows());
-      var onSelectedRowIdsChanged = new Slick.Event();
-
-      function setSelectedRowIds(rowIds) {
-        if (selectedRowIds.join(",") == rowIds.join(",")) {
-          return;
-        }
-
-        selectedRowIds = rowIds;
-
-        onSelectedRowIdsChanged.notify({
-          "grid": grid,
-          "ids": selectedRowIds,
-          "dataView": self
-        }, new Slick.EventData(), self);
-      }
-
-      function update() {
-        if (selectedRowIds.length > 0) {
-          inHandler = true;
-          var selectedRows = self.mapIdsToRows(selectedRowIds);
-          if (!preserveHidden) {
-            setSelectedRowIds(self.mapRowsToIds(selectedRows));       
-          }
-          grid.setSelectedRows(selectedRows);
-          inHandler = false;
-        }
-      }
-
-      grid.onSelectedRowsChanged.subscribe(function(e, args) {
-        if (inHandler) { return; }
-        var newSelectedRowIds = self.mapRowsToIds(grid.getSelectedRows());
-        if (!preserveHiddenOnSelectionChange || !grid.getOptions().multiSelect) {
-          setSelectedRowIds(newSelectedRowIds);
-        } else {
-          // keep the ones that are hidden
-          var existing = $.grep(selectedRowIds, function(id) { return self.getRowById(id) === undefined; });
-          // add the newly selected ones
-          setSelectedRowIds(existing.concat(newSelectedRowIds));
-        }
-      });
-
-      this.onRowsChanged.subscribe(update);
-
-      this.onRowCountChanged.subscribe(update);
-
-      return onSelectedRowIdsChanged;
-    }
-
-    function syncGridCellCssStyles(grid, key) {
-      var hashById;
-      var inHandler;
-
-      // since this method can be called after the cell styles have been set,
-      // get the existing ones right away
-      storeCellCssStyles(grid.getCellCssStyles(key));
-
-      function storeCellCssStyles(hash) {
-        hashById = {};
-        for (var row in hash) {
-          var id = rows[row][idProperty];
-          hashById[id] = hash[row];
-        }
-      }
-
-      function update() {
-        if (hashById) {
-          inHandler = true;
-          ensureRowsByIdCache();
-          var newHash = {};
-          for (var id in hashById) {
-            var row = rowsById[id];
-            if (row != undefined) {
-              newHash[row] = hashById[id];
-            }
-          }
-          grid.setCellCssStyles(key, newHash);
-          inHandler = false;
-        }
-      }
-
-      grid.onCellCssStylesChanged.subscribe(function(e, args) {
-        if (inHandler) { return; }
-        if (key != args.key) { return; }
-        if (args.hash) {
-          storeCellCssStyles(args.hash);
-        } else {
-          grid.onCellCssStylesChanged.unsubscribe(styleChanged);
-          self.onRowsChanged.unsubscribe(update);
-          self.onRowCountChanged.unsubscribe(update);          
-        }
-      });
-
-      this.onRowsChanged.subscribe(update);
-
-      this.onRowCountChanged.subscribe(update);
-    }
-
-    $.extend(this, {
-      // methods
-      "beginUpdate": beginUpdate,
-      "endUpdate": endUpdate,
-      "setPagingOptions": setPagingOptions,
-      "getPagingInfo": getPagingInfo,
-      "getItems": getItems,
-      "setItems": setItems,
-      "setFilter": setFilter,
-      "getFilter": getFilter,
-      "getFilteredItems": getFilteredItems,
-      "sort": sort,
-      "fastSort": fastSort,
-      "reSort": reSort,
-      "setGrouping": setGrouping,
-      "getGrouping": getGrouping,
-      "groupBy": groupBy,
-      "setAggregators": setAggregators,
-      "collapseAllGroups": collapseAllGroups,
-      "expandAllGroups": expandAllGroups,
-      "collapseGroup": collapseGroup,
-      "expandGroup": expandGroup,
-      "getGroups": getGroups,
-      "getIdxById": getIdxById,
-      "getRowById": getRowById,
-      "getItemById": getItemById,
-      "getItemByIdx": getItemByIdx,
-      "mapRowsToIds": mapRowsToIds,
-      "mapIdsToRows": mapIdsToRows,
-      "setRefreshHints": setRefreshHints,
-      "setFilterArgs": setFilterArgs,
-      "refresh": refresh,
-      "updateItem": updateItem,
-      "insertItem": insertItem,
-      "addItem": addItem,
-      "deleteItem": deleteItem,
-      "syncGridSelection": syncGridSelection,
-      "syncGridCellCssStyles": syncGridCellCssStyles,
-
-      // data provider methods
-      "getLength": getLength,
-      "getItem": getItem,
-      "getItemMetadata": getItemMetadata,
-
-      // events
-      "onRowCountChanged": onRowCountChanged,
-      "onRowsChanged": onRowsChanged,
-      "onPagingInfoChanged": onPagingInfoChanged
-    });
-  }
-
-  function AvgAggregator(field) {
-    this.field_ = field;
-
-    this.init = function () {
-      this.count_ = 0;
-      this.nonNullCount_ = 0;
-      this.sum_ = 0;
-    };
-
-    this.accumulate = function (item) {
-      var val = item[this.field_];
-      this.count_++;
-      if (val != null && val !== "" && !isNaN(val)) {
-        this.nonNullCount_++;
-        this.sum_ += parseFloat(val);
-      }
-    };
-
-    this.storeResult = function (groupTotals) {
-      if (!groupTotals.avg) {
-        groupTotals.avg = {};
-      }
-      if (this.nonNullCount_ != 0) {
-        groupTotals.avg[this.field_] = this.sum_ / this.nonNullCount_;
-      }
-    };
-  }
-
-  function MinAggregator(field) {
-    this.field_ = field;
-
-    this.init = function () {
-      this.min_ = null;
-    };
-
-    this.accumulate = function (item) {
-      var val = item[this.field_];
-      if (val != null && val !== "" && !isNaN(val)) {
-        if (this.min_ == null || val < this.min_) {
-          this.min_ = val;
-        }
-      }
-    };
-
-    this.storeResult = function (groupTotals) {
-      if (!groupTotals.min) {
-        groupTotals.min = {};
-      }
-      groupTotals.min[this.field_] = this.min_;
-    }
-  }
-
-  function MaxAggregator(field) {
-    this.field_ = field;
-
-    this.init = function () {
-      this.max_ = null;
-    };
-
-    this.accumulate = function (item) {
-      var val = item[this.field_];
-      if (val != null && val !== "" && !isNaN(val)) {
-        if (this.max_ == null || val > this.max_) {
-          this.max_ = val;
-        }
-      }
-    };
-
-    this.storeResult = function (groupTotals) {
-      if (!groupTotals.max) {
-        groupTotals.max = {};
-      }
-      groupTotals.max[this.field_] = this.max_;
-    }
-  }
-
-  function SumAggregator(field) {
-    this.field_ = field;
-
-    this.init = function () {
-      this.sum_ = null;
-    };
-
-    this.accumulate = function (item) {
-      var val = item[this.field_];
-      if (val != null && val !== "" && !isNaN(val)) {
-        this.sum_ += parseFloat(val);
-      }
-    };
-
-    this.storeResult = function (groupTotals) {
-      if (!groupTotals.sum) {
-        groupTotals.sum = {};
-      }
-      groupTotals.sum[this.field_] = this.sum_;
-    }
-  }
-
-  // TODO:  add more built-in aggregators
-  // TODO:  merge common aggregators in one to prevent needles iterating
-
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.editors.js b/web/pgadmin/static/vendor/slickgrid/slick.editors.js
deleted file mode 100644
index 33b4e266..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.editors.js
+++ /dev/null
@@ -1,634 +0,0 @@
-/***
- * Contains basic SlickGrid editors.
- * @module Editors
- * @namespace Slick
- */
-
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "Editors": {
-        "Text": TextEditor,
-        "Integer": IntegerEditor,
-        "Float": FloatEditor,
-        "Date": DateEditor,
-        "YesNoSelect": YesNoSelectEditor,
-        "Checkbox": CheckboxEditor,
-        "PercentComplete": PercentCompleteEditor,
-        "LongText": LongTextEditor
-      }
-    }
-  });
-
-  function TextEditor(args) {
-    var $input;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $input = $("<INPUT type=text class='editor-text' />")
-          .appendTo(args.container)
-          .on("keydown.nav", function (e) {
-            if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
-              e.stopImmediatePropagation();
-            }
-          })
-          .focus()
-          .select();
-    };
-
-    this.destroy = function () {
-      $input.remove();
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    this.getValue = function () {
-      return $input.val();
-    };
-
-    this.setValue = function (val) {
-      $input.val(val);
-    };
-
-    this.loadValue = function (item) {
-      defaultValue = item[args.column.field] || "";
-      $input.val(defaultValue);
-      $input[0].defaultValue = defaultValue;
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      return $input.val();
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      if (args.column.validator) {
-        var validationResults = args.column.validator($input.val());
-        if (!validationResults.valid) {
-          return validationResults;
-        }
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  function IntegerEditor(args) {
-    var $input;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $input = $("<INPUT type=text class='editor-text' />");
-
-      $input.on("keydown.nav", function (e) {
-        if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
-          e.stopImmediatePropagation();
-        }
-      });
-
-      $input.appendTo(args.container);
-      $input.focus().select();
-    };
-
-    this.destroy = function () {
-      $input.remove();
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    this.loadValue = function (item) {
-      defaultValue = item[args.column.field];
-      $input.val(defaultValue);
-      $input[0].defaultValue = defaultValue;
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      return parseInt($input.val(), 10) || 0;
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      if (isNaN($input.val())) {
-        return {
-          valid: false,
-          msg: "Please enter a valid integer"
-        };
-      }
-
-      if (args.column.validator) {
-        var validationResults = args.column.validator($input.val());
-        if (!validationResults.valid) {
-          return validationResults;
-        }
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  function FloatEditor(args) {
-    var $input;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $input = $("<INPUT type=text class='editor-text' />");
-
-      $input.on("keydown.nav", function (e) {
-        if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
-          e.stopImmediatePropagation();
-        }
-      });
-
-      $input.appendTo(args.container);
-      $input.focus().select();
-    };
-
-    this.destroy = function () {
-      $input.remove();
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    function getDecimalPlaces() {
-        // returns the number of fixed decimal places or null
-        var rtn = args.column.editorFixedDecimalPlaces;
-        if (typeof rtn == 'undefined') {
-            rtn = FloatEditor.DefaultDecimalPlaces;
-        }
-        return (!rtn && rtn!==0 ? null : rtn);
-    }
-
-    this.loadValue = function (item) {
-      defaultValue = item[args.column.field];
-
-      var decPlaces = getDecimalPlaces();
-      if (decPlaces !== null
-      && (defaultValue || defaultValue===0)
-      && defaultValue.toFixed) {
-        defaultValue = defaultValue.toFixed(decPlaces);
-      }
-
-      $input.val(defaultValue);
-      $input[0].defaultValue = defaultValue;
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      var rtn = parseFloat($input.val()) || 0;
-
-      var decPlaces = getDecimalPlaces();
-      if (decPlaces !== null
-      && (rtn || rtn===0)
-      && rtn.toFixed) {
-        rtn = parseFloat(rtn.toFixed(decPlaces));
-      }
-
-      return rtn;
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      if (isNaN($input.val())) {
-        return {
-          valid: false,
-          msg: "Please enter a valid number"
-        };
-      }
-
-      if (args.column.validator) {
-        var validationResults = args.column.validator($input.val());
-        if (!validationResults.valid) {
-          return validationResults;
-        }
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  FloatEditor.DefaultDecimalPlaces = null;
-
-  function DateEditor(args) {
-    var $input;
-    var defaultValue;
-    var scope = this;
-    var calendarOpen = false;
-
-    this.init = function () {
-      $input = $("<INPUT type=text class='editor-text' />");
-      $input.appendTo(args.container);
-      $input.focus().select();
-      $input.datepicker({
-        showOn: "button",
-        buttonImageOnly: true,
-         beforeShow: function () {
-          calendarOpen = true
-        },
-        onClose: function () {
-          calendarOpen = false
-        }
-      });
-      $input.width($input.width() - 18);
-    };
-
-    this.destroy = function () {
-      $.datepicker.dpDiv.stop(true, true);
-      $input.datepicker("hide");
-      $input.datepicker("destroy");
-      $input.remove();
-    };
-
-    this.show = function () {
-      if (calendarOpen) {
-        $.datepicker.dpDiv.stop(true, true).show();
-      }
-    };
-
-    this.hide = function () {
-      if (calendarOpen) {
-        $.datepicker.dpDiv.stop(true, true).hide();
-      }
-    };
-
-    this.position = function (position) {
-      if (!calendarOpen) {
-        return;
-      }
-      $.datepicker.dpDiv
-          .css("top", position.top + 30)
-          .css("left", position.left);
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    this.loadValue = function (item) {
-      defaultValue = item[args.column.field];
-      $input.val(defaultValue);
-      $input[0].defaultValue = defaultValue;
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      return $input.val();
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      if (args.column.validator) {
-        var validationResults = args.column.validator($input.val());
-        if (!validationResults.valid) {
-          return validationResults;
-        }
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  function YesNoSelectEditor(args) {
-    var $select;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $select = $("<SELECT tabIndex='0' class='editor-yesno'><OPTION value='yes'>Yes</OPTION><OPTION value='no'>No</OPTION></SELECT>");
-      $select.appendTo(args.container);
-      $select.focus();
-    };
-
-    this.destroy = function () {
-      $select.remove();
-    };
-
-    this.focus = function () {
-      $select.focus();
-    };
-
-    this.loadValue = function (item) {
-      $select.val((defaultValue = item[args.column.field]) ? "yes" : "no");
-      $select.select();
-    };
-
-    this.serializeValue = function () {
-      return ($select.val() == "yes");
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return ($select.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  function CheckboxEditor(args) {
-    var $select;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $select = $("<INPUT type=checkbox value='true' class='editor-checkbox' hideFocus>");
-      $select.appendTo(args.container);
-      $select.focus();
-    };
-
-    this.destroy = function () {
-      $select.remove();
-    };
-
-    this.focus = function () {
-      $select.focus();
-    };
-
-    this.loadValue = function (item) {
-      defaultValue = !!item[args.column.field];
-      if (defaultValue) {
-        $select.prop('checked', true);
-      } else {
-        $select.prop('checked', false);
-      }
-    };
-
-    this.preClick = function () {
-        $select.prop('checked', !$select.prop('checked'));
-    };
-
-    this.serializeValue = function () {
-      return $select.prop('checked');
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (this.serializeValue() !== defaultValue);
-    };
-
-    this.validate = function () {
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  function PercentCompleteEditor(args) {
-    var $input, $picker;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      $input = $("<INPUT type=text class='editor-percentcomplete' />");
-      $input.width($(args.container).innerWidth() - 25);
-      $input.appendTo(args.container);
-
-      $picker = $("<div class='editor-percentcomplete-picker' />").appendTo(args.container);
-      $picker.append("<div class='editor-percentcomplete-helper'><div class='editor-percentcomplete-wrapper'><div class='editor-percentcomplete-slider' /><div class='editor-percentcomplete-buttons' /></div></div>");
-
-      $picker.find(".editor-percentcomplete-buttons").append("<button val=0>Not started</button><br/><button val=50>In Progress</button><br/><button val=100>Complete</button>");
-
-      $input.focus().select();
-
-      $picker.find(".editor-percentcomplete-slider").slider({
-        orientation: "vertical",
-        range: "min",
-        value: defaultValue,
-        slide: function (event, ui) {
-          $input.val(ui.value)
-        }
-      });
-
-      $picker.find(".editor-percentcomplete-buttons button").on("click", function (e) {
-        $input.val($(this).attr("val"));
-        $picker.find(".editor-percentcomplete-slider").slider("value", $(this).attr("val"));
-      })
-    };
-
-    this.destroy = function () {
-      $input.remove();
-      $picker.remove();
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    this.loadValue = function (item) {
-      $input.val(defaultValue = item[args.column.field]);
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      return parseInt($input.val(), 10) || 0;
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ((parseInt($input.val(), 10) || 0) != defaultValue);
-    };
-
-    this.validate = function () {
-      if (isNaN(parseInt($input.val(), 10))) {
-        return {
-          valid: false,
-          msg: "Please enter a valid positive number"
-        };
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-
-  /*
-   * An example of a "detached" editor.
-   * The UI is added onto document BODY and .position(), .show() and .hide() are implemented.
-   * KeyDown events are also handled to provide handling for Tab, Shift-Tab, Esc and Ctrl-Enter.
-   */
-  function LongTextEditor(args) {
-    var $input, $wrapper;
-    var defaultValue;
-    var scope = this;
-
-    this.init = function () {
-      var $container = $("body");
-
-      $wrapper = $("<DIV style='z-index:10000;position:absolute;background:white;padding:5px;border:3px solid gray; -moz-border-radius:10px; border-radius:10px;'/>")
-          .appendTo($container);
-
-      $input = $("<TEXTAREA hidefocus rows=5 style='background:white;width:250px;height:80px;border:0;outline:0'>")
-          .appendTo($wrapper);
-
-      $("<DIV style='text-align:right'><BUTTON>Save</BUTTON><BUTTON>Cancel</BUTTON></DIV>")
-          .appendTo($wrapper);
-
-      $wrapper.find("button:first").on("click", this.save);
-      $wrapper.find("button:last").on("click", this.cancel);
-      $input.on("keydown", this.handleKeyDown);
-
-      scope.position(args.position);
-      $input.focus().select();
-    };
-
-    this.handleKeyDown = function (e) {
-      if (e.which == $.ui.keyCode.ENTER && e.ctrlKey) {
-        scope.save();
-      } else if (e.which == $.ui.keyCode.ESCAPE) {
-        e.preventDefault();
-        scope.cancel();
-      } else if (e.which == $.ui.keyCode.TAB && e.shiftKey) {
-        e.preventDefault();
-        args.grid.navigatePrev();
-      } else if (e.which == $.ui.keyCode.TAB) {
-        e.preventDefault();
-        args.grid.navigateNext();
-      }
-    };
-
-    this.save = function () {
-      args.commitChanges();
-    };
-
-    this.cancel = function () {
-      $input.val(defaultValue);
-      args.cancelChanges();
-    };
-
-    this.hide = function () {
-      $wrapper.hide();
-    };
-
-    this.show = function () {
-      $wrapper.show();
-    };
-
-    this.position = function (position) {
-      $wrapper
-          .css("top", position.top - 5)
-          .css("left", position.left - 5)
-    };
-
-    this.destroy = function () {
-      $wrapper.remove();
-    };
-
-    this.focus = function () {
-      $input.focus();
-    };
-
-    this.loadValue = function (item) {
-      $input.val(defaultValue = item[args.column.field]);
-      $input.select();
-    };
-
-    this.serializeValue = function () {
-      return $input.val();
-    };
-
-    this.applyValue = function (item, state) {
-      item[args.column.field] = state;
-    };
-
-    this.isValueChanged = function () {
-      return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
-    };
-
-    this.validate = function () {
-      if (args.column.validator) {
-        var validationResults = args.column.validator($input.val());
-        if (!validationResults.valid) {
-          return validationResults;
-        }
-      }
-
-      return {
-        valid: true,
-        msg: null
-      };
-    };
-
-    this.init();
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.formatters.js b/web/pgadmin/static/vendor/slickgrid/slick.formatters.js
deleted file mode 100644
index 62bb8870..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.formatters.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/***
- * Contains basic SlickGrid formatters.
- * 
- * NOTE:  These are merely examples.  You will most likely need to implement something more
- *        robust/extensible/localizable/etc. for your use!
- * 
- * @module Formatters
- * @namespace Slick
- */
-
-(function ($) {
-  // register namespace
-  $.extend(true, window, {
-    "Slick": {
-      "Formatters": {
-        "PercentComplete": PercentCompleteFormatter,
-        "PercentCompleteBar": PercentCompleteBarFormatter,
-        "YesNo": YesNoFormatter,
-        "Checkmark": CheckmarkFormatter,
-        "Checkbox": CheckboxFormatter
-
-      }
-    }
-  });
-
-  function PercentCompleteFormatter(row, cell, value, columnDef, dataContext) {
-    if (value == null || value === "") {
-      return "-";
-    } else if (value < 50) {
-      return "<span style='color:red;font-weight:bold;'>" + value + "%</span>";
-    } else {
-      return "<span style='color:green'>" + value + "%</span>";
-    }
-  }
-
-  function PercentCompleteBarFormatter(row, cell, value, columnDef, dataContext) {
-    if (value == null || value === "") {
-      return "";
-    }
-
-    var color;
-
-    if (value < 30) {
-      color = "red";
-    } else if (value < 70) {
-      color = "silver";
-    } else {
-      color = "green";
-    }
-
-    return "<span class='percent-complete-bar' style='background:" + color + ";width:" + value + "%'></span>";
-  }
-
-  function YesNoFormatter(row, cell, value, columnDef, dataContext) {
-    return value ? "Yes" : "No";
-  }
-
-  function CheckboxFormatter(row, cell, value, columnDef, dataContext) {
-    return '<img class="slick-edit-preclick" src="../images/' + (value ? "CheckboxY" : "CheckboxN") + '.png">';
-  }
-
-  function CheckmarkFormatter(row, cell, value, columnDef, dataContext) {
-    return value ? "<img src='../images/tick.png'>" : "";
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.grid.css b/web/pgadmin/static/vendor/slickgrid/slick.grid.css
deleted file mode 100644
index ce085eff..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.grid.css
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
-IMPORTANT:
-In order to preserve the uniform grid appearance, all cell styles need to have padding, margin and border sizes.
-No built-in (selected, editable, highlight, flashing, invalid, loading, :focus) or user-specified CSS
-classes should alter those!
-*/
-
-.slick-header.ui-state-default, .slick-headerrow.ui-state-default, .slick-footerrow.ui-state-default  {
-  width: 100%;
-  overflow: hidden;
-  border-left: 0px !important;
-}
-
-.slick-header-columns, .slick-headerrow-columns, .slick-footerrow-columns {
-  position: relative;
-  white-space: nowrap;
-  cursor: default;
-  overflow: hidden;
-}
-
-.slick-header-column.ui-state-default {
-  position: relative;
-  display: inline-block;
- /*box-sizing: content-box !important; use this for Firefox! */ 
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-  text-overflow: ellipsis;
-  height: 16px;
-  line-height: 16px;
-  margin: 0;
-  padding: 4px;
-  border-right: 1px solid silver;
-  border-left: 0px !important;
-  border-top: 0px !important;
-  border-bottom: 0px !important;
-  float: left;
-}
-
-.slick-headerrow-column.ui-state-default, .slick-footerrow-column.ui-state-default {
-  padding: 4px;
-}
-
-.slick-header-column-sorted {
-  font-style: italic;
-}
-
-.slick-sort-indicator {
-  display: inline-block;
-  width: 8px;
-  height: 5px;
-  margin-left: 4px;
-  margin-top: 6px;
-  float: left;
-}
-
-.slick-sort-indicator-numbered {
-  display: inline-block;
-  width: 8px;
-  height: 5px;
-  margin-left: 4px;
-  margin-top: 0;
-  padding-left: 1px;
-  line-height: 20px;
-  float: left;
-  font-family: Arial;
-  font-style: normal;
-  font-weight: bold;
-  color: #6190CD;
-}
-
-.slick-sort-indicator-desc {
-  background: url(images/sort-desc.gif);
-}
-
-.slick-sort-indicator-asc {
-  background: url(images/sort-asc.gif);
-}
-
-.slick-resizable-handle {
-  position: absolute;
-  font-size: 0.1px;
-  display: block;
-  cursor: col-resize;
-  width: 4px;
-  right: 0px;
-  top: 0;
-  height: 100%;
-}
-
-.slick-sortable-placeholder {
-  background: silver;
-}
-
-.grid-canvas {
-  position: relative;
-  outline: 0;
-}
-
-.slick-row.ui-widget-content, .slick-row.ui-state-active {
-  position: absolute;
-  border: 0px;
-  width: 100%;
-}
-
-.slick-cell, .slick-headerrow-column , .slick-footerrow-column{
-  position: absolute;
-  border: 1px solid transparent;
-  border-right: 1px dotted silver;
-  border-bottom-color: silver;
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-  text-overflow: ellipsis;
-  vertical-align: middle;
-  z-index: 1;
-  padding: 1px 2px 2px 1px;
-  margin: 0;
-  white-space: nowrap;
-  cursor: default;
-}
-.slick-cell, .slick-headerrow-column{
-  border-bottom-color: silver;
-}
-.slick-footerrow-column {
-  border-top-color: silver;
-}
- 
-.slick-group {
-}
-
-.slick-group-toggle {
-  display: inline-block;
-}
-
-.slick-cell.highlighted {
-  background: lightskyblue;
-  background: rgba(0, 0, 255, 0.2);
-  -webkit-transition: all 0.5s;
-  -moz-transition: all 0.5s;
-  -o-transition: all 0.5s;
-  transition: all 0.5s;
-}
-
-.slick-cell.flashing {
-  border: 1px solid red !important;
-}
-
-.slick-cell.editable {
-  z-index: 11;
-  overflow: visible;
-  background: white;
-  border-color: black;
-  border-style: solid;
-}
-
-.slick-cell:focus {
-  outline: none;
-}
-
-.slick-reorder-proxy {
-  display: inline-block;
-  background: blue;
-  opacity: 0.15;
-  filter: alpha(opacity = 15);
-  cursor: move;
-}
-
-.slick-reorder-guide {
-  display: inline-block;
-  height: 2px;
-  background: blue;
-  opacity: 0.7;
-  filter: alpha(opacity = 70);
-}
-
-.slick-selection {
-  z-index: 10;
-  position: absolute;
-  border: 2px dashed black;
-}
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.grid.js b/web/pgadmin/static/vendor/slickgrid/slick.grid.js
deleted file mode 100644
index 778eeff6..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.grid.js
+++ /dev/null
@@ -1,3813 +0,0 @@
-/**
- * @license
- * (c) 2009-2016 Michael Leibman
- * michael{dot}leibman{at}gmail{dot}com
- * http://github.com/mleibman/slickgrid
- *
- * Distributed under MIT license.
- * All rights reserved.
- *
- * SlickGrid v2.3
- *
- * NOTES:
- *     Cell/row DOM manipulations are done directly bypassing jQuery's DOM manipulation methods.
- *     This increases the speed dramatically, but can only be done safely because there are no event handlers
- *     or data associated with any cell/row DOM nodes.  Cell editors must make sure they implement .destroy()
- *     and do proper cleanup.
- */
-
-// make sure required JavaScript modules are loaded
-if (typeof jQuery === "undefined") {
-  throw new Error("SlickGrid requires jquery module to be loaded");
-}
-if (!jQuery.fn.drag) {
-  throw new Error("SlickGrid requires jquery.event.drag module to be loaded");
-}
-if (typeof Slick === "undefined") {
-  throw new Error("slick.core.js not loaded");
-}
-
-
-(function ($) {
-  // Slick.Grid
-  $.extend(true, window, {
-    Slick: {
-      Grid: SlickGrid
-    }
-  });
-
-  // shared across all grids on the page
-  var scrollbarDimensions;
-  var maxSupportedCssHeight;  // browser's breaking point
-
-  //////////////////////////////////////////////////////////////////////////////////////////////
-  // SlickGrid class implementation (available as Slick.Grid)
-
-  /**
-   * Creates a new instance of the grid.
-   * @class SlickGrid
-   * @constructor
-   * @param {Node}              container   Container node to create the grid in.
-   * @param {Array,Object}      data        An array of objects for databinding.
-   * @param {Array}             columns     An array of column definitions.
-   * @param {Object}            options     Grid options.
-   **/
-  function SlickGrid(container, data, columns, options) {
-    // settings
-    var defaults = {
-      explicitInitialization: false,
-      rowHeight: 25,
-      defaultColumnWidth: 80,
-      enableAddRow: false,
-      leaveSpaceForNewRows: false,
-      editable: false,
-      autoEdit: true,
-      enableCellNavigation: true,
-      enableColumnReorder: true,
-      asyncEditorLoading: false,
-      asyncEditorLoadDelay: 100,
-      forceFitColumns: false,
-      enableAsyncPostRender: false,
-      asyncPostRenderDelay: 50,
-      enableAsyncPostRenderCleanup: false,
-      asyncPostRenderCleanupDelay: 40,
-      autoHeight: false,
-      editorLock: Slick.GlobalEditorLock,
-      showHeaderRow: false,
-      headerRowHeight: 25,
-      createFooterRow: false,
-      showFooterRow: false,
-      footerRowHeight: 25,
-      showTopPanel: false,
-      topPanelHeight: 25,
-      formatterFactory: null,
-      editorFactory: null,
-      cellFlashingCssClass: "flashing",
-      selectedCellCssClass: "selected",
-      multiSelect: true,
-      enableTextSelectionOnCells: false,
-      dataItemColumnValueExtractor: null,
-      fullWidthRows: false,
-      multiColumnSort: false,
-      numberedMultiColumnSort: false,
-      tristateMultiColumnSort: false,
-      defaultFormatter: defaultFormatter,
-      forceSyncScrolling: false,
-      addNewRowCssClass: "new-row",
-      preserveCopiedSelectionOnPaste: false
-    };
-
-    var columnDefaults = {
-      name: "",
-      resizable: true,
-      sortable: false,
-      minWidth: 30,
-      rerenderOnResize: false,
-      headerCssClass: null,
-      defaultSortAsc: true,
-      focusable: true,
-      selectable: true
-    };
-
-    // scroller
-    var th;   // virtual height
-    var h;    // real scrollable height
-    var ph;   // page height
-    var n;    // number of pages
-    var cj;   // "jumpiness" coefficient
-
-    var page = 0;       // current page
-    var offset = 0;     // current page offset
-    var vScrollDir = 1;
-
-    // private
-    var initialized = false;
-    var $container;
-    var uid = "slickgrid_" + Math.round(1000000 * Math.random());
-    var self = this;
-    var $focusSink, $focusSink2;
-    var $headerScroller;
-    var $headers;
-    var $headerRow, $headerRowScroller, $headerRowSpacer;
-    var $footerRow, $footerRowScroller, $footerRowSpacer;
-    var $topPanelScroller;
-    var $topPanel;
-    var $viewport;
-    var $canvas;
-    var $style;
-    var $boundAncestors;
-    var stylesheet, columnCssRulesL, columnCssRulesR;
-    var viewportH, viewportW;
-    var canvasWidth;
-    var viewportHasHScroll, viewportHasVScroll;
-    var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding
-        cellWidthDiff = 0, cellHeightDiff = 0, jQueryNewWidthBehaviour = false;
-    var absoluteColumnMinWidth;
-    var sortIndicatorCssClass = "slick-sort-indicator";
-    
-    var tabbingDirection = 1;
-    var activePosX;
-    var activeRow, activeCell;
-    var activeCellNode = null;
-    var currentEditor = null;
-    var serializedEditorValue;
-    var editController;
-
-    var rowsCache = {};
-    var renderedRows = 0;
-    var numVisibleRows;
-    var prevScrollTop = 0;
-    var scrollTop = 0;
-    var lastRenderedScrollTop = 0;
-    var lastRenderedScrollLeft = 0;
-    var prevScrollLeft = 0;
-    var scrollLeft = 0;
-
-    var selectionModel;
-    var selectedRows = [];
-
-    var plugins = [];
-    var cellCssClasses = {};
-
-    var columnsById = {};
-    var sortColumns = [];
-    var columnPosLeft = [];
-    var columnPosRight = [];
-
-    var pagingActive = false;
-    var pagingIsLastPage = false;
-    
-    // async call handles
-    var h_editorLoader = null;
-    var h_render = null;
-    var h_postrender = null;
-    var h_postrenderCleanup = null;
-    var postProcessedRows = {};
-    var postProcessToRow = null;
-    var postProcessFromRow = null;
-    var postProcessedCleanupQueue = [];
-    var postProcessgroupId = 0;
-
-    // perf counters
-    var counter_rows_rendered = 0;
-    var counter_rows_removed = 0;
-
-    // These two variables work around a bug with inertial scrolling in Webkit/Blink on Mac.
-    // See http://crbug.com/312427.
-    var rowNodeFromLastMouseWheelEvent;  // this node must not be deleted while inertial scrolling
-    var zombieRowNodeFromLastMouseWheelEvent;  // node that was hidden instead of getting deleted
-    var zombieRowCacheFromLastMouseWheelEvent;  // row cache for above node
-    var zombieRowPostProcessedFromLastMouseWheelEvent;  // post processing references for above node
-
-    // store css attributes if display:none is active in container or parent
-    var cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' };
-    var $hiddenParents;
-    var oldProps = [];
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Initialization
-
-    function init() {
-      if (container instanceof jQuery) { 
-        $container = container; 
-      } else { 
-        $container = $(container); 
-      }
-      if ($container.length < 1) {
-        throw new Error("SlickGrid requires a valid container, " + container + " does not exist in the DOM.");
-      }
-
-      cacheCssForHiddenInit();
-
-      // calculate these only once and share between grid instances
-      maxSupportedCssHeight = maxSupportedCssHeight || getMaxSupportedCssHeight();
-      scrollbarDimensions = scrollbarDimensions || measureScrollbar();
-
-      options = $.extend({}, defaults, options);
-      validateAndEnforceOptions();
-      columnDefaults.width = options.defaultColumnWidth;
-
-      columnsById = {};
-      for (var i = 0; i < columns.length; i++) {
-        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);
-        columnsById[m.id] = i;
-        if (m.minWidth && m.width < m.minWidth) {
-          m.width = m.minWidth;
-        }
-        if (m.maxWidth && m.width > m.maxWidth) {
-          m.width = m.maxWidth;
-        }
-      }
-
-      // validate loaded JavaScript modules against requested options
-      if (options.enableColumnReorder && !$.fn.sortable) {
-        throw new Error("SlickGrid's 'enableColumnReorder = true' option requires jquery-ui.sortable module to be loaded");
-      }
-
-      editController = {
-        "commitCurrentEdit": commitCurrentEdit,
-        "cancelCurrentEdit": cancelCurrentEdit
-      };
-
-      $container
-          .empty()
-          .css("overflow", "hidden")
-          .css("outline", 0)
-          .addClass(uid)
-          .addClass("ui-widget");
-
-      // set up a positioning container if needed
-      if (!/relative|absolute|fixed/.test($container.css("position"))) {
-        $container.css("position", "relative");
-      }
-
-      $focusSink = $("<div tabIndex='0' hideFocus style='position:fixed;width:0;height:0;top:0;left:0;outline:0;'></div>").appendTo($container);
-
-      $headerScroller = $("<div class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container);
-      $headers = $("<div class='slick-header-columns' style='left:-1000px' />").appendTo($headerScroller);
-      $headers.width(getHeadersWidth());
-
-      $headerRowScroller = $("<div class='slick-headerrow ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container);
-      $headerRow = $("<div class='slick-headerrow-columns' />").appendTo($headerRowScroller);
-      $headerRowSpacer = $("<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>")
-          .css("width", getCanvasWidth() + scrollbarDimensions.width + "px")
-          .appendTo($headerRowScroller);
-
-      $topPanelScroller = $("<div class='slick-top-panel-scroller ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container);
-      $topPanel = $("<div class='slick-top-panel' style='width:10000px' />").appendTo($topPanelScroller);
-
-      if (!options.showTopPanel) {
-        $topPanelScroller.hide();
-      }
-
-      if (!options.showHeaderRow) {
-        $headerRowScroller.hide();
-      }
-
-      $viewport = $("<div class='slick-viewport' style='width:100%;overflow:auto;outline:0;position:relative;;'>").appendTo($container);
-      $viewport.css("overflow-y", options.autoHeight ? "hidden" : "auto");
-
-      $canvas = $("<div class='grid-canvas' />").appendTo($viewport);
-
-      if (options.createFooterRow) {
-        $footerRowScroller = $("<div class='slick-footerrow ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container);
-        $footerRow = $("<div class='slick-footerrow-columns' />").appendTo($footerRowScroller);
-        $footerRowSpacer = $("<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>")
-            .css("width", getCanvasWidth() + scrollbarDimensions.width + "px")
-            .appendTo($footerRowScroller);
-
-        if (!options.showFooterRow) {
-          $footerRowScroller.hide();
-        }
-      }
-
-      if (options.numberedMultiColumnSort) { sortIndicatorCssClass = "slick-sort-indicator-numbered"; }
-
-      $focusSink2 = $focusSink.clone().appendTo($container);
-
-      if (!options.explicitInitialization) {
-        finishInitialization();
-      }
-    }
-
-    function finishInitialization() {
-      if (!initialized) {
-        initialized = true;
-
-        viewportW = parseFloat($.css($container[0], "width", true));
-
-        // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)
-        // calculate the diff so we can set consistent sizes
-        measureCellPaddingAndBorder();
-
-        // for usability reasons, all text selection in SlickGrid is disabled
-        // with the exception of input and textarea elements (selection must
-        // be enabled there so that editors work as expected); note that
-        // selection in grid cells (grid body) is already unavailable in
-        // all browsers except IE
-        disableSelection($headers); // disable all text selection in header (including input and textarea)
-
-        if (!options.enableTextSelectionOnCells) {
-          // disable text selection in grid cells except in input and textarea elements
-          // (this is IE-specific, because selectstart event will only fire in IE)
-          $viewport.on("selectstart.ui", function (event) {
-            return $(event.target).is("input,textarea");
-          });
-        }
-
-        updateColumnCaches();
-        createColumnHeaders();
-        setupColumnSort();
-        createCssRules();
-        resizeCanvas();
-        bindAncestorScrollEvents();
-
-        $container
-            .on("resize.slickgrid", resizeCanvas);
-        $viewport
-            //.on("click", handleClick)
-            .on("scroll", handleScroll);
-        $headerScroller
-            .on("contextmenu", handleHeaderContextMenu)
-            .on("click", handleHeaderClick)
-            .on("mouseenter", ".slick-header-column", handleHeaderMouseEnter)
-            .on("mouseleave", ".slick-header-column", handleHeaderMouseLeave);
-        $headerRowScroller
-            .on("scroll", handleHeaderRowScroll);
-
-        if (options.createFooterRow) {
-          $footerRowScroller
-              .on("scroll", handleFooterRowScroll);
-        }
-
-        $focusSink.add($focusSink2)
-            .on("keydown", handleKeyDown);
-        $canvas
-            .on("keydown", handleKeyDown)
-            .on("click", handleClick)
-            .on("dblclick", handleDblClick)
-            .on("contextmenu", handleContextMenu)
-            .on("draginit", handleDragInit)
-            .on("dragstart", {distance: 3}, handleDragStart)
-            .on("drag", handleDrag)
-            .on("dragend", handleDragEnd)
-            .on("mouseenter", ".slick-cell", handleMouseEnter)
-            .on("mouseleave", ".slick-cell", handleMouseLeave);
-
-        // Work around http://crbug.com/312427.
-        if (navigator.userAgent.toLowerCase().match(/webkit/) &&
-            navigator.userAgent.toLowerCase().match(/macintosh/)) {
-          $canvas.on("mousewheel", handleMouseWheel);
-        }
-        restoreCssFromHiddenInit();
-      }
-    }
-
-    function cacheCssForHiddenInit() {
-      // handle display:none on container or container parents
-      $hiddenParents = $container.parents().addBack().not(':visible');
-      $hiddenParents.each(function() {
-        var old = {};
-        for ( var name in cssShow ) {
-          old[ name ] = this.style[ name ];
-          this.style[ name ] = cssShow[ name ];
-        }
-        oldProps.push(old);
-      });
-    }
-
-    function restoreCssFromHiddenInit() {
-      // finish handle display:none on container or container parents
-      // - put values back the way they were
-      $hiddenParents.each(function(i) {
-        var old = oldProps[i];
-        for ( var name in cssShow ) {
-          this.style[ name ] = old[ name ];
-        }
-      });
-    }
-
-    function registerPlugin(plugin) {
-      plugins.unshift(plugin);
-      plugin.init(self);
-    }
-
-    function unregisterPlugin(plugin) {
-      for (var i = plugins.length; i >= 0; i--) {
-        if (plugins[i] === plugin) {
-          if (plugins[i].destroy) {
-            plugins[i].destroy();
-          }
-          plugins.splice(i, 1);
-          break;
-        }
-      }
-    }
-
-    function setSelectionModel(model) {
-      if (selectionModel) {
-        selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);
-        if (selectionModel.destroy) {
-          selectionModel.destroy();
-        }
-      }
-
-      selectionModel = model;
-      if (selectionModel) {
-        selectionModel.init(self);
-        selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);
-      }
-    }
-
-    function getSelectionModel() {
-      return selectionModel;
-    }
-
-    function getCanvasNode() {
-      return $canvas[0];
-    }
-
-    function measureScrollbar() {
-      var $c = $("<div style='position:absolute; top:-10000px; left:-10000px; width:100px; height:100px; overflow:scroll;'></div>").appendTo("body");
-      var dim = {
-        width: $c.width() - $c[0].clientWidth,
-        height: $c.height() - $c[0].clientHeight
-      };
-      $c.remove();
-      return dim;
-    }
-
-    function getColumnTotalWidth(includeScrollbar) {
-      var totalWidth = 0;
-      for (var i = 0, ii = columns.length; i < ii; i++) {
-        var width = columns[i].width;
-        totalWidth += width;
-      }
-      if (includeScrollbar) {
-        totalWidth += scrollbarDimensions.width;
-      }
-      return totalWidth;
-    }
-
-    function getHeadersWidth() {
-      var headersWidth = getColumnTotalWidth(true);
-      return Math.max(headersWidth, viewportW) + 1000;
-    }
-
-    function getCanvasWidth() {
-      var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;
-      var rowWidth = 0;
-      var i = columns.length;
-      while (i--) {
-        rowWidth += columns[i].width;
-      }
-      return options.fullWidthRows ? Math.max(rowWidth, availableWidth) : rowWidth;
-    }
-
-    function updateCanvasWidth(forceColumnWidthsUpdate) {
-      var oldCanvasWidth = canvasWidth;
-      canvasWidth = getCanvasWidth();
-
-      if (canvasWidth != oldCanvasWidth) {
-        $canvas.width(canvasWidth);
-        $headerRow.width(canvasWidth);
-        if (options.createFooterRow) { $footerRow.width(canvasWidth); }
-        $headers.width(getHeadersWidth());
-        viewportHasHScroll = (canvasWidth > viewportW - scrollbarDimensions.width);
-      }
-
-       var w=canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0);
-       $headerRowSpacer.width(w);
-       if (options.createFooterRow) { $footerRowSpacer.width(w); }
-
-      if (canvasWidth != oldCanvasWidth || forceColumnWidthsUpdate) {
-        applyColumnWidths();
-      }
-    }
-
-    function disableSelection($target) {
-      if ($target && $target.jquery) {
-        $target
-            .attr("unselectable", "on")
-            .css("MozUserSelect", "none")
-            .on("selectstart.ui", function () {
-              return false;
-            }); // from jquery:ui.core.js 1.7.2
-      }
-    }
-
-    function getMaxSupportedCssHeight() {
-      var supportedHeight = 1000000;
-      // FF reports the height back but still renders blank after ~6M px
-      var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;
-      var div = $("<div style='display:none' />").appendTo(document.body);
-
-      while (true) {
-        var test = supportedHeight * 2;
-        div.css("height", test);
-        if (test > testUpTo || div.height() !== test) {
-          break;
-        } else {
-          supportedHeight = test;
-        }
-      }
-
-      div.remove();
-      return supportedHeight;
-    }
-
-    // TODO:  this is static.  need to handle page mutation.
-    function bindAncestorScrollEvents() {
-      var elem = $canvas[0];
-      while ((elem = elem.parentNode) != document.body && elem != null) {
-        // bind to scroll containers only
-        if (elem == $viewport[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {
-          var $elem = $(elem);
-          if (!$boundAncestors) {
-            $boundAncestors = $elem;
-          } else {
-            $boundAncestors = $boundAncestors.add($elem);
-          }
-          $elem.on("scroll." + uid, handleActiveCellPositionChange);
-        }
-      }
-    }
-
-    function unbindAncestorScrollEvents() {
-      if (!$boundAncestors) {
-        return;
-      }
-      $boundAncestors.off("scroll." + uid);
-      $boundAncestors = null;
-    }
-
-    function updateColumnHeader(columnId, title, toolTip) {
-      if (!initialized) { return; }
-      var idx = getColumnIndex(columnId);
-      if (idx == null) {
-        return;
-      }
-
-      var columnDef = columns[idx];
-      var $header = $headers.children().eq(idx);
-      if ($header) {
-        if (title !== undefined) {
-          columns[idx].name = title;
-        }
-        if (toolTip !== undefined) {
-          columns[idx].toolTip = toolTip;
-        }
-
-        trigger(self.onBeforeHeaderCellDestroy, {
-          "node": $header[0],
-          "column": columnDef,
-          "grid": self
-        });
-
-        $header
-            .attr("title", toolTip || "")
-            .children().eq(0).html(title);
-
-        trigger(self.onHeaderCellRendered, {
-          "node": $header[0],
-          "column": columnDef,
-          "grid": self
-        });
-      }
-    }
-
-    function getHeaderRow() {
-      return $headerRow[0];
-    }
-
-    function getFooterRow() {
-      return $footerRow[0];
-    }
-
-    function getHeaderRowColumn(columnId) {
-      var idx = getColumnIndex(columnId);
-      var $header = $headerRow.children().eq(idx);
-      return $header && $header[0];
-    }
-
-    function getFooterRowColumn(columnId) {
-      var idx = getColumnIndex(columnId);
-      var $footer = $footerRow.children().eq(idx);
-      return $footer && $footer[0];
-    }
-
-    function createColumnHeaders() {
-      function onMouseEnter() {
-        $(this).addClass("ui-state-hover");
-      }
-
-      function onMouseLeave() {
-        $(this).removeClass("ui-state-hover");
-      }
-
-      $headers.find(".slick-header-column")
-        .each(function() {
-          var columnDef = $(this).data("column");
-          if (columnDef) {
-            trigger(self.onBeforeHeaderCellDestroy, {
-              "node": this,
-              "column": columnDef,
-              "grid": self
-            });
-          }
-        });
-      $headers.empty();
-      $headers.width(getHeadersWidth());
-
-      $headerRow.find(".slick-headerrow-column")
-        .each(function() {
-          var columnDef = $(this).data("column");
-          if (columnDef) {
-            trigger(self.onBeforeHeaderRowCellDestroy, {
-              "node": this,
-              "column": columnDef,
-              "grid": self
-            });
-          }
-        });
-      $headerRow.empty();
-
-      if (options.createFooterRow) {
-        $footerRow.find(".slick-footerrow-column")
-          .each(function() {
-            var columnDef = $(this).data("column");
-            if (columnDef) {
-              trigger(self.onBeforeFooterRowCellDestroy, {
-                "node": this,
-                "column": columnDef
-              });
-            }
-          });
-        $footerRow.empty();
-      }
-
-      for (var i = 0; i < columns.length; i++) {
-        var m = columns[i];
-
-        var header = $("<div class='ui-state-default slick-header-column' />")
-            .html("<span class='slick-column-name'>" + m.name + "</span>")
-            .width(m.width - headerColumnWidthDiff)
-            .attr("id", "" + uid + m.id)
-            .attr("title", m.toolTip || "")
-            .data("column", m)
-            .addClass(m.headerCssClass || "")
-            .appendTo($headers);
-
-        if (options.enableColumnReorder || m.sortable) {
-          header
-            .on('mouseenter', onMouseEnter)
-            .on('mouseleave', onMouseLeave);
-        }
-
-        if (m.sortable) {
-          header.addClass("slick-header-sortable");
-          header.append("<span class='" + sortIndicatorCssClass + "' />");
-        }
-
-        trigger(self.onHeaderCellRendered, {
-          "node": header[0],
-          "column": m,
-          "grid": self
-        });
-
-        if (options.showHeaderRow) {
-          var headerRowCell = $("<div class='ui-state-default slick-headerrow-column l" + i + " r" + i + "'></div>")
-              .data("column", m)
-              .appendTo($headerRow);
-
-          trigger(self.onHeaderRowCellRendered, {
-            "node": headerRowCell[0],
-            "column": m,
-            "grid": self
-          });
-        }
-        if (options.createFooterRow && options.showFooterRow) {
-          var footerRowCell = $("<div class='ui-state-default slick-footerrow-column l" + i   + " r" + i + "'></div>")
-              .data("column", m)
-              .appendTo($footerRow);
-
-          trigger(self.onFooterRowCellRendered, {
-            "node": footerRowCell[0],
-            "column": m
-          });
-        }
-      }
-
-      setSortColumns(sortColumns);
-      setupColumnResize();
-      if (options.enableColumnReorder) {
-        if (typeof options.enableColumnReorder == 'function') {
-            options.enableColumnReorder(self, $headers, headerColumnWidthDiff, setColumns, setupColumnResize, columns, getColumnIndex, uid, trigger);
-        } else {
-            setupColumnReorder();
-        }
-      }
-    }
-    
-    function setupColumnSort() {
-      $headers.click(function (e) {
-        // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)
-        e.metaKey = e.metaKey || e.ctrlKey;
-
-        if ($(e.target).hasClass("slick-resizable-handle")) {
-          return;
-        }
-
-        var $col = $(e.target).closest(".slick-header-column");
-        if (!$col.length) {
-          return;
-        }
-
-        var column = $col.data("column");
-        if (column.sortable) {
-          if (!getEditorLock().commitCurrentEdit()) {
-            return;
-          }
-
-          var sortColumn = null;
-          var i = 0;
-          for (; i < sortColumns.length; i++) {
-            if (sortColumns[i].columnId == column.id) {
-              sortColumn = sortColumns[i];
-              sortColumn.sortAsc = !sortColumn.sortAsc;
-              break;
-            }
-          }
-          var hadSortCol = !!sortColumn;
-          
-          if (options.tristateMultiColumnSort) {
-              if (!sortColumn) { 
-                sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc }; 
-              }
-              if (hadSortCol && sortColumn.sortAsc) {
-                // three state: remove sort rather than go back to ASC
-                sortColumns.splice(i, 1);
-                sortColumn = null;
-              }
-              if (!options.multiColumnSort) { sortColumns = []; }
-              if (sortColumn && (!hadSortCol || !options.multiColumnSort)) { 
-                sortColumns.push(sortColumn); 
-              }
-          } else {
-              // legacy behaviour
-              if (e.metaKey && options.multiColumnSort) {
-                if (sortColumn) {
-                  sortColumns.splice(i, 1);
-                }
-              }
-              else {
-                if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
-                  sortColumns = [];
-                }
-
-                if (!sortColumn) {
-                  sortColumn = { columnId: column.id, sortAsc: column.defaultSortAsc };
-                  sortColumns.push(sortColumn);
-                } else if (sortColumns.length == 0) {
-                  sortColumns.push(sortColumn);
-                }
-              }              
-          }
-          
-          setSortColumns(sortColumns);
-
-          if (sortColumns.length > 0) { 
-              if (!options.multiColumnSort) {
-                trigger(self.onSort, {
-                  multiColumnSort: false,
-                  sortCol: column,
-                  sortAsc: sortColumns[0].sortAsc,
-                  grid: self}, e);
-              } else {
-                trigger(self.onSort, {
-                  multiColumnSort: true,
-                  sortCols: $.map(sortColumns, function(col) {
-                    return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };
-                  }),
-                  grid: self}, e);
-              }
-          }
-        }
-      });
-    }
-
-    function setupColumnReorder() {
-      $headers.filter(":ui-sortable").sortable("destroy");
-      $headers.sortable({
-        containment: "parent",
-        distance: 3,
-        axis: "x",
-        cursor: "default",
-        tolerance: "intersection",
-        helper: "clone",
-        placeholder: "slick-sortable-placeholder ui-state-default slick-header-column",
-        start: function (e, ui) {
-          ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);
-          $(ui.helper).addClass("slick-header-column-active");
-        },
-        beforeStop: function (e, ui) {
-          $(ui.helper).removeClass("slick-header-column-active");
-        },
-        stop: function (e) {
-          if (!getEditorLock().commitCurrentEdit()) {
-            $(this).sortable("cancel");
-            return;
-          }
-
-          var reorderedIds = $headers.sortable("toArray");
-          var reorderedColumns = [];
-          for (var i = 0; i < reorderedIds.length; i++) {
-            reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, ""))]);
-          }
-          setColumns(reorderedColumns);
-
-          trigger(self.onColumnsReordered, {grid: self});
-          e.stopPropagation();
-          setupColumnResize();
-        }
-      });
-    }
-
-    function setupColumnResize() {
-      var $col, j, c, pageX, columnElements, minPageX, maxPageX, firstResizable, lastResizable;
-      columnElements = $headers.children();
-      columnElements.find(".slick-resizable-handle").remove();
-      columnElements.each(function (i, e) {
-        if (i >= columns.length) { return; }
-        if (columns[i].resizable) {
-          if (firstResizable === undefined) {
-            firstResizable = i;
-          }
-          lastResizable = i;
-        }
-      });
-      if (firstResizable === undefined) {
-        return;
-      }
-      columnElements.each(function (i, e) {
-        if (i >= columns.length) { return; }
-        if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {
-          return;
-        }
-        $col = $(e);
-        $("<div class='slick-resizable-handle' />")
-            .appendTo(e)
-            .on("dragstart", function (e, dd) {
-              if (!getEditorLock().commitCurrentEdit()) {
-                return false;
-              }
-              pageX = e.pageX;
-              $(this).parent().addClass("slick-header-column-active");
-              var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;
-              // lock each column's width option to current width
-              columnElements.each(function (i, e) {
-                if (i >= columns.length) { return; }
-                columns[i].previousWidth = $(e).outerWidth();
-              });
-              if (options.forceFitColumns) {
-                shrinkLeewayOnRight = 0;
-                stretchLeewayOnRight = 0;
-                // colums on right affect maxPageX/minPageX
-                for (j = i + 1; j < columns.length; j++) {
-                  c = columns[j];
-                  if (c.resizable) {
-                    if (stretchLeewayOnRight !== null) {
-                      if (c.maxWidth) {
-                        stretchLeewayOnRight += c.maxWidth - c.previousWidth;
-                      } else {
-                        stretchLeewayOnRight = null;
-                      }
-                    }
-                    shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);
-                  }
-                }
-              }
-              var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;
-              for (j = 0; j <= i; j++) {
-                // columns on left only affect minPageX
-                c = columns[j];
-                if (c.resizable) {
-                  if (stretchLeewayOnLeft !== null) {
-                    if (c.maxWidth) {
-                      stretchLeewayOnLeft += c.maxWidth - c.previousWidth;
-                    } else {
-                      stretchLeewayOnLeft = null;
-                    }
-                  }
-                  shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);
-                }
-              }
-              if (shrinkLeewayOnRight === null) {
-                shrinkLeewayOnRight = 100000;
-              }
-              if (shrinkLeewayOnLeft === null) {
-                shrinkLeewayOnLeft = 100000;
-              }
-              if (stretchLeewayOnRight === null) {
-                stretchLeewayOnRight = 100000;
-              }
-              if (stretchLeewayOnLeft === null) {
-                stretchLeewayOnLeft = 100000;
-              }
-              maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);
-              minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);
-            })
-            .on("drag", function (e, dd) {
-              var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;
-              if (d < 0) { // shrink column
-                x = d;
-                for (j = i; j >= 0; j--) {
-                  c = columns[j];
-                  if (c.resizable) {
-                    actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);
-                    if (x && c.previousWidth + x < actualMinWidth) {
-                      x += c.previousWidth - actualMinWidth;
-                      c.width = actualMinWidth;
-                    } else {
-                      c.width = c.previousWidth + x;
-                      x = 0;
-                    }
-                  }
-                }
-
-                if (options.forceFitColumns) {
-                  x = -d;
-                  for (j = i + 1; j < columns.length; j++) {
-                    c = columns[j];
-                    if (c.resizable) {
-                      if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {
-                        x -= c.maxWidth - c.previousWidth;
-                        c.width = c.maxWidth;
-                      } else {
-                        c.width = c.previousWidth + x;
-                        x = 0;
-                      }
-                    }
-                  }
-                }
-              } else { // stretch column
-                x = d;
-                for (j = i; j >= 0; j--) {
-                  c = columns[j];
-                  if (c.resizable) {
-                    if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {
-                      x -= c.maxWidth - c.previousWidth;
-                      c.width = c.maxWidth;
-                    } else {
-                      c.width = c.previousWidth + x;
-                      x = 0;
-                    }
-                  }
-                }
-
-                if (options.forceFitColumns) {
-                  x = -d;
-                  for (j = i + 1; j < columns.length; j++) {
-                    c = columns[j];
-                    if (c.resizable) {
-                      actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);
-                      if (x && c.previousWidth + x < actualMinWidth) {
-                        x += c.previousWidth - actualMinWidth;
-                        c.width = actualMinWidth;
-                      } else {
-                        c.width = c.previousWidth + x;
-                        x = 0;
-                      }
-                    }
-                  }
-                }
-              }
-              applyColumnHeaderWidths();
-              if (options.syncColumnCellResize) {
-                applyColumnWidths();
-              }
-            })
-            .on("dragend", function (e, dd) {
-              var newWidth;
-              $(this).parent().removeClass("slick-header-column-active");
-              for (j = 0; j < columns.length; j++) {
-                c = columns[j];
-                newWidth = $(columnElements[j]).outerWidth();
-
-                if (c.previousWidth !== newWidth && c.rerenderOnResize) {
-                  invalidateAllRows();
-                }
-              }
-              updateCanvasWidth(true);
-              render();
-              trigger(self.onColumnsResized, {grid: self});
-            });
-      });
-    }
-
-    function getVBoxDelta($el) {
-      var p = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"];
-      var delta = 0;
-      $.each(p, function (n, val) {
-        delta += parseFloat($el.css(val)) || 0;
-      });
-      return delta;
-    }
-
-    function measureCellPaddingAndBorder() {
-      var el;
-      var h = ["borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight"];
-      var v = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"];
-
-      // jquery prior to version 1.8 handles .width setter/getter as a direct css write/read
-      // jquery 1.8 changed .width to read the true inner element width if box-sizing is set to border-box, and introduced a setter for .outerWidth
-      // so for equivalent functionality, prior to 1.8 use .width, and after use .outerWidth
-      var verArray = $.fn.jquery.split('.');
-      jQueryNewWidthBehaviour = (verArray[0]==1 && verArray[1]>=8) ||  verArray[0] >=2;
-
-      el = $("<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>").appendTo($headers);
-      headerColumnWidthDiff = headerColumnHeightDiff = 0;
-      if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
-        $.each(h, function (n, val) {
-          headerColumnWidthDiff += parseFloat(el.css(val)) || 0;
-        });
-        $.each(v, function (n, val) {
-          headerColumnHeightDiff += parseFloat(el.css(val)) || 0;
-        });
-      }
-      el.remove();
-
-      var r = $("<div class='slick-row' />").appendTo($canvas);
-      el = $("<div class='slick-cell' id='' style='visibility:hidden'>-</div>").appendTo(r);
-      cellWidthDiff = cellHeightDiff = 0;
-      if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
-        $.each(h, function (n, val) {
-          cellWidthDiff += parseFloat(el.css(val)) || 0;
-        });
-        $.each(v, function (n, val) {
-          cellHeightDiff += parseFloat(el.css(val)) || 0;
-        });
-      }
-      r.remove();
-
-      absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);
-    }
-
-    function createCssRules() {
-      $style = $("<style type='text/css' rel='stylesheet' />").appendTo($("head"));
-      var rowHeight = (options.rowHeight - cellHeightDiff);
-      var rules = [
-        "." + uid + " .slick-header-column { left: 1000px; }",
-        "." + uid + " .slick-top-panel { height:" + options.topPanelHeight + "px; }",
-        "." + uid + " .slick-headerrow-columns { height:" + options.headerRowHeight + "px; }",
-        "." + uid + " .slick-footerrow-columns { height:" + options.footerRowHeight + "px; }",
-        "." + uid + " .slick-cell { height:" + rowHeight + "px; }",
-        "." + uid + " .slick-row { height:" + options.rowHeight + "px; }"
-      ];
-
-      for (var i = 0; i < columns.length; i++) {
-        rules.push("." + uid + " .l" + i + " { }");
-        rules.push("." + uid + " .r" + i + " { }");
-      }
-
-      if ($style[0].styleSheet) { // IE
-        $style[0].styleSheet.cssText = rules.join(" ");
-      } else {
-        $style[0].appendChild(document.createTextNode(rules.join(" ")));
-      }
-    }
-
-    function getColumnCssRules(idx) {
-      var i;
-      if (!stylesheet) {
-        var sheets = document.styleSheets;
-        for (i = 0; i < sheets.length; i++) {
-          if ((sheets[i].ownerNode || sheets[i].owningElement) == $style[0]) {
-            stylesheet = sheets[i];
-            break;
-          }
-        }
-
-        if (!stylesheet) {
-          throw new Error("Cannot find stylesheet.");
-        }
-
-        // find and cache column CSS rules
-        columnCssRulesL = [];
-        columnCssRulesR = [];
-        var cssRules = (stylesheet.cssRules || stylesheet.rules);
-        var matches, columnIdx;
-        for (i = 0; i < cssRules.length; i++) {
-          var selector = cssRules[i].selectorText;
-          if (matches = /\.l\d+/.exec(selector)) {
-            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);
-            columnCssRulesL[columnIdx] = cssRules[i];
-          } else if (matches = /\.r\d+/.exec(selector)) {
-            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);
-            columnCssRulesR[columnIdx] = cssRules[i];
-          }
-        }
-      }
-
-      return {
-        "left": columnCssRulesL[idx],
-        "right": columnCssRulesR[idx]
-      };
-    }
-
-    function removeCssRules() {
-      $style.remove();
-      stylesheet = null;
-    }
-
-    function destroy() {
-      getEditorLock().cancelCurrentEdit();
-
-      trigger(self.onBeforeDestroy, {grid: self});
-
-      var i = plugins.length;
-      while(i--) {
-        unregisterPlugin(plugins[i]);
-      }
-
-      if (options.enableColumnReorder) {
-          $headers.filter(":ui-sortable").sortable("destroy");
-      }
-
-      unbindAncestorScrollEvents();
-      $container.off(".slickgrid");
-      removeCssRules();
-
-      $canvas.off("draginit dragstart dragend drag");
-      $container.empty().removeClass(uid);
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // General
-
-    function trigger(evt, args, e) {
-      e = e || new Slick.EventData();
-      args = args || {};
-      args.grid = self;
-      return evt.notify(args, e, self);
-    }
-
-    function getEditorLock() {
-      return options.editorLock;
-    }
-
-    function getEditController() {
-      return editController;
-    }
-
-    function getColumnIndex(id) {
-      return columnsById[id];
-    }
-
-    function autosizeColumns() {
-      var i, c,
-          widths = [],
-          shrinkLeeway = 0,
-          total = 0,
-          prevTotal,
-          availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;
-
-      for (i = 0; i < columns.length; i++) {
-        c = columns[i];
-        widths.push(c.width);
-        total += c.width;
-        if (c.resizable) {
-          shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);
-        }
-      }
-
-      // shrink
-      prevTotal = total;
-      while (total > availWidth && shrinkLeeway) {
-        var shrinkProportion = (total - availWidth) / shrinkLeeway;
-        for (i = 0; i < columns.length && total > availWidth; i++) {
-          c = columns[i];
-          var width = widths[i];
-          if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {
-            continue;
-          }
-          var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);
-          var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;
-          shrinkSize = Math.min(shrinkSize, width - absMinWidth);
-          total -= shrinkSize;
-          shrinkLeeway -= shrinkSize;
-          widths[i] -= shrinkSize;
-        }
-        if (prevTotal <= total) {  // avoid infinite loop
-          break;
-        }
-        prevTotal = total;
-      }
-
-      // grow
-      prevTotal = total;
-      while (total < availWidth) {
-        var growProportion = availWidth / total;
-        for (i = 0; i < columns.length && total < availWidth; i++) {
-          c = columns[i];
-          var currentWidth = widths[i];
-          var growSize;
-
-          if (!c.resizable || c.maxWidth <= currentWidth) {
-            growSize = 0;
-          } else {
-            growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;
-          }
-          total += growSize;
-          widths[i] += (total <= availWidth ? growSize : 0);
-        }
-        if (prevTotal >= total) {  // avoid infinite loop
-          break;
-        }
-        prevTotal = total;
-      }
-
-      var reRender = false;
-      for (i = 0; i < columns.length; i++) {
-        if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {
-          reRender = true;
-        }
-        columns[i].width = widths[i];
-      }
-
-      applyColumnHeaderWidths();
-      updateCanvasWidth(true);
-      if (reRender) {
-        invalidateAllRows();
-        render();
-      }
-    }
-
-    function applyColumnHeaderWidths() {
-      if (!initialized) { return; }
-      var h;
-
-      for (var i = 0, headers = $headers.children(), ii = columns.length; i < ii; i++) {
-        h = $(headers[i]);
-        if (jQueryNewWidthBehaviour) {
-            if (h.outerWidth() !== columns[i].width) {
-              h.outerWidth(columns[i].width);
-            }
-        } else {
-            if (h.width() !== columns[i].width - headerColumnWidthDiff) {
-              h.width(columns[i].width - headerColumnWidthDiff);
-            }
-        }
-      }
-
-      updateColumnCaches();
-    }
-
-    function applyColumnWidths() {
-      var x = 0, w, rule;
-      for (var i = 0; i < columns.length; i++) {
-        w = columns[i].width;
-
-        rule = getColumnCssRules(i);
-        rule.left.style.left = x + "px";
-        rule.right.style.right = (canvasWidth - x - w) + "px";
-
-        x += columns[i].width;
-      }
-    }
-
-    function setSortColumn(columnId, ascending) {
-      setSortColumns([{ columnId: columnId, sortAsc: ascending}]);
-    }
-
-    function setSortColumns(cols) {
-      sortColumns = cols;
-      var numberCols = options.numberedMultiColumnSort && sortColumns.length > 1;
-      var headerColumnEls = $headers.children();
-      var sortIndicatorEl = headerColumnEls
-          .removeClass("slick-header-column-sorted")
-          .find("." + sortIndicatorCssClass)
-              .removeClass("slick-sort-indicator-asc slick-sort-indicator-desc");
-      if (numberCols) { sortIndicatorEl.text(''); }
-
-      $.each(sortColumns, function(i, col) {
-        if (col.sortAsc == null) {
-          col.sortAsc = true;
-        }
-        var columnIndex = getColumnIndex(col.columnId);
-        if (columnIndex != null) {
-          sortIndicatorEl = headerColumnEls.eq(columnIndex)
-              .addClass("slick-header-column-sorted")
-              .find("." + sortIndicatorCssClass)
-                  .addClass(col.sortAsc ? "slick-sort-indicator-asc" : "slick-sort-indicator-desc");
-          if (numberCols) { sortIndicatorEl.text(i+1); }
-        }
-      });
-    }
-
-    function getSortColumns() {
-      return sortColumns;
-    }
-
-    function handleSelectedRangesChanged(e, ranges) {
-      selectedRows = [];
-      var hash = {};
-      for (var i = 0; i < ranges.length; i++) {
-        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
-          if (!hash[j]) {  // prevent duplicates
-            selectedRows.push(j);
-            hash[j] = {};
-          }
-          for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {
-            if (canCellBeSelected(j, k)) {
-              hash[j][columns[k].id] = options.selectedCellCssClass;
-            }
-          }
-        }
-      }
-
-      setCellCssStyles(options.selectedCellCssClass, hash);
-
-      trigger(self.onSelectedRowsChanged, {rows: getSelectedRows(), grid: self}, e);
-    }
-
-    function getColumns() {
-      return columns;
-    }
-
-    function updateColumnCaches() {
-      // Pre-calculate cell boundaries.
-      columnPosLeft = [];
-      columnPosRight = [];
-      var x = 0;
-      for (var i = 0, ii = columns.length; i < ii; i++) {
-        columnPosLeft[i] = x;
-        columnPosRight[i] = x + columns[i].width;
-        x += columns[i].width;
-      }
-    }
-
-    function setColumns(columnDefinitions) {
-      columns = columnDefinitions;
-
-      columnsById = {};
-      for (var i = 0; i < columns.length; i++) {
-        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);
-        columnsById[m.id] = i;
-        if (m.minWidth && m.width < m.minWidth) {
-          m.width = m.minWidth;
-        }
-        if (m.maxWidth && m.width > m.maxWidth) {
-          m.width = m.maxWidth;
-        }
-      }
-
-      updateColumnCaches();
-
-      if (initialized) {
-        invalidateAllRows();
-        createColumnHeaders();
-        removeCssRules();
-        createCssRules();
-        resizeCanvas();
-        applyColumnWidths();
-        handleScroll();
-      }
-    }
-
-    function getOptions() {
-      return options;
-    }
-
-    function setOptions(args, suppressRender) {
-      if (!getEditorLock().commitCurrentEdit()) {
-        return;
-      }
-
-      makeActiveCellNormal();
-
-      if (options.enableAddRow !== args.enableAddRow) {
-        invalidateRow(getDataLength());
-      }
-
-      options = $.extend(options, args);
-      validateAndEnforceOptions();
-
-      $viewport.css("overflow-y", options.autoHeight ? "hidden" : "auto");
-      if (!suppressRender) { render(); }
-    }
-
-    function validateAndEnforceOptions() {
-      if (options.autoHeight) {
-        options.leaveSpaceForNewRows = false;
-      }
-    }
-
-    function setData(newData, scrollToTop) {
-      data = newData;
-      invalidateAllRows();
-      updateRowCount();
-      if (scrollToTop) {
-        scrollTo(0);
-      }
-    }
-
-    function getData() {
-      return data;
-    }
-
-    function getDataLength() {
-      if (data.getLength) {
-        return data.getLength();
-      } else {
-        return data.length;
-      }
-    }
-
-    function getDataLengthIncludingAddNew() {
-      return getDataLength() + (!options.enableAddRow ? 0
-        : (!pagingActive || pagingIsLastPage ? 1 : 0)
-      );
-    }
-
-    function getDataItem(i) {
-      if (data.getItem) {
-        return data.getItem(i);
-      } else {
-        return data[i];
-      }
-    }
-
-    function getTopPanel() {
-      return $topPanel[0];
-    }
-
-    function setTopPanelVisibility(visible) {
-      if (options.showTopPanel != visible) {
-        options.showTopPanel = visible;
-        if (visible) {
-          $topPanelScroller.slideDown("fast", resizeCanvas);
-        } else {
-          $topPanelScroller.slideUp("fast", resizeCanvas);
-        }
-      }
-    }
-
-    function setHeaderRowVisibility(visible) {
-      if (options.showHeaderRow != visible) {
-        options.showHeaderRow = visible;
-        if (visible) {
-          $headerRowScroller.slideDown("fast", resizeCanvas);
-        } else {
-          $headerRowScroller.slideUp("fast", resizeCanvas);
-        }
-      }
-    }
-
-    function setFooterRowVisibility(visible) {
-      if (options.showFooterRow != visible) {
-        options.showFooterRow = visible;
-        if (visible) {
-          $footerRowScroller.slideDown("fast", resizeCanvas);
-        } else {
-          $footerRowScroller.slideUp("fast", resizeCanvas);
-        }
-      }
-    }
-
-    function getContainerNode() {
-      return $container.get(0);
-    }
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Rendering / Scrolling
-
-    function getRowTop(row) {
-      return options.rowHeight * row - offset;
-    }
-
-    function getRowFromPosition(y) {
-      return Math.floor((y + offset) / options.rowHeight);
-    }
-
-    function scrollTo(y) {
-      y = Math.max(y, 0);
-      y = Math.min(y, th - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0));
-
-      var oldOffset = offset;
-
-      page = Math.min(n - 1, Math.floor(y / ph));
-      offset = Math.round(page * cj);
-      var newScrollTop = y - offset;
-
-      if (offset != oldOffset) {
-        var range = getVisibleRange(newScrollTop);
-        cleanupRows(range);
-        updateRowPositions();
-      }
-
-      if (prevScrollTop != newScrollTop) {
-        vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;
-        $viewport[0].scrollTop = (lastRenderedScrollTop = scrollTop = prevScrollTop = newScrollTop);
-
-        trigger(self.onViewportChanged, {grid: self});
-      }
-    }
-
-    function defaultFormatter(row, cell, value, columnDef, dataContext) {
-      if (value == null) {
-        return "";
-      } else {
-        return (value + "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
-      }
-    }
-
-    function getFormatter(row, column) {
-      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
-
-      // look up by id, then index
-      var columnOverrides = rowMetadata &&
-          rowMetadata.columns &&
-          (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);
-
-      return (columnOverrides && columnOverrides.formatter) ||
-          (rowMetadata && rowMetadata.formatter) ||
-          column.formatter ||
-          (options.formatterFactory && options.formatterFactory.getFormatter(column)) ||
-          options.defaultFormatter;
-    }
-
-    function getEditor(row, cell) {
-      var column = columns[cell];
-      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
-      var columnMetadata = rowMetadata && rowMetadata.columns;
-
-      if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {
-        return columnMetadata[column.id].editor;
-      }
-      if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {
-        return columnMetadata[cell].editor;
-      }
-
-      return column.editor || (options.editorFactory && options.editorFactory.getEditor(column));
-    }
-
-    function getDataItemValueForColumn(item, columnDef) {
-      if (options.dataItemColumnValueExtractor) {
-        return options.dataItemColumnValueExtractor(item, columnDef);
-      }
-      return item[columnDef.field];
-    }
-
-    function appendRowHtml(stringArray, row, range, dataLength) {
-      var d = getDataItem(row);
-      var dataLoading = row < dataLength && !d;
-      var rowCss = "slick-row" +
-          (dataLoading ? " loading" : "") +
-          (row === activeRow ? " active" : "") +
-          (row % 2 == 1 ? " odd" : " even");
-
-      if (!d) {
-        rowCss += " " + options.addNewRowCssClass;
-      }
-
-      var metadata = data.getItemMetadata && data.getItemMetadata(row);
-
-      if (metadata && metadata.cssClasses) {
-        rowCss += " " + metadata.cssClasses;
-      }
-
-      stringArray.push("<div class='ui-widget-content " + rowCss + "' style='top:" + getRowTop(row) + "px'>");
-
-      var colspan, m;
-      for (var i = 0, ii = columns.length; i < ii; i++) {
-        m = columns[i];
-        colspan = 1;
-        if (metadata && metadata.columns) {
-          var columnData = metadata.columns[m.id] || metadata.columns[i];
-          colspan = (columnData && columnData.colspan) || 1;
-          if (colspan === "*") {
-            colspan = ii - i;
-          }
-        }
-
-        // Do not render cells outside of the viewport.
-        if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {
-          if (columnPosLeft[i] > range.rightPx) {
-            // All columns to the right are outside the range.
-            break;
-          }
-
-          appendCellHtml(stringArray, row, i, colspan, d);
-        }
-
-        if (colspan > 1) {
-          i += (colspan - 1);
-        }
-      }
-
-      stringArray.push("</div>");
-    }
-
-    function appendCellHtml(stringArray, row, cell, colspan, item) {
-      // stringArray: stringBuilder containing the HTML parts
-      // row, cell: row and column index
-      // colspan: HTML colspan
-      // item: grid data for row
-
-      var m = columns[cell];
-      var cellCss = "slick-cell l" + cell + " r" + Math.min(columns.length - 1, cell + colspan - 1) +
-          (m.cssClass ? " " + m.cssClass : "");
-      if (row === activeRow && cell === activeCell) {
-        cellCss += (" active");
-      }
-
-      // TODO:  merge them together in the setter
-      for (var key in cellCssClasses) {
-        if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {
-          cellCss += (" " + cellCssClasses[key][row][m.id]);
-        }
-      }
-
-      var value = null;
-      if (item) { value = getDataItemValueForColumn(item, m); }
-      var formatterResult =  getFormatter(row, m)(row, cell, value, m, item);
-      
-      // get addl css class names from object type formatter return and from string type return of onBeforeAppendCell
-      var addlCssClasses = trigger(self.onBeforeAppendCell, { row: row, cell: cell, grid: self, value: value, dataContext: item }) || '';
-      addlCssClasses += (formatterResult.addClasses ? (addlCssClasses ? ' ' : '') + formatterResult.addClasses : '');
-      
-      stringArray.push("<div class='" + cellCss + (addlCssClasses ? ' ' + addlCssClasses : '') + "'>");
-
-      // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)
-      if (item) {
-        stringArray.push(typeof formatterResult === 'string' ? formatterResult : formatterResult.text);
-      }
-      
-      stringArray.push("</div>");
-
-      rowsCache[row].cellRenderQueue.push(cell);
-      rowsCache[row].cellColSpans[cell] = colspan;
-    }
-
-
-    function cleanupRows(rangeToKeep) {
-      for (var i in rowsCache) {
-        if (((i = parseInt(i, 10)) !== activeRow) && (i < rangeToKeep.top || i > rangeToKeep.bottom)) {
-          removeRowFromCache(i);
-        }
-      }
-      if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }
-    }
-
-    function invalidate() {
-      updateRowCount();
-      invalidateAllRows();
-      render();
-    }
-
-    function invalidateAllRows() {
-      if (currentEditor) {
-        makeActiveCellNormal();
-      }
-      for (var row in rowsCache) {
-        removeRowFromCache(row);
-      }
-      if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }
-    }
-
-    function queuePostProcessedRowForCleanup(cacheEntry, postProcessedRow, rowIdx) {
-      postProcessgroupId++;
-
-      // store and detach node for later async cleanup
-      for (var columnIdx in postProcessedRow) {
-        if (postProcessedRow.hasOwnProperty(columnIdx)) {
-          postProcessedCleanupQueue.push({
-            actionType: 'C',
-            groupId: postProcessgroupId,
-            node: cacheEntry.cellNodesByColumnIdx[ columnIdx | 0],
-            columnIdx: columnIdx | 0,
-            rowIdx: rowIdx
-          });
-        }
-      }
-      postProcessedCleanupQueue.push({
-        actionType: 'R',
-        groupId: postProcessgroupId,
-        node: cacheEntry.rowNode
-      });
-      $(cacheEntry.rowNode).detach();
-    }
-
-    function queuePostProcessedCellForCleanup(cellnode, columnIdx, rowIdx) {
-      postProcessedCleanupQueue.push({
-        actionType: 'C',
-        groupId: postProcessgroupId,
-        node: cellnode,
-        columnIdx: columnIdx,
-        rowIdx: rowIdx
-      });
-      $(cellnode).detach();
-    }
-
-    function removeRowFromCache(row) {
-      var cacheEntry = rowsCache[row];
-      if (!cacheEntry) {
-        return;
-      }
-
-      if (rowNodeFromLastMouseWheelEvent === cacheEntry.rowNode) {
-        cacheEntry.rowNode.style.display = 'none';
-        zombieRowNodeFromLastMouseWheelEvent = rowNodeFromLastMouseWheelEvent;
-        zombieRowCacheFromLastMouseWheelEvent = cacheEntry;
-        zombieRowPostProcessedFromLastMouseWheelEvent = postProcessedRows[row];
-        // ignore post processing cleanup in this case - it will be dealt with later
-      } else {
-        if (options.enableAsyncPostRenderCleanup && postProcessedRows[row]) {
-          queuePostProcessedRowForCleanup(cacheEntry, postProcessedRows[row], row);
-        } else {
-          $canvas[0].removeChild(cacheEntry.rowNode);
-        }
-      }
-
-      delete rowsCache[row];
-      delete postProcessedRows[row];
-      renderedRows--;
-      counter_rows_removed++;
-    }
-
-    function invalidateRows(rows) {
-      var i, rl;
-      if (!rows || !rows.length) {
-        return;
-      }
-      vScrollDir = 0;
-      rl = rows.length;
-      for (i = 0;  i < rl; i++) {
-        if (currentEditor && activeRow === rows[i]) {
-          makeActiveCellNormal();
-        }
-        if (rowsCache[rows[i]]) {
-          removeRowFromCache(rows[i]);
-        }
-      }
-      if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }
-
-    }
-
-    function invalidateRow(row) {
-      invalidateRows([row]);
-    }
-
-    function applyFormatResultToCellNode(formatterResult, cellNode, suppressRemove) {
-        if (typeof formatterResult === 'string') { 
-            cellNode.innerHTML = formatterResult;
-            return;
-        }
-        cellNode.innerHTML = formatterResult.text;
-        if (formatterResult.removeClasses && !suppressRemove) { 
-            cellNode.removeClass(formatterResult.removeClasses); 
-        }
-        if (formatterResult.addClasses) { 
-            cellNode.addClass(formatterResult.addClasses); 
-        }
-    }
-
-    function updateCell(row, cell) {
-      var cellNode = getCellNode(row, cell);
-      if (!cellNode) {
-        return;
-      }
-
-      var m = columns[cell], d = getDataItem(row);
-      if (currentEditor && activeRow === row && activeCell === cell) {
-        currentEditor.loadValue(d);
-      } else {
-        var formatterResult =  d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d) : "";
-        applyFormatResultToCellNode(formatterResult, cellNode);
-        invalidatePostProcessingResults(row);
-      }
-    }
-
-    function updateRow(row) {
-      var cacheEntry = rowsCache[row];
-      if (!cacheEntry) {
-        return;
-      }
-
-      ensureCellNodesInRowsCache(row);
-
-      var formatterResult, d = getDataItem(row);
-    
-      for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {
-        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {
-          continue;
-        }
-
-        columnIdx = columnIdx | 0;
-        var m = columns[columnIdx],
-            node = cacheEntry.cellNodesByColumnIdx[columnIdx];
-
-        if (row === activeRow && columnIdx === activeCell && currentEditor) {
-          currentEditor.loadValue(d);
-        } else if (d) {
-          formatterResult =  getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d);
-          applyFormatResultToCellNode(formatterResult, node);
-        } else {
-          node.innerHTML = "";
-        }
-      }
-
-      invalidatePostProcessingResults(row);
-    }
-
-    function getViewportHeight() {
-      return parseFloat($.css($container[0], "height", true)) -
-          parseFloat($.css($container[0], "paddingTop", true)) -
-          parseFloat($.css($container[0], "paddingBottom", true)) -
-          parseFloat($.css($headerScroller[0], "height")) - getVBoxDelta($headerScroller) -
-          (options.showTopPanel ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0) -
-          (options.showHeaderRow ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0) -
-          (options.createFooterRow && options.showFooterRow ? options.footerRowHeight + getVBoxDelta($footerRowScroller) : 0);
-    }
-
-    function resizeCanvas() {
-      if (!initialized) { return; }
-      if (options.autoHeight) {
-        viewportH = options.rowHeight * getDataLengthIncludingAddNew();
-      } else {
-        viewportH = getViewportHeight();
-      }
-
-      numVisibleRows = Math.ceil(viewportH / options.rowHeight);
-      viewportW = parseFloat($.css($container[0], "width", true));
-      if (!options.autoHeight) {
-        $viewport.height(viewportH);
-      }
-
-      if (options.forceFitColumns) {
-        autosizeColumns();
-      }
-
-      updateRowCount();
-      handleScroll();
-      // Since the width has changed, force the render() to reevaluate virtually rendered cells.
-      lastRenderedScrollLeft = -1;
-      render();
-    }
-
-    function updatePagingStatusFromView( pagingInfo ) {
-        pagingActive = (pagingInfo.pageSize !== 0);
-        pagingIsLastPage = (pagingInfo.pageNum == pagingInfo.totalPages - 1);
-    }
-
-    function updateRowCount() {
-      if (!initialized) { return; }
-
-      var dataLength = getDataLength();
-      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
-      var numberOfRows = dataLengthIncludingAddNew +
-          (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);
-
-      var oldViewportHasVScroll = viewportHasVScroll;
-      // with autoHeight, we do not need to accommodate the vertical scroll bar
-      viewportHasVScroll = !options.autoHeight && (numberOfRows * options.rowHeight > viewportH);
-      viewportHasHScroll = (canvasWidth > viewportW - scrollbarDimensions.width);
-
-      makeActiveCellNormal();
-
-      // remove the rows that are now outside of the data range
-      // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows
-      var r1 = dataLength - 1;
-      for (var i in rowsCache) {
-        if (i > r1) {
-          removeRowFromCache(i);
-        }
-      }
-      if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }
-
-      if (activeCellNode && activeRow > r1) {
-        resetActiveCell();
-      }
-
-      var oldH = h;
-      th = Math.max(options.rowHeight * numberOfRows, viewportH - scrollbarDimensions.height);
-      if (th < maxSupportedCssHeight) {
-        // just one page
-        h = ph = th;
-        n = 1;
-        cj = 0;
-      } else {
-        // break into pages
-        h = maxSupportedCssHeight;
-        ph = h / 100;
-        n = Math.floor(th / ph);
-        cj = (th - h) / (n - 1);
-      }
-
-      if (h !== oldH) {
-        $canvas.css("height", h);
-        scrollTop = $viewport[0].scrollTop;
-      }
-
-      var oldScrollTopInRange = (scrollTop + offset <= th - viewportH);
-
-      if (th == 0 || scrollTop == 0) {
-        page = offset = 0;
-      } else if (oldScrollTopInRange) {
-        // maintain virtual position
-        scrollTo(scrollTop + offset);
-      } else {
-        // scroll to bottom
-        scrollTo(th - viewportH);
-      }
-
-      if (h != oldH && options.autoHeight) {
-        resizeCanvas();
-      }
-
-      if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {
-        autosizeColumns();
-      }
-      updateCanvasWidth(false);
-    }
-
-    function getVisibleRange(viewportTop, viewportLeft) {
-      if (viewportTop == null) {
-        viewportTop = scrollTop;
-      }
-      if (viewportLeft == null) {
-        viewportLeft = scrollLeft;
-      }
-
-      return {
-        top: getRowFromPosition(viewportTop),
-        bottom: getRowFromPosition(viewportTop + viewportH) + 1,
-        leftPx: viewportLeft,
-        rightPx: viewportLeft + viewportW
-      };
-    }
-
-    function getRenderedRange(viewportTop, viewportLeft) {
-      var range = getVisibleRange(viewportTop, viewportLeft);
-      var buffer = Math.round(viewportH / options.rowHeight);
-      var minBuffer = 3;
-
-      if (vScrollDir == -1) {
-        range.top -= buffer;
-        range.bottom += minBuffer;
-      } else if (vScrollDir == 1) {
-        range.top -= minBuffer;
-        range.bottom += buffer;
-      } else {
-        range.top -= minBuffer;
-        range.bottom += minBuffer;
-      }
-
-      range.top = Math.max(0, range.top);
-      range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);
-
-      range.leftPx -= viewportW;
-      range.rightPx += viewportW;
-
-      range.leftPx = Math.max(0, range.leftPx);
-      range.rightPx = Math.min(canvasWidth, range.rightPx);
-
-      return range;
-    }
-
-    function ensureCellNodesInRowsCache(row) {
-      var cacheEntry = rowsCache[row];
-      if (cacheEntry) {
-        if (cacheEntry.cellRenderQueue.length) {
-          var lastChild = cacheEntry.rowNode.lastChild;
-          while (cacheEntry.cellRenderQueue.length) {
-            var columnIdx = cacheEntry.cellRenderQueue.pop();
-            cacheEntry.cellNodesByColumnIdx[columnIdx] = lastChild;
-            lastChild = lastChild.previousSibling;
-          }
-        }
-      }
-    }
-
-    function cleanUpCells(range, row) {
-      var totalCellsRemoved = 0;
-      var cacheEntry = rowsCache[row];
-
-      // Remove cells outside the range.
-      var cellsToRemove = [];
-      for (var i in cacheEntry.cellNodesByColumnIdx) {
-        // I really hate it when people mess with Array.prototype.
-        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(i)) {
-          continue;
-        }
-
-        // This is a string, so it needs to be cast back to a number.
-        i = i | 0;
-
-        var colspan = cacheEntry.cellColSpans[i];
-        if (columnPosLeft[i] > range.rightPx ||
-          columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {
-          if (!(row == activeRow && i == activeCell)) {
-            cellsToRemove.push(i);
-          }
-        }
-      }
-
-      var cellToRemove, node;
-      postProcessgroupId++;
-      while ((cellToRemove = cellsToRemove.pop()) != null) {
-        node = cacheEntry.cellNodesByColumnIdx[cellToRemove];
-        if (options.enableAsyncPostRenderCleanup && postProcessedRows[row] && postProcessedRows[row][cellToRemove]) {
-          queuePostProcessedCellForCleanup(node, cellToRemove, row);
-        } else {
-          cacheEntry.rowNode.removeChild(node);
-        }
-
-        delete cacheEntry.cellColSpans[cellToRemove];
-        delete cacheEntry.cellNodesByColumnIdx[cellToRemove];
-        if (postProcessedRows[row]) {
-          delete postProcessedRows[row][cellToRemove];
-        }
-        totalCellsRemoved++;
-      }
-    }
-
-    function cleanUpAndRenderCells(range) {
-      var cacheEntry;
-      var stringArray = [];
-      var processedRows = [];
-      var cellsAdded;
-      var totalCellsAdded = 0;
-      var colspan;
-
-      for (var row = range.top, btm = range.bottom; row <= btm; row++) {
-        cacheEntry = rowsCache[row];
-        if (!cacheEntry) {
-          continue;
-        }
-
-        // cellRenderQueue populated in renderRows() needs to be cleared first
-        ensureCellNodesInRowsCache(row);
-
-        cleanUpCells(range, row);
-
-        // Render missing cells.
-        cellsAdded = 0;
-
-        var metadata = data.getItemMetadata && data.getItemMetadata(row);
-        metadata = metadata && metadata.columns;
-
-        var d = getDataItem(row);
-
-        // TODO:  shorten this loop (index? heuristics? binary search?)
-        for (var i = 0, ii = columns.length; i < ii; i++) {
-          // Cells to the right are outside the range.
-          if (columnPosLeft[i] > range.rightPx) {
-            break;
-          }
-
-          // Already rendered.
-          if ((colspan = cacheEntry.cellColSpans[i]) != null) {
-            i += (colspan > 1 ? colspan - 1 : 0);
-            continue;
-          }
-
-          colspan = 1;
-          if (metadata) {
-            var columnData = metadata[columns[i].id] || metadata[i];
-            colspan = (columnData && columnData.colspan) || 1;
-            if (colspan === "*") {
-              colspan = ii - i;
-            }
-          }
-
-          if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {
-            appendCellHtml(stringArray, row, i, colspan, d);
-            cellsAdded++;
-          }
-
-          i += (colspan > 1 ? colspan - 1 : 0);
-        }
-
-        if (cellsAdded) {
-          totalCellsAdded += cellsAdded;
-          processedRows.push(row);
-        }
-      }
-
-      if (!stringArray.length) {
-        return;
-      }
-
-      var x = document.createElement("div");
-      x.innerHTML = stringArray.join("");
-
-      var processedRow;
-      var node;
-      while ((processedRow = processedRows.pop()) != null) {
-        cacheEntry = rowsCache[processedRow];
-        var columnIdx;
-        while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {
-          node = x.lastChild;
-          cacheEntry.rowNode.appendChild(node);
-          cacheEntry.cellNodesByColumnIdx[columnIdx] = node;
-        }
-      }
-    }
-
-    function renderRows(range) {
-      var parentNode = $canvas[0],
-          stringArray = [],
-          rows = [],
-          needToReselectCell = false,
-          dataLength = getDataLength();
-
-      for (var i = range.top, ii = range.bottom; i <= ii; i++) {
-        if (rowsCache[i]) {
-          continue;
-        }
-        renderedRows++;
-        rows.push(i);
-
-        // Create an entry right away so that appendRowHtml() can
-        // start populatating it.
-        rowsCache[i] = {
-          "rowNode": null,
-
-          // ColSpans of rendered cells (by column idx).
-          // Can also be used for checking whether a cell has been rendered.
-          "cellColSpans": [],
-
-          // Cell nodes (by column idx).  Lazy-populated by ensureCellNodesInRowsCache().
-          "cellNodesByColumnIdx": [],
-
-          // Column indices of cell nodes that have been rendered, but not yet indexed in
-          // cellNodesByColumnIdx.  These are in the same order as cell nodes added at the
-          // end of the row.
-          "cellRenderQueue": []
-        };
-
-        appendRowHtml(stringArray, i, range, dataLength);
-        if (activeCellNode && activeRow === i) {
-          needToReselectCell = true;
-        }
-        counter_rows_rendered++;
-      }
-
-      if (!rows.length) { return; }
-
-      var x = document.createElement("div");
-      x.innerHTML = stringArray.join("");
-
-      for (var i = 0, ii = rows.length; i < ii; i++) {
-        rowsCache[rows[i]].rowNode = parentNode.appendChild(x.firstChild);
-      }
-
-      if (needToReselectCell) {
-        activeCellNode = getCellNode(activeRow, activeCell);
-      }
-    }
-
-    function startPostProcessing() {
-      if (!options.enableAsyncPostRender) {
-        return;
-      }
-      clearTimeout(h_postrender);
-      h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);
-    }
-
-    function startPostProcessingCleanup() {
-      if (!options.enableAsyncPostRenderCleanup) {
-        return;
-      }
-      clearTimeout(h_postrenderCleanup);
-      h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);
-    }
-
-    function invalidatePostProcessingResults(row) {
-      // change status of columns to be re-rendered
-      for (var columnIdx in postProcessedRows[row]) {
-        if (postProcessedRows[row].hasOwnProperty(columnIdx)) {
-          postProcessedRows[row][columnIdx] = 'C';
-        }
-      }
-      postProcessFromRow = Math.min(postProcessFromRow, row);
-      postProcessToRow = Math.max(postProcessToRow, row);
-      startPostProcessing();
-    }
-
-    function updateRowPositions() {
-      for (var row in rowsCache) {
-        rowsCache[row].rowNode.style.top = getRowTop(row) + "px";
-      }
-    }
-
-    function render() {
-      if (!initialized) { return; }
-      var visible = getVisibleRange();
-      var rendered = getRenderedRange();
-
-      // remove rows no longer in the viewport
-      cleanupRows(rendered);
-
-      // add new rows & missing cells in existing rows
-      if (lastRenderedScrollLeft != scrollLeft) {
-        cleanUpAndRenderCells(rendered);
-      }
-
-      // render missing rows
-      renderRows(rendered);
-
-      postProcessFromRow = visible.top;
-      postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);
-      startPostProcessing();
-
-      lastRenderedScrollTop = scrollTop;
-      lastRenderedScrollLeft = scrollLeft;
-      h_render = null;
-    }
-
-    function handleHeaderRowScroll() {
-      var scrollLeft = $headerRowScroller[0].scrollLeft;
-      if (scrollLeft != $viewport[0].scrollLeft) {
-        $viewport[0].scrollLeft = scrollLeft;
-      }
-    }
-
-    function handleFooterRowScroll() {
-      var scrollLeft = $footerRowScroller[0].scrollLeft;
-      if (scrollLeft != $viewport[0].scrollLeft) {
-        $viewport[0].scrollLeft = scrollLeft;
-      }
-    }
-
-    function handleScroll() {
-      scrollTop = $viewport[0].scrollTop;
-      scrollLeft = $viewport[0].scrollLeft;
-      var vScrollDist = Math.abs(scrollTop - prevScrollTop);
-      var hScrollDist = Math.abs(scrollLeft - prevScrollLeft);
-
-      if (hScrollDist) {
-        prevScrollLeft = scrollLeft;
-        $headerScroller[0].scrollLeft = scrollLeft;
-        $topPanelScroller[0].scrollLeft = scrollLeft;
-        $headerRowScroller[0].scrollLeft = scrollLeft;
-        if (options.createFooterRow) {
-          $footerRowScroller[0].scrollLeft = scrollLeft;
-        }
-      }
-
-      if (vScrollDist) {
-        vScrollDir = prevScrollTop < scrollTop ? 1 : -1;
-        prevScrollTop = scrollTop;
-
-        // switch virtual pages if needed
-        if (vScrollDist < viewportH) {
-          scrollTo(scrollTop + offset);
-        } else {
-          var oldOffset = offset;
-          if (h == viewportH) {
-            page = 0;
-          } else {
-            page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));
-          }
-          offset = Math.round(page * cj);
-          if (oldOffset != offset) {
-            invalidateAllRows();
-          }
-        }
-      }
-
-      if (hScrollDist || vScrollDist) {
-        if (h_render) {
-          clearTimeout(h_render);
-        }
-
-        if (Math.abs(lastRenderedScrollTop - scrollTop) > 20 ||
-            Math.abs(lastRenderedScrollLeft - scrollLeft) > 20) {
-          if (options.forceSyncScrolling || (
-              Math.abs(lastRenderedScrollTop - scrollTop) < viewportH &&
-              Math.abs(lastRenderedScrollLeft - scrollLeft) < viewportW)) {
-            render();
-          } else {
-            h_render = setTimeout(render, 50);
-          }
-
-          trigger(self.onViewportChanged, {grid: self});
-        }
-      }
-
-      trigger(self.onScroll, {scrollLeft: scrollLeft, scrollTop: scrollTop, grid: self});
-    }
-
-    function asyncPostProcessRows() {
-      var dataLength = getDataLength();
-      while (postProcessFromRow <= postProcessToRow) {
-        var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;
-        var cacheEntry = rowsCache[row];
-        if (!cacheEntry || row >= dataLength) {
-          continue;
-        }
-
-        if (!postProcessedRows[row]) {
-          postProcessedRows[row] = {};
-        }
-
-        ensureCellNodesInRowsCache(row);
-        for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {
-          if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {
-            continue;
-          }
-
-          columnIdx = columnIdx | 0;
-
-          var m = columns[columnIdx];
-          var processedStatus = postProcessedRows[row][columnIdx]; // C=cleanup and re-render, R=rendered
-          if (m.asyncPostRender && processedStatus !== 'R') {
-            var node = cacheEntry.cellNodesByColumnIdx[columnIdx];
-            if (node) {
-              m.asyncPostRender(node, row, getDataItem(row), m, (processedStatus === 'C'));
-            }
-            postProcessedRows[row][columnIdx] = 'R';
-          }
-        }
-
-        h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);
-        return;
-      }
-    }
-
-    function asyncPostProcessCleanupRows() {
-      if (postProcessedCleanupQueue.length > 0) {
-        var groupId = postProcessedCleanupQueue[0].groupId;
-
-        // loop through all queue members with this groupID
-        while (postProcessedCleanupQueue.length > 0 && postProcessedCleanupQueue[0].groupId == groupId) {
-          var entry = postProcessedCleanupQueue.shift();
-          if (entry.actionType == 'R') {
-            $(entry.node).remove();
-          }
-          if (entry.actionType == 'C') {
-            var column = columns[entry.columnIdx];
-            if (column.asyncPostRenderCleanup && entry.node) {
-              // cleanup must also remove element
-              column.asyncPostRenderCleanup(entry.node, entry.rowIdx, column);
-            }
-          }
-        }
-
-        // call this function again after the specified delay
-        h_postrenderCleanup = setTimeout(asyncPostProcessCleanupRows, options.asyncPostRenderCleanupDelay);
-      }
-    }
-
-    function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {
-      var node, columnId, addedRowHash, removedRowHash;
-      for (var row in rowsCache) {
-        removedRowHash = removedHash && removedHash[row];
-        addedRowHash = addedHash && addedHash[row];
-
-        if (removedRowHash) {
-          for (columnId in removedRowHash) {
-            if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {
-              node = getCellNode(row, getColumnIndex(columnId));
-              if (node) {
-                $(node).removeClass(removedRowHash[columnId]);
-              }
-            }
-          }
-        }
-
-        if (addedRowHash) {
-          for (columnId in addedRowHash) {
-            if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {
-              node = getCellNode(row, getColumnIndex(columnId));
-              if (node) {
-                $(node).addClass(addedRowHash[columnId]);
-              }
-            }
-          }
-        }
-      }
-    }
-
-    function addCellCssStyles(key, hash) {
-      if (cellCssClasses[key]) {
-        throw new Error("addCellCssStyles: cell CSS hash with key '" + key + "' already exists.");
-      }
-
-      cellCssClasses[key] = hash;
-      updateCellCssStylesOnRenderedRows(hash, null);
-
-      trigger(self.onCellCssStylesChanged, { "key": key, "hash": hash, "grid": self });
-    }
-
-    function removeCellCssStyles(key) {
-      if (!cellCssClasses[key]) {
-        return;
-      }
-
-      updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);
-      delete cellCssClasses[key];
-
-      trigger(self.onCellCssStylesChanged, { "key": key, "hash": null, "grid": self });
-    }
-
-    function setCellCssStyles(key, hash) {
-      var prevHash = cellCssClasses[key];
-
-      cellCssClasses[key] = hash;
-      updateCellCssStylesOnRenderedRows(hash, prevHash);
-
-      trigger(self.onCellCssStylesChanged, { "key": key, "hash": hash, "grid": self });
-    }
-
-    function getCellCssStyles(key) {
-      return cellCssClasses[key];
-    }
-
-    function flashCell(row, cell, speed) {
-      speed = speed || 100;
-      if (rowsCache[row]) {
-        var $cell = $(getCellNode(row, cell));
-
-        function toggleCellClass(times) {
-          if (!times) {
-            return;
-          }
-          setTimeout(function () {
-                $cell.queue(function () {
-                  $cell.toggleClass(options.cellFlashingCssClass).dequeue();
-                  toggleCellClass(times - 1);
-                });
-              },
-              speed);
-        }
-
-        toggleCellClass(4);
-      }
-    }
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Interactivity
-
-    function handleMouseWheel(e) {
-      var rowNode = $(e.target).closest(".slick-row")[0];
-      if (rowNode != rowNodeFromLastMouseWheelEvent) {
-        if (zombieRowNodeFromLastMouseWheelEvent && zombieRowNodeFromLastMouseWheelEvent != rowNode) {
-          if (options.enableAsyncPostRenderCleanup && zombieRowPostProcessedFromLastMouseWheelEvent) {
-            queuePostProcessedRowForCleanup(zombieRowCacheFromLastMouseWheelEvent,
-              zombieRowPostProcessedFromLastMouseWheelEvent);
-          } else {
-            $canvas[0].removeChild(zombieRowNodeFromLastMouseWheelEvent);
-          }
-          zombieRowNodeFromLastMouseWheelEvent = null;
-          zombieRowCacheFromLastMouseWheelEvent = null;
-          zombieRowPostProcessedFromLastMouseWheelEvent = null;
-
-          if (options.enableAsyncPostRenderCleanup) { startPostProcessingCleanup(); }
-        }
-        rowNodeFromLastMouseWheelEvent = rowNode;
-      }
-    }
-
-    function handleDragInit(e, dd) {
-      var cell = getCellFromEvent(e);
-      if (!cell || !cellExists(cell.row, cell.cell)) {
-        return false;
-      }
-
-      var retval = trigger(self.onDragInit, dd, e);
-      if (e.isImmediatePropagationStopped()) {
-        return retval;
-      }
-
-      // if nobody claims to be handling drag'n'drop by stopping immediate propagation,
-      // cancel out of it
-      return false;
-    }
-
-    function handleDragStart(e, dd) {
-      var cell = getCellFromEvent(e);
-      if (!cell || !cellExists(cell.row, cell.cell)) {
-        return false;
-      }
-
-      var retval = trigger(self.onDragStart, dd, e);
-      if (e.isImmediatePropagationStopped()) {
-        return retval;
-      }
-
-      return false;
-    }
-
-    function handleDrag(e, dd) {
-      return trigger(self.onDrag, dd, e);
-    }
-
-    function handleDragEnd(e, dd) {
-      trigger(self.onDragEnd, dd, e);
-    }
-
-    function handleKeyDown(e) {
-      trigger(self.onKeyDown, {row: activeRow, cell: activeCell, grid: self}, e);
-      var handled = e.isImmediatePropagationStopped();
-      var keyCode = Slick.keyCode;
-
-      if (!handled) {
-        if (!e.shiftKey && !e.altKey && !e.ctrlKey) {
-          // editor may specify an array of keys to bubble
-          if (options.editable && currentEditor && currentEditor.keyCaptureList) {
-            if (currentEditor.keyCaptureList.indexOf( e.which ) > -1) {
-                return;
-            }
-          }
-          if (e.which == keyCode.ESCAPE) {
-            if (!getEditorLock().isActive()) {
-              return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)
-            }
-            cancelEditAndSetFocus();
-          } else if (e.which == keyCode.PAGE_DOWN) {
-            navigatePageDown();
-            handled = true;
-          } else if (e.which == keyCode.PAGE_UP) {
-            navigatePageUp();
-            handled = true;
-          } else if (e.which == keyCode.LEFT) {
-            handled = navigateLeft();
-          } else if (e.which == keyCode.RIGHT) {
-            handled = navigateRight();
-          } else if (e.which == keyCode.UP) {
-            handled = navigateUp();
-          } else if (e.which == keyCode.DOWN) {
-            handled = navigateDown();
-          } else if (e.which == keyCode.TAB) {
-            handled = navigateNext();
-          } else if (e.which == keyCode.ENTER) {
-            if (options.editable) {
-              if (currentEditor) {
-                // adding new row
-                if (activeRow === getDataLength()) {
-                  navigateDown();
-                } else {
-                  commitEditAndSetFocus();
-                }
-              } else {
-                if (getEditorLock().commitCurrentEdit()) {
-                  makeActiveCellEditable();
-                }
-              }
-            }
-            handled = true;
-          }
-        } else if (e.which == keyCode.TAB && e.shiftKey && !e.ctrlKey && !e.altKey) {
-          handled = navigatePrev();
-        }
-      }
-
-      if (handled) {
-        // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it
-        e.stopPropagation();
-        e.preventDefault();
-        try {
-          e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)
-        }
-        // ignore exceptions - setting the original event's keycode throws access denied exception for "Ctrl"
-        // (hitting control key only, nothing else), "Shift" (maybe others)
-        catch (error) {
-        }
-      }
-    }
-
-    function handleClick(e) {
-      if (!currentEditor) {
-        // if this click resulted in some cell child node getting focus,
-        // don't steal it back - keyboard events will still bubble up
-        // IE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.
-        if (e.target != document.activeElement || $(e.target).hasClass("slick-cell")) {
-          setFocus();
-        }
-      }
-
-      var cell = getCellFromEvent(e);
-      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {
-        return;
-      }
-
-      trigger(self.onClick, {row: cell.row, cell: cell.cell, grid: self}, e);
-      if (e.isImmediatePropagationStopped()) {
-        return;
-      }
-      
-      // this optimisation causes trouble - MLeibman #329
-      //if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {
-      if (canCellBeActive(cell.row, cell.cell)) {
-        if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {
-          scrollRowIntoView(cell.row, false);
-
-          var preClickModeOn = (e.target && e.target.className === Slick.preClickClassName);
-          setActiveCellInternal(getCellNode(cell.row, cell.cell), null, preClickModeOn);
-        }
-      }
-    }
-
-    function handleContextMenu(e) {
-      var $cell = $(e.target).closest(".slick-cell", $canvas);
-      if ($cell.length === 0) {
-        return;
-      }
-
-      // are we editing this cell?
-      if (activeCellNode === $cell[0] && currentEditor !== null) {
-        return;
-      }
-
-      trigger(self.onContextMenu, {grid: self}, e);
-    }
-
-    function handleDblClick(e) {
-      var cell = getCellFromEvent(e);
-      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {
-        return;
-      }
-
-      trigger(self.onDblClick, {row: cell.row, cell: cell.cell, grid: self}, e);
-      if (e.isImmediatePropagationStopped()) {
-        return;
-      }
-
-      if (options.editable) {
-        gotoCell(cell.row, cell.cell, true);
-      }
-    }
-
-    function handleHeaderMouseEnter(e) {
-      trigger(self.onHeaderMouseEnter, {
-        "column": $(this).data("column"),
-        "grid": self
-      }, e);
-    }
-
-    function handleHeaderMouseLeave(e) {
-      trigger(self.onHeaderMouseLeave, {
-        "column": $(this).data("column"),
-        "grid": self
-      }, e);
-    }
-
-    function handleHeaderContextMenu(e) {
-      var $header = $(e.target).closest(".slick-header-column", ".slick-header-columns");
-      var column = $header && $header.data("column");
-      trigger(self.onHeaderContextMenu, {column: column, grid: self}, e);
-    }
-
-    function handleHeaderClick(e) {
-      var $header = $(e.target).closest(".slick-header-column", ".slick-header-columns");
-      var column = $header && $header.data("column");
-      if (column) {
-        trigger(self.onHeaderClick, {column: column, grid: self}, e);
-      }
-    }
-
-    function handleMouseEnter(e) {
-      trigger(self.onMouseEnter, {grid: self}, e);
-    }
-
-    function handleMouseLeave(e) {
-      trigger(self.onMouseLeave, {grid: self}, e);
-    }
-
-    function cellExists(row, cell) {
-      return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);
-    }
-
-    function getCellFromPoint(x, y) {
-      var row = getRowFromPosition(y);
-      var cell = 0;
-
-      var w = 0;
-      for (var i = 0; i < columns.length && w < x; i++) {
-        w += columns[i].width;
-        cell++;
-      }
-
-      if (cell < 0) {
-        cell = 0;
-      }
-
-      return {row: row, cell: cell - 1};
-    }
-
-    function getCellFromNode(cellNode) {
-      // read column number from .l<columnNumber> CSS class
-      var cls = /l\d+/.exec(cellNode.className);
-      if (!cls) {
-        throw new Error("getCellFromNode: cannot get cell - " + cellNode.className);
-      }
-      return parseInt(cls[0].substr(1, cls[0].length - 1), 10);
-    }
-
-    function getRowFromNode(rowNode) {
-      for (var row in rowsCache) {
-        if (rowsCache[row].rowNode === rowNode) {
-          return row | 0;
-        }
-      }
-
-      return null;
-    }
-
-    function getCellFromEvent(e) {
-      var $cell = $(e.target).closest(".slick-cell", $canvas);
-      if (!$cell.length) {
-        return null;
-      }
-
-      var row = getRowFromNode($cell[0].parentNode);
-      var cell = getCellFromNode($cell[0]);
-
-      if (row == null || cell == null) {
-        return null;
-      } else {
-        return {
-          "row": row,
-          "cell": cell
-        };
-      }
-    }
-
-    function getCellNodeBox(row, cell) {
-      if (!cellExists(row, cell)) {
-        return null;
-      }
-
-      var y1 = getRowTop(row);
-      var y2 = y1 + options.rowHeight - 1;
-      var x1 = 0;
-      for (var i = 0; i < cell; i++) {
-        x1 += columns[i].width;
-      }
-      var x2 = x1 + columns[cell].width;
-
-      return {
-        top: y1,
-        left: x1,
-        bottom: y2,
-        right: x2
-      };
-    }
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Cell switching
-
-    function resetActiveCell() {
-      setActiveCellInternal(null, false);
-    }
-
-    function setFocus() {
-      if (tabbingDirection == -1) {
-        $focusSink[0].focus();
-      } else {
-        $focusSink2[0].focus();
-      }
-    }
-
-    function scrollColumnIntoView(columnIndex) {
-      var colspan = getColspan(row, columnIndex);
-
-      var left = columnPosLeft[columnIndex],
-        right = columnPosRight[columnIndex + (colspan > 1 ? colspan - 1 : 0)],
-        scrollRight = scrollLeft + viewportW;
-
-      if (left < scrollLeft) {
-        $viewport.scrollLeft(left);
-        handleScroll();
-        render();
-      } else if (right > scrollRight) {
-        $viewport.scrollLeft(Math.min(left, right - $viewport[0].clientWidth));
-        handleScroll();
-        render();
-      }
-
-    }
-
-    function scrollCellIntoView(row, cell, doPaging) {
-      scrollRowIntoView(row, doPaging);
-
-      var colspan = getColspan(row, cell);
-      internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)]);
-    }
-
-    function internalScrollColumnIntoView(left, right) {
-      var scrollRight = scrollLeft + viewportW;
-
-      if (left < scrollLeft) {
-        $viewport.scrollLeft(left);
-        handleScroll();
-        render();
-      } else if (right > scrollRight) {
-        $viewport.scrollLeft(Math.min(left, right - $viewport[0].clientWidth));
-        handleScroll();
-        render();
-      }
-    }
-
-    function scrollColumnIntoView(cell) {
-      internalScrollColumnIntoView(columnPosLeft[cell], columnPosRight[cell]);
-    }
-
-    function setActiveCellInternal(newCell, opt_editMode, preClickModeOn, suppressActiveCellChangedEvent) {
-      if (activeCellNode !== null) {
-        makeActiveCellNormal();
-        $(activeCellNode).removeClass("active");
-        if (rowsCache[activeRow]) {
-          $(rowsCache[activeRow].rowNode).removeClass("active");
-        }
-      }
-
-      var activeCellChanged = (activeCellNode !== newCell);
-      activeCellNode = newCell;
-
-      if (activeCellNode != null) {
-        activeRow = getRowFromNode(activeCellNode.parentNode);
-        activeCell = activePosX = getCellFromNode(activeCellNode);
-
-        if (opt_editMode == null) {
-          opt_editMode = (activeRow == getDataLength()) || options.autoEdit;
-        }
-
-        if (options.showCellSelection) {
-        $(activeCellNode).addClass("active");
-        $(rowsCache[activeRow].rowNode).addClass("active");
-        }
-
-        if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {
-          clearTimeout(h_editorLoader);
-
-          if (options.asyncEditorLoading) {
-            h_editorLoader = setTimeout(function () {
-              makeActiveCellEditable(undefined, preClickModeOn);
-            }, options.asyncEditorLoadDelay);
-          } else {
-            makeActiveCellEditable(undefined, preClickModeOn);
-          }
-        }
-      } else {
-        activeRow = activeCell = null;
-      }
-    
-      // this optimisation causes trouble - MLeibman #329
-      //if (activeCellChanged) {
-      if (!suppressActiveCellChangedEvent) { trigger(self.onActiveCellChanged, getActiveCell()); }
-      //}
-    }
-
-    function clearTextSelection() {
-      if (document.selection && document.selection.empty) {
-        try {
-          //IE fails here if selected element is not in dom
-          document.selection.empty();
-        } catch (e) { }
-      } else if (window.getSelection) {
-        var sel = window.getSelection();
-        if (sel && sel.removeAllRanges) {
-          sel.removeAllRanges();
-        }
-      }
-    }
-
-    function isCellPotentiallyEditable(row, cell) {
-      var dataLength = getDataLength();
-      // is the data for this row loaded?
-      if (row < dataLength && !getDataItem(row)) {
-        return false;
-      }
-
-      // are we in the Add New row?  can we create new from this cell?
-      if (columns[cell].cannotTriggerInsert && row >= dataLength) {
-        return false;
-      }
-
-      // does this cell have an editor?
-      if (!getEditor(row, cell)) {
-        return false;
-      }
-
-      return true;
-    }
-
-    function makeActiveCellNormal() {
-      if (!currentEditor) {
-        return;
-      }
-      trigger(self.onBeforeCellEditorDestroy, {editor: currentEditor, grid: self});
-      currentEditor.destroy();
-      currentEditor = null;
-
-      if (activeCellNode) {
-        var d = getDataItem(activeRow);
-        $(activeCellNode).removeClass("editable invalid");
-        if (d) {
-          var column = columns[activeCell];
-          var formatter = getFormatter(activeRow, column);
-          var formatterResult =  formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d, self);
-          applyFormatResultToCellNode(formatterResult, activeCellNode);
-          invalidatePostProcessingResults(activeRow);
-        }
-      }
-      
-      // if there previously was text selected on a page (such as selected text in the edit cell just removed),
-      // IE can't set focus to anything else correctly
-      if (navigator.userAgent.toLowerCase().match(/msie/)) {
-        clearTextSelection();
-      }
-
-      getEditorLock().deactivate(editController);
-    }
-
-    function makeActiveCellEditable(editor, preClickModeOn) {
-      if (!activeCellNode) {
-        return;
-      }
-      if (!options.editable) {
-        throw new Error("Grid : makeActiveCellEditable : should never get called when options.editable is false");
-      }
-
-      // cancel pending async call if there is one
-      clearTimeout(h_editorLoader);
-
-      if (!isCellPotentiallyEditable(activeRow, activeCell)) {
-        return;
-      }
-
-      var columnDef = columns[activeCell];
-      var item = getDataItem(activeRow);
-
-      if (trigger(self.onBeforeEditCell, {row: activeRow, cell: activeCell, item: item, column: columnDef, grid: self}) === false) {
-        setFocus();
-        return;
-      }
-
-      getEditorLock().activate(editController);
-      $(activeCellNode).addClass("editable");
-
-      var useEditor = editor || getEditor(activeRow, activeCell);
-
-      // don't clear the cell if a custom editor is passed through
-      if (!editor && !useEditor.suppressClearOnEdit) {
-        activeCellNode.innerHTML = "";
-      }
-
-      currentEditor = new useEditor({
-        grid: self,
-        gridPosition: absBox($container[0]),
-        position: absBox(activeCellNode),
-        container: activeCellNode,
-        column: columnDef,
-        item: item || {},
-        commitChanges: commitEditAndSetFocus,
-        cancelChanges: cancelEditAndSetFocus
-      });
-
-      if (item) {
-        currentEditor.loadValue(item);
-        if (preClickModeOn && currentEditor.preClick) {
-          currentEditor.preClick();
-        }
-      }
-
-      serializedEditorValue = currentEditor.serializeValue();
-
-      if (currentEditor.position) {
-        handleActiveCellPositionChange();
-      }
-    }
-
-    function commitEditAndSetFocus() {
-      // if the commit fails, it would do so due to a validation error
-      // if so, do not steal the focus from the editor
-      if (getEditorLock().commitCurrentEdit()) {
-        setFocus();
-        if (options.autoEdit) {
-          navigateDown();
-        }
-      }
-    }
-
-    function cancelEditAndSetFocus() {
-      if (getEditorLock().cancelCurrentEdit()) {
-        setFocus();
-      }
-    }
-
-    function absBox(elem) {
-      var box = {
-        top: elem.offsetTop,
-        left: elem.offsetLeft,
-        bottom: 0,
-        right: 0,
-        width: $(elem).outerWidth(),
-        height: $(elem).outerHeight(),
-        visible: true};
-      box.bottom = box.top + box.height;
-      box.right = box.left + box.width;
-
-      // walk up the tree
-      var offsetParent = elem.offsetParent;
-      while ((elem = elem.parentNode) != document.body) {
-        if (elem == null) break;
-
-        if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css("overflowY") != "visible") {
-          box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;
-        }
-
-        if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css("overflowX") != "visible") {
-          box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;
-        }
-
-        box.left -= elem.scrollLeft;
-        box.top -= elem.scrollTop;
-
-        if (elem === offsetParent) {
-          box.left += elem.offsetLeft;
-          box.top += elem.offsetTop;
-          offsetParent = elem.offsetParent;
-        }
-
-        box.bottom = box.top + box.height;
-        box.right = box.left + box.width;
-      }
-
-      return box;
-    }
-
-    function getActiveCellPosition() {
-      return absBox(activeCellNode);
-    }
-
-    function getGridPosition() {
-      return absBox($container[0])
-    }
-
-    function handleActiveCellPositionChange() {
-      if (!activeCellNode) {
-        return;
-      }
-
-      trigger(self.onActiveCellPositionChanged, {grid: self});
-
-      if (currentEditor) {
-        var cellBox = getActiveCellPosition();
-        if (currentEditor.show && currentEditor.hide) {
-          if (!cellBox.visible) {
-            currentEditor.hide();
-          } else {
-            currentEditor.show();
-          }
-        }
-
-        if (currentEditor.position) {
-          currentEditor.position(cellBox);
-        }
-      }
-    }
-
-    function getCellEditor() {
-      return currentEditor;
-    }
-
-    function getActiveCell() {
-      if (!activeCellNode) {
-        return null;
-      } else {
-        return {row: activeRow, cell: activeCell, grid: self};
-      }
-    }
-
-    function getActiveCellNode() {
-      return activeCellNode;
-    }
-
-    function scrollRowIntoView(row, doPaging) {
-      var rowAtTop = row * options.rowHeight;
-      var rowAtBottom = (row + 1) * options.rowHeight - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0);
-
-      // need to page down?
-      if ((row + 1) * options.rowHeight > scrollTop + viewportH + offset) {
-        scrollTo(doPaging ? rowAtTop : rowAtBottom);
-        render();
-      }
-      // or page up?
-      else if (row * options.rowHeight < scrollTop + offset) {
-        scrollTo(doPaging ? rowAtBottom : rowAtTop);
-        render();
-      }
-    }
-
-    function scrollRowToTop(row) {
-      scrollTo(row * options.rowHeight);
-      render();
-    }
-
-    function scrollPage(dir) {
-      var deltaRows = dir * numVisibleRows;
-      scrollTo((getRowFromPosition(scrollTop) + deltaRows) * options.rowHeight);
-      render();
-
-      if (options.enableCellNavigation && activeRow != null) {
-        var row = activeRow + deltaRows;
-        var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
-        if (row >= dataLengthIncludingAddNew) {
-          row = dataLengthIncludingAddNew - 1;
-        }
-        if (row < 0) {
-          row = 0;
-        }
-
-        var cell = 0, prevCell = null;
-        var prevActivePosX = activePosX;
-        while (cell <= activePosX) {
-          if (canCellBeActive(row, cell)) {
-            prevCell = cell;
-          }
-          cell += getColspan(row, cell);
-        }
-
-        if (prevCell !== null) {
-          setActiveCellInternal(getCellNode(row, prevCell));
-          activePosX = prevActivePosX;
-        } else {
-          resetActiveCell();
-        }
-      }
-    }
-
-    function navigatePageDown() {
-      scrollPage(1);
-    }
-
-    function navigatePageUp() {
-      scrollPage(-1);
-    }
-
-    function getColspan(row, cell) {
-      var metadata = data.getItemMetadata && data.getItemMetadata(row);
-      if (!metadata || !metadata.columns) {
-        return 1;
-      }
-
-      var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];
-      var colspan = (columnData && columnData.colspan);
-      if (colspan === "*") {
-        colspan = columns.length - cell;
-      } else {
-        colspan = colspan || 1;
-      }
-
-      return colspan;
-    }
-
-    function findFirstFocusableCell(row) {
-      var cell = 0;
-      while (cell < columns.length) {
-        if (canCellBeActive(row, cell)) {
-          return cell;
-        }
-        cell += getColspan(row, cell);
-      }
-      return null;
-    }
-
-    function findLastFocusableCell(row) {
-      var cell = 0;
-      var lastFocusableCell = null;
-      while (cell < columns.length) {
-        if (canCellBeActive(row, cell)) {
-          lastFocusableCell = cell;
-        }
-        cell += getColspan(row, cell);
-      }
-      return lastFocusableCell;
-    }
-
-    function gotoRight(row, cell, posX) {
-      if (cell >= columns.length) {
-        return null;
-      }
-
-      do {
-        cell += getColspan(row, cell);
-      }
-      while (cell < columns.length && !canCellBeActive(row, cell));
-
-      if (cell < columns.length) {
-        return {
-          "row": row,
-          "cell": cell,
-          "posX": cell
-        };
-      }
-      return null;
-    }
-
-    function gotoLeft(row, cell, posX) {
-      if (cell <= 0) {
-        return null;
-      }
-
-      var firstFocusableCell = findFirstFocusableCell(row);
-      if (firstFocusableCell === null || firstFocusableCell >= cell) {
-        return null;
-      }
-
-      var prev = {
-        "row": row,
-        "cell": firstFocusableCell,
-        "posX": firstFocusableCell
-      };
-      var pos;
-      while (true) {
-        pos = gotoRight(prev.row, prev.cell, prev.posX);
-        if (!pos) {
-          return null;
-        }
-        if (pos.cell >= cell) {
-          return prev;
-        }
-        prev = pos;
-      }
-    }
-
-    function gotoDown(row, cell, posX) {
-      var prevCell;
-      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
-      while (true) {
-        if (++row >= dataLengthIncludingAddNew) {
-          return null;
-        }
-
-        prevCell = cell = 0;
-        while (cell <= posX) {
-          prevCell = cell;
-          cell += getColspan(row, cell);
-        }
-
-        if (canCellBeActive(row, prevCell)) {
-          return {
-            "row": row,
-            "cell": prevCell,
-            "posX": posX
-          };
-        }
-      }
-    }
-
-    function gotoUp(row, cell, posX) {
-      var prevCell;
-      while (true) {
-        if (--row < 0) {
-          return null;
-        }
-
-        prevCell = cell = 0;
-        while (cell <= posX) {
-          prevCell = cell;
-          cell += getColspan(row, cell);
-        }
-
-        if (canCellBeActive(row, prevCell)) {
-          return {
-            "row": row,
-            "cell": prevCell,
-            "posX": posX
-          };
-        }
-      }
-    }
-
-    function gotoNext(row, cell, posX) {
-      if (row == null && cell == null) {
-        row = cell = posX = 0;
-        if (canCellBeActive(row, cell)) {
-          return {
-            "row": row,
-            "cell": cell,
-            "posX": cell
-          };
-        }
-      }
-
-      var pos = gotoRight(row, cell, posX);
-      if (pos) {
-        return pos;
-      }
-
-      var firstFocusableCell = null;
-      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
-
-      // if at last row, cycle through columns rather than get stuck in the last one
-      if (row === dataLengthIncludingAddNew - 1) { row--; }
-
-      while (++row < dataLengthIncludingAddNew) {
-        firstFocusableCell = findFirstFocusableCell(row);
-        if (firstFocusableCell !== null) {
-          return {
-            "row": row,
-            "cell": firstFocusableCell,
-            "posX": firstFocusableCell
-          };
-        }
-      }
-      return null;
-    }
-
-    function gotoPrev(row, cell, posX) {
-      if (row == null && cell == null) {
-        row = getDataLengthIncludingAddNew() - 1;
-        cell = posX = columns.length - 1;
-        if (canCellBeActive(row, cell)) {
-          return {
-            "row": row,
-            "cell": cell,
-            "posX": cell
-          };
-        }
-      }
-
-      var pos;
-      var lastSelectableCell;
-      while (!pos) {
-        pos = gotoLeft(row, cell, posX);
-        if (pos) {
-          break;
-        }
-        if (--row < 0) {
-          return null;
-        }
-
-        cell = 0;
-        lastSelectableCell = findLastFocusableCell(row);
-        if (lastSelectableCell !== null) {
-          pos = {
-            "row": row,
-            "cell": lastSelectableCell,
-            "posX": lastSelectableCell
-          };
-        }
-      }
-      return pos;
-    }
-
-    function navigateRight() {
-      return navigate("right");
-    }
-
-    function navigateLeft() {
-      return navigate("left");
-    }
-
-    function navigateDown() {
-      return navigate("down");
-    }
-
-    function navigateUp() {
-      return navigate("up");
-    }
-
-    function navigateNext() {
-      return navigate("next");
-    }
-
-    function navigatePrev() {
-      return navigate("prev");
-    }
-
-    /**
-     * @param {string} dir Navigation direction.
-     * @return {boolean} Whether navigation resulted in a change of active cell.
-     */
-    function navigate(dir) {
-      if (!options.enableCellNavigation) {
-        return false;
-      }
-
-      if (!activeCellNode && dir != "prev" && dir != "next") {
-        return false;
-      }
-
-      if (!getEditorLock().commitCurrentEdit()) {
-        return true;
-      }
-      setFocus();
-
-      var tabbingDirections = {
-        "up": -1,
-        "down": 1,
-        "left": -1,
-        "right": 1,
-        "prev": -1,
-        "next": 1
-      };
-      tabbingDirection = tabbingDirections[dir];
-
-      var stepFunctions = {
-        "up": gotoUp,
-        "down": gotoDown,
-        "left": gotoLeft,
-        "right": gotoRight,
-        "prev": gotoPrev,
-        "next": gotoNext
-      };
-      var stepFn = stepFunctions[dir];
-      var pos = stepFn(activeRow, activeCell, activePosX);
-      if (pos) {
-        var isAddNewRow = (pos.row == getDataLength());
-        scrollCellIntoView(pos.row, pos.cell, !isAddNewRow);
-        setActiveCellInternal(getCellNode(pos.row, pos.cell));
-        activePosX = pos.posX;
-        return true;
-      } else {
-        setActiveCellInternal(getCellNode(activeRow, activeCell));
-        return false;
-      }
-    }
-
-    function getCellNode(row, cell) {
-      if (rowsCache[row]) {
-        ensureCellNodesInRowsCache(row);
-        return rowsCache[row].cellNodesByColumnIdx[cell];
-      }
-      return null;
-    }
-
-    function setActiveCell(row, cell, opt_editMode, preClickModeOn, suppressActiveCellChangedEvent) {
-      if (!initialized) { return; }
-      if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {
-        return;
-      }
-
-      if (!options.enableCellNavigation) {
-        return;
-      }
-
-      scrollCellIntoView(row, cell, false);
-      setActiveCellInternal(getCellNode(row, cell), opt_editMode, preClickModeOn, suppressActiveCellChangedEvent);
-    }
-
-    function canCellBeActive(row, cell) {
-      if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||
-          row < 0 || cell >= columns.length || cell < 0) {
-        return false;
-      }
-
-      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
-      if (rowMetadata && typeof rowMetadata.focusable === "boolean") {
-        return rowMetadata.focusable;
-      }
-
-      var columnMetadata = rowMetadata && rowMetadata.columns;
-      if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable === "boolean") {
-        return columnMetadata[columns[cell].id].focusable;
-      }
-      if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable === "boolean") {
-        return columnMetadata[cell].focusable;
-      }
-
-      return columns[cell].focusable;
-    }
-
-    function canCellBeSelected(row, cell) {
-      if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {
-        return false;
-      }
-
-      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
-      if (rowMetadata && typeof rowMetadata.selectable === "boolean") {
-        return rowMetadata.selectable;
-      }
-
-      var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);
-      if (columnMetadata && typeof columnMetadata.selectable === "boolean") {
-        return columnMetadata.selectable;
-      }
-
-      return columns[cell].selectable;
-    }
-
-    function gotoCell(row, cell, forceEdit) {
-      if (!initialized) { return; }
-      if (!canCellBeActive(row, cell)) {
-        return;
-      }
-
-      if (!getEditorLock().commitCurrentEdit()) {
-        return;
-      }
-
-      scrollCellIntoView(row, cell, false);
-
-      var newCell = getCellNode(row, cell);
-
-      // if selecting the 'add new' row, start editing right away
-      setActiveCellInternal(newCell, forceEdit || (row === getDataLength()) || options.autoEdit);
-
-      // if no editor was created, set the focus back on the grid
-      if (!currentEditor) {
-        setFocus();
-      }
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // IEditor implementation for the editor lock
-
-    function commitCurrentEdit() {
-      var item = getDataItem(activeRow);
-      var column = columns[activeCell];
-
-      if (currentEditor) {
-        if (currentEditor.isValueChanged()) {
-          var validationResults = currentEditor.validate();
-
-          if (validationResults.valid) {
-            if (activeRow < getDataLength()) {
-              var editCommand = {
-                row: activeRow,
-                cell: activeCell,
-                editor: currentEditor,
-                serializedValue: currentEditor.serializeValue(),
-                prevSerializedValue: serializedEditorValue,
-                execute: function () {
-                  this.editor.applyValue(item, this.serializedValue);
-                  updateRow(this.row);
-                  trigger(self.onCellChange, {
-                    row: activeRow,
-                    cell: activeCell,
-                    item: item,
-                    grid: self
-                  });
-                },
-                undo: function () {
-                  this.editor.applyValue(item, this.prevSerializedValue);
-                  updateRow(this.row);
-                  trigger(self.onCellChange, {
-                    row: activeRow,
-                    cell: activeCell,
-                    item: item,
-                    grid: self
-                  });
-                }
-              };
-
-              if (options.editCommandHandler) {
-                makeActiveCellNormal();
-                options.editCommandHandler(item, column, editCommand);
-              } else {
-                editCommand.execute();
-                makeActiveCellNormal();
-              }
-
-            } else {
-              var newItem = {};
-              currentEditor.applyValue(newItem, currentEditor.serializeValue());
-              makeActiveCellNormal();
-              trigger(self.onAddNewRow, {item: newItem, column: column, grid: self});
-            }
-
-            // check whether the lock has been re-acquired by event handlers
-            return !getEditorLock().isActive();
-          } else {
-            // Re-add the CSS class to trigger transitions, if any.
-            $(activeCellNode).removeClass("invalid");
-            $(activeCellNode).width();  // force layout
-            $(activeCellNode).addClass("invalid");
-
-            trigger(self.onValidationError, {
-              editor: currentEditor,
-              cellNode: activeCellNode,
-              validationResults: validationResults,
-              row: activeRow,
-              cell: activeCell,
-              column: column,
-              grid: self
-            });
-
-            currentEditor.focus();
-            return false;
-          }
-        }
-
-        makeActiveCellNormal();
-      }
-      return true;
-    }
-
-    function cancelCurrentEdit() {
-      makeActiveCellNormal();
-      return true;
-    }
-
-    function rowsToRanges(rows) {
-      var ranges = [];
-      var lastCell = columns.length - 1;
-      for (var i = 0; i < rows.length; i++) {
-        ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
-      }
-      return ranges;
-    }
-
-    function getSelectedRows() {
-      if (!selectionModel) {
-        throw new Error("Selection model is not set");
-      }
-      return selectedRows;
-    }
-
-    function setSelectedRows(rows) {
-      if (!selectionModel) {
-        throw new Error("Selection model is not set");
-      }
-      selectionModel.setSelectedRanges(rowsToRanges(rows));
-    }
-
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Debug
-
-    this.debug = function () {
-      var s = "";
-
-      s += ("\n" + "counter_rows_rendered:  " + counter_rows_rendered);
-      s += ("\n" + "counter_rows_removed:  " + counter_rows_removed);
-      s += ("\n" + "renderedRows:  " + renderedRows);
-      s += ("\n" + "numVisibleRows:  " + numVisibleRows);
-      s += ("\n" + "maxSupportedCssHeight:  " + maxSupportedCssHeight);
-      s += ("\n" + "n(umber of pages):  " + n);
-      s += ("\n" + "(current) page:  " + page);
-      s += ("\n" + "page height (ph):  " + ph);
-      s += ("\n" + "vScrollDir:  " + vScrollDir);
-
-      alert(s);
-    };
-
-    // a debug helper to be able to access private members
-    this.eval = function (expr) {
-      return eval(expr);
-    };
-
-    //////////////////////////////////////////////////////////////////////////////////////////////
-    // Public API
-
-    $.extend(this, {
-      "slickGridVersion": "2.3.4",
-
-      // Events
-      "onScroll": new Slick.Event(),
-      "onSort": new Slick.Event(),
-      "onHeaderMouseEnter": new Slick.Event(),
-      "onHeaderMouseLeave": new Slick.Event(),
-      "onHeaderContextMenu": new Slick.Event(),
-      "onHeaderClick": new Slick.Event(),
-      "onHeaderCellRendered": new Slick.Event(),
-      "onBeforeHeaderCellDestroy": new Slick.Event(),
-      "onHeaderRowCellRendered": new Slick.Event(),
-      "onFooterRowCellRendered": new Slick.Event(),
-      "onBeforeHeaderRowCellDestroy": new Slick.Event(),
-      "onBeforeFooterRowCellDestroy": new Slick.Event(),
-      "onMouseEnter": new Slick.Event(),
-      "onMouseLeave": new Slick.Event(),
-      "onClick": new Slick.Event(),
-      "onDblClick": new Slick.Event(),
-      "onContextMenu": new Slick.Event(),
-      "onKeyDown": new Slick.Event(),
-      "onAddNewRow": new Slick.Event(),
-      "onBeforeAppendCell": new Slick.Event(),
-      "onValidationError": new Slick.Event(),
-      "onViewportChanged": new Slick.Event(),
-      "onColumnsReordered": new Slick.Event(),
-      "onColumnsResized": new Slick.Event(),
-      "onCellChange": new Slick.Event(),
-      "onBeforeEditCell": new Slick.Event(),
-      "onBeforeCellEditorDestroy": new Slick.Event(),
-      "onBeforeDestroy": new Slick.Event(),
-      "onActiveCellChanged": new Slick.Event(),
-      "onActiveCellPositionChanged": new Slick.Event(),
-      "onDragInit": new Slick.Event(),
-      "onDragStart": new Slick.Event(),
-      "onDrag": new Slick.Event(),
-      "onDragEnd": new Slick.Event(),
-      "onSelectedRowsChanged": new Slick.Event(),
-      "onCellCssStylesChanged": new Slick.Event(),
-
-      // Methods
-      "registerPlugin": registerPlugin,
-      "unregisterPlugin": unregisterPlugin,
-      "getColumns": getColumns,
-      "setColumns": setColumns,
-      "getColumnIndex": getColumnIndex,
-      "updateColumnHeader": updateColumnHeader,
-      "setSortColumn": setSortColumn,
-      "setSortColumns": setSortColumns,
-      "getSortColumns": getSortColumns,
-      "autosizeColumns": autosizeColumns,
-      "getOptions": getOptions,
-      "setOptions": setOptions,
-      "getData": getData,
-      "getDataLength": getDataLength,
-      "getDataItem": getDataItem,
-      "setData": setData,
-      "getSelectionModel": getSelectionModel,
-      "setSelectionModel": setSelectionModel,
-      "getSelectedRows": getSelectedRows,
-      "setSelectedRows": setSelectedRows,
-      "getContainerNode": getContainerNode,
-      "updatePagingStatusFromView": updatePagingStatusFromView,
-
-      "render": render,
-      "invalidate": invalidate,
-      "invalidateRow": invalidateRow,
-      "invalidateRows": invalidateRows,
-      "invalidateAllRows": invalidateAllRows,
-      "updateCell": updateCell,
-      "updateRow": updateRow,
-      "getViewport": getVisibleRange,
-      "getRenderedRange": getRenderedRange,
-      "resizeCanvas": resizeCanvas,
-      "updateRowCount": updateRowCount,
-      "scrollRowIntoView": scrollRowIntoView,
-      "scrollRowToTop": scrollRowToTop,
-      "scrollCellIntoView": scrollCellIntoView,
-      "scrollColumnIntoView": scrollColumnIntoView,
-      "getCanvasNode": getCanvasNode,
-      "focus": setFocus,
-
-      "getCellFromPoint": getCellFromPoint,
-      "getCellFromEvent": getCellFromEvent,
-      "getActiveCell": getActiveCell,
-      "setActiveCell": setActiveCell,
-      "getActiveCellNode": getActiveCellNode,
-      "getActiveCellPosition": getActiveCellPosition,
-      "resetActiveCell": resetActiveCell,
-      "editActiveCell": makeActiveCellEditable,
-      "getCellEditor": getCellEditor,
-      "getCellNode": getCellNode,
-      "getCellNodeBox": getCellNodeBox,
-      "canCellBeSelected": canCellBeSelected,
-      "canCellBeActive": canCellBeActive,
-      "navigatePrev": navigatePrev,
-      "navigateNext": navigateNext,
-      "navigateUp": navigateUp,
-      "navigateDown": navigateDown,
-      "navigateLeft": navigateLeft,
-      "navigateRight": navigateRight,
-      "navigatePageUp": navigatePageUp,
-      "navigatePageDown": navigatePageDown,
-      "gotoCell": gotoCell,
-      "getTopPanel": getTopPanel,
-      "setTopPanelVisibility": setTopPanelVisibility,
-      "setHeaderRowVisibility": setHeaderRowVisibility,
-      "getHeaderRow": getHeaderRow,
-      "getHeaderRowColumn": getHeaderRowColumn,
-      "setFooterRowVisibility": setFooterRowVisibility,
-      "getFooterRow": getFooterRow,
-      "getFooterRowColumn": getFooterRowColumn,
-      "getGridPosition": getGridPosition,
-      "flashCell": flashCell,
-      "addCellCssStyles": addCellCssStyles,
-      "setCellCssStyles": setCellCssStyles,
-      "removeCellCssStyles": removeCellCssStyles,
-      "getCellCssStyles": getCellCssStyles,
-
-      "init": finishInitialization,
-      "destroy": destroy,
-
-      // IEditor implementation
-      "getEditorLock": getEditorLock,
-      "getEditController": getEditController
-    });
-
-    init();
-  }
-}(jQuery));
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.groupitemmetadataprovider.js b/web/pgadmin/static/vendor/slickgrid/slick.groupitemmetadataprovider.js
deleted file mode 100644
index de05c721..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.groupitemmetadataprovider.js
+++ /dev/null
@@ -1,158 +0,0 @@
-(function ($) {
-  $.extend(true, window, {
-    Slick: {
-      Data: {
-        GroupItemMetadataProvider: GroupItemMetadataProvider
-      }
-    }
-  });
-
-
-  /***
-   * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.
-   * This metadata overrides the default behavior and formatting of those rows so that they appear and function
-   * correctly when processed by the grid.
-   *
-   * This class also acts as a grid plugin providing event handlers to expand & collapse groups.
-   * If "grid.registerPlugin(...)" is not called, expand & collapse will not work.
-   *
-   * @class GroupItemMetadataProvider
-   * @module Data
-   * @namespace Slick.Data
-   * @constructor
-   * @param options
-   */
-  function GroupItemMetadataProvider(options) {
-    var _grid;
-    var _defaults = {
-      groupCssClass: "slick-group",
-      groupTitleCssClass: "slick-group-title",
-      totalsCssClass: "slick-group-totals",
-      groupFocusable: true,
-      totalsFocusable: false,
-      toggleCssClass: "slick-group-toggle",
-      toggleExpandedCssClass: "expanded",
-      toggleCollapsedCssClass: "collapsed",
-      enableExpandCollapse: true,
-      groupFormatter: defaultGroupCellFormatter,
-      totalsFormatter: defaultTotalsCellFormatter
-    };
-
-    options = $.extend(true, {}, _defaults, options);
-
-
-    function defaultGroupCellFormatter(row, cell, value, columnDef, item) {
-      if (!options.enableExpandCollapse) {
-        return item.title;
-      }
-
-      var indentation = item.level * 15 + "px";
-
-      return "<span class='" + options.toggleCssClass + " " +
-          (item.collapsed ? options.toggleCollapsedCssClass : options.toggleExpandedCssClass) +
-          "' style='margin-left:" + indentation +"'>" +
-          "</span>" +
-          "<span class='" + options.groupTitleCssClass + "' level='" + item.level + "'>" +
-            item.title +
-          "</span>";
-    }
-
-    function defaultTotalsCellFormatter(row, cell, value, columnDef, item) {
-      return (columnDef.groupTotalsFormatter && columnDef.groupTotalsFormatter(item, columnDef)) || "";
-    }
-
-
-    function init(grid) {
-      _grid = grid;
-      _grid.onClick.subscribe(handleGridClick);
-      _grid.onKeyDown.subscribe(handleGridKeyDown);
-
-    }
-
-    function destroy() {
-      if (_grid) {
-        _grid.onClick.unsubscribe(handleGridClick);
-        _grid.onKeyDown.unsubscribe(handleGridKeyDown);
-      }
-    }
-
-    function handleGridClick(e, args) {
-      var item = this.getDataItem(args.row);
-      if (item && item instanceof Slick.Group && $(e.target).hasClass(options.toggleCssClass)) {
-        var range = _grid.getRenderedRange();
-        this.getData().setRefreshHints({
-          ignoreDiffsBefore: range.top,
-          ignoreDiffsAfter: range.bottom + 1
-        });
-
-        if (item.collapsed) {
-          this.getData().expandGroup(item.groupingKey);
-        } else {
-          this.getData().collapseGroup(item.groupingKey);
-        }
-
-        e.stopImmediatePropagation();
-        e.preventDefault();
-      }
-    }
-
-    // TODO:  add -/+ handling
-    function handleGridKeyDown(e, args) {
-      if (options.enableExpandCollapse && (e.which == $.ui.keyCode.SPACE)) {
-        var activeCell = this.getActiveCell();
-        if (activeCell) {
-          var item = this.getDataItem(activeCell.row);
-          if (item && item instanceof Slick.Group) {
-            var range = _grid.getRenderedRange();
-            this.getData().setRefreshHints({
-              ignoreDiffsBefore: range.top,
-              ignoreDiffsAfter: range.bottom + 1
-            });
-
-            if (item.collapsed) {
-              this.getData().expandGroup(item.groupingKey);
-            } else {
-              this.getData().collapseGroup(item.groupingKey);
-            }
-
-            e.stopImmediatePropagation();
-            e.preventDefault();
-          }
-        }
-      }
-    }
-
-    function getGroupRowMetadata(item) {
-      return {
-        selectable: false,
-        focusable: options.groupFocusable,
-        cssClasses: options.groupCssClass,
-        columns: {
-          0: {
-            colspan: "*",
-            formatter: options.groupFormatter,
-            editor: null
-          }
-        }
-      };
-    }
-
-    function getTotalsRowMetadata(item) {
-      return {
-        selectable: false,
-        focusable: options.totalsFocusable,
-        cssClasses: options.totalsCssClass,
-        formatter: options.totalsFormatter,
-        editor: null
-      };
-    }
-
-
-    return {
-      "init": init,
-      "destroy": destroy,
-      "getGroupRowMetadata": getGroupRowMetadata,
-      "getTotalsRowMetadata": getTotalsRowMetadata
-    };
-  }
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.remotemodel-yahoo.js b/web/pgadmin/static/vendor/slickgrid/slick.remotemodel-yahoo.js
deleted file mode 100644
index fb11d85a..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.remotemodel-yahoo.js
+++ /dev/null
@@ -1,206 +0,0 @@
-(function ($) {
-  /***
-   * A sample AJAX data store implementation.
-   * Right now, it's hooked up to load Hackernews stories, but can
-   * easily be extended to support any JSONP-compatible backend that accepts paging parameters.
-   */
-  function RemoteModel() {
-    // private
-    var PAGESIZE = 10;
-    var data = {length: 0};
-    var h_request = null;
-    var req = null; // ajax request
-
-    // events
-    var onDataLoading = new Slick.Event();
-    var onDataLoaded = new Slick.Event();
-
-
-    function init() {
-    }
-
-
-    function isDataLoaded(from, to) {
-      for (var i = from; i <= to; i++) {
-        if (data[i] == undefined || data[i] == null) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-
-
-    function clear() {
-      for (var key in data) {
-        delete data[key];
-      }
-      data.length = 0;
-    }
-
-    function ensureData(from, to) {
-      if (req) {
-        req.abort();
-        for (var i = req.fromPage; i <= req.toPage; i++) {
-          data[i * PAGESIZE] = undefined;
-        }
-      }
-
-      if (from < 0) {
-        from = 0;
-      }
-
-      if (data.length > 0) {
-        to = Math.min(to, data.length - 1);
-      }
-
-      var fromPage = Math.floor(from / PAGESIZE);
-      var toPage = Math.floor(to / PAGESIZE);
-
-      while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
-        fromPage++;
-
-      while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
-        toPage--;
-
-      if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {
-        // TODO:  look-ahead
-        onDataLoaded.notify({from: from, to: to});
-        return;
-      }
-
-      var recStart = (fromPage * PAGESIZE);
-      var recCount = (((toPage - fromPage) * PAGESIZE) + PAGESIZE);
-
-      var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20rss"
-        + "(" + recStart + "%2C" + recCount + ")"
-        + "%20where%20url%3D%22http%3A%2F%2Frss.news.yahoo.com%2Frss%2Ftopstories%22"
-        + "&format=json";
-
-      if (h_request != null) {
-        clearTimeout(h_request);
-      }
-
-      h_request = setTimeout(function () {
-        for (var i = fromPage; i <= toPage; i++)
-          data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'
-
-        onDataLoading.notify({from: from, to: to});
-
-        req = $.jsonp({
-          url: url,
-          callbackParameter: "callback",
-          cache: true,
-          success: function (json, textStatus, xOptions) {
-            onSuccess(json, recStart)
-          },
-          error: function () {
-            onError(fromPage, toPage)
-          }
-        });
-
-        req.fromPage = fromPage;
-        req.toPage = toPage;
-      }, 50);
-    }
-
-
-    function onError(fromPage, toPage) {
-      alert("error loading pages " + fromPage + " to " + toPage);
-    }
-
-// SAMPLE DATA
-//    {
-//      "query": {
-//        "count": 40,
-//        "created": "2015-03-03T00:34:00Z",
-//        "lang": "en-US",
-//        "results": {
-//          "item": [
-//            {
-//              "title": "Netanyahu assails Iran deal, touts US-Israel ties",
-//              "description": "<p><a href=\"http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html\"><img src=\"http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg\" width=\"130\" height=\"86\" alt=\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\" align=\"left\" title=\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\" border=\"0\" /></a>WASHINGTON (AP) — Seeking to lower tensions, Benjamin Netanyahu and U.S. officials cast their dispute over Iran as a family squabble on Monday, even as the Israeli leader claimed President Barack Obama did not — and could not — fully understand his nation&#039;s vital security concerns.</p><br clear=\"all\"/>",
-//              "link": "http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html",
-//              "pubDate": "Mon, 02 Mar 2015 19:17:36 -0500",
-//              "source": {
-//                "url": "http://www.ap.org/",
-//                "content": "Associated Press"
-//              },
-//              "guid": {
-//                "isPermaLink": "false",
-//                "content": "netanyahu-us-officials-face-off-iran-133539021--politics"
-//              },
-//              "content": {
-//                "height": "86",
-//                "type": "image/jpeg",
-//                "url": "http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg",
-//                "width": "130"
-//              },
-//              "text": {
-//                "type": "html",
-//                "content": "<p><a href=\"http://news.yahoo.com/netanyahu-us-officials-face-off-iran-133539021--politics.html\"><img src=\"http://l2.yimg.com/bt/api/res/1.2/4eoBxbJStrbGAKbmBYOJfg--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTg2O3E9NzU7dz0xMzA-/http://media.zenfs.com/en_us/News/ap_webfeeds/2f3a20c2d46d9f096f0f6a706700d430.jpg\" width=\"130\" height=\"86\" alt=\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\" align=\"left\" title=\"Israeli Prime Minister Benjamin Netanyahu addresses the 2015 American Israel Public Affairs Committee (AIPAC) Policy Conference in Washington, Monday, March 2, 2015. (AP Photo/Cliff Owen)\" border=\"0\" /></a>WASHINGTON (AP) — Seeking to lower tensions, Benjamin Netanyahu and U.S. officials cast their dispute over Iran as a family squabble on Monday, even as the Israeli leader claimed President Barack Obama did not — and could not — fully understand his nation&#039;s vital security concerns.</p><br clear=\"all\"/>"
-//              },
-//              "credit": {
-//                "role": "publishing company"
-//              }
-//            },
-//            {... },
-//            {... },
-//          ]
-//        }
-//      }
-//    }
-
-    function onSuccess(json, recStart) {
-      var recEnd = recStart;
-      if (json.query.count > 0) {
-        var results = json.query.results.item;
-        recEnd = recStart + results.length;
-        data.length = 100;// Math.min(parseInt(results.length),1000); // limitation of the API
-
-        for (var i = 0; i < results.length; i++) {
-          var item = results[i];
-
-          item.pubDate = new Date(item.pubDate);
-
-          data[recStart + i] = { index: recStart + i };
-          data[recStart + i].pubDate = item.pubDate;
-          data[recStart + i].title = item.title;
-          data[recStart + i].url = item.link;
-          data[recStart + i].text = item.description;
-        }
-      }
-      req = null;
-
-      onDataLoaded.notify({from: recStart, to: recEnd});
-    }
-
-
-    function reloadData(from, to) {
-      for (var i = from; i <= to; i++)
-        delete data[i];
-
-      ensureData(from, to);
-    }
-
-    init();
-
-    return {
-      // properties
-      "data": data,
-
-      // methods
-      "clear": clear,
-      "isDataLoaded": isDataLoaded,
-      "ensureData": ensureData,
-      "reloadData": reloadData,
-
-      // events
-      "onDataLoading": onDataLoading,
-      "onDataLoaded": onDataLoaded
-    };
-  }
-
-  // Slick.Data.RemoteModel
-  $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}});
-})(jQuery);
diff --git a/web/pgadmin/static/vendor/slickgrid/slick.remotemodel.js b/web/pgadmin/static/vendor/slickgrid/slick.remotemodel.js
deleted file mode 100644
index f81ca3f4..00000000
--- a/web/pgadmin/static/vendor/slickgrid/slick.remotemodel.js
+++ /dev/null
@@ -1,169 +0,0 @@
-(function ($) {
-  /***
-   * A sample AJAX data store implementation.
-   * Right now, it's hooked up to load search results from Octopart, but can
-   * easily be extended to support any JSONP-compatible backend that accepts paging parameters.
-   */
-  function RemoteModel() {
-    // private
-    var PAGESIZE = 50;
-    var data = {length: 0};
-    var searchstr = "";
-    var sortcol = null;
-    var sortdir = 1;
-    var h_request = null;
-    var req = null; // ajax request
-
-    // events
-    var onDataLoading = new Slick.Event();
-    var onDataLoaded = new Slick.Event();
-
-
-    function init() {
-    }
-
-
-    function isDataLoaded(from, to) {
-      for (var i = from; i <= to; i++) {
-        if (data[i] == undefined || data[i] == null) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-
-
-    function clear() {
-      for (var key in data) {
-        delete data[key];
-      }
-      data.length = 0;
-    }
-
-
-    function ensureData(from, to) {
-      if (req) {
-        req.abort();
-        for (var i = req.fromPage; i <= req.toPage; i++)
-          data[i * PAGESIZE] = undefined;
-      }
-
-      if (from < 0) {
-        from = 0;
-      }
-
-      if (data.length > 0) {
-        to = Math.min(to, data.length - 1);
-      }
-
-      var fromPage = Math.floor(from / PAGESIZE);
-      var toPage = Math.floor(to / PAGESIZE);
-
-      while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
-        fromPage++;
-
-      while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
-        toPage--;
-
-      if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {
-        // TODO:  look-ahead
-        onDataLoaded.notify({from: from, to: to});
-        return;
-      }
-
-      var url = "http://octopart.com/api/v3/parts/search?apikey=68b25f31&include[]=short_description&show[]=uid&show[]=manufacturer&show[]=mpn&show[]=brand&show[]=octopart_url&show[]=short_description&q=" + searchstr + "&start=" + (fromPage * PAGESIZE) + "&limit=" + (((toPage - fromPage) * PAGESIZE) + PAGESIZE);
-
-      if (sortcol != null) {
-        url += ("&sortby=" + sortcol + ((sortdir > 0) ? "+asc" : "+desc"));
-      }
-
-      if (h_request != null) {
-        clearTimeout(h_request);
-      }
-
-      h_request = setTimeout(function () {
-        for (var i = fromPage; i <= toPage; i++)
-          data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'
-
-        onDataLoading.notify({from: from, to: to});
-
-        req = $.jsonp({
-          url: url,
-          callbackParameter: "callback",
-          cache: true,
-          success: onSuccess,
-          error: function () {
-            onError(fromPage, toPage)
-          }
-        });
-        req.fromPage = fromPage;
-        req.toPage = toPage;
-      }, 50);
-    }
-
-
-    function onError(fromPage, toPage) {
-      alert("error loading pages " + fromPage + " to " + toPage);
-    }
-
-    function onSuccess(resp) {
-      var from = resp.request.start, to = from + resp.results.length;
-      data.length = Math.min(parseInt(resp.hits),1000); // limitation of the API
-
-      for (var i = 0; i < resp.results.length; i++) {
-        var item = resp.results[i].item;
-
-        data[from + i] = item;
-        data[from + i].index = from + i;
-      }
-
-      req = null;
-
-      onDataLoaded.notify({from: from, to: to});
-    }
-
-
-    function reloadData(from, to) {
-      for (var i = from; i <= to; i++)
-        delete data[i];
-
-      ensureData(from, to);
-    }
-
-
-    function setSort(column, dir) {
-      sortcol = column;
-      sortdir = dir;
-      clear();
-    }
-
-    function setSearch(str) {
-      searchstr = str;
-      clear();
-    }
-
-
-    init();
-
-    return {
-      // properties
-      "data": data,
-
-      // methods
-      "clear": clear,
-      "isDataLoaded": isDataLoaded,
-      "ensureData": ensureData,
-      "reloadData": reloadData,
-      "setSort": setSort,
-      "setSearch": setSearch,
-
-      // events
-      "onDataLoading": onDataLoading,
-      "onDataLoaded": onDataLoaded
-    };
-  }
-
-  // Slick.Data.RemoteModel
-  $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}});
-})(jQuery);
\ No newline at end of file
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644
index 3613910b7770d4a8deb4a095fbc90b75dae86b7f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644
index ad8c5ea1ec8b6789e3bff1807ad74a66bc7f5442..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644
index 582756856600d0842fdd98282670b0af7d52ca24..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index a95f3cd16f9f050792e1f2bcc6f80a19686419db..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644
index 3b1d985f515c84f0a12010e8c39f9437ec0fe63d..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644
index 80dc68f7e4a960212ad482dac9aa94ad82c22df4..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index f00a5c765f5010c52bb095dadb1a0aa4dac11583..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644
index a5d9c30e3150e7bec7b2025c029d8c2b38d4a645..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_222222_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_222222_256x240.png
deleted file mode 100644
index 24de795563734d08e7d7254a27628e7732a94bcb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index a2980c8e2116dedbf12ae383b9cc9585941bf5ad..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_454545_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_454545_256x240.png
deleted file mode 100644
index e7687a37243e903811d84325b2dbac9e7a13a82e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_888888_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_888888_256x240.png
deleted file mode 100644
index a85f2c4e369b703f5ed99f85672ca52cec775f4c..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index 7af13a6004008f4d683852d9098f23751ee6c293..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css b/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css
deleted file mode 100644
index 06cd80c6..00000000
--- a/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*! jQuery UI - v1.11.3 - 2015-02-27
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
-	display: none;
-}
-.ui-helper-hidden-accessible {
-	border: 0;
-	clip: rect(0 0 0 0);
-	height: 1px;
-	margin: -1px;
-	overflow: hidden;
-	padding: 0;
-	position: absolute;
-	width: 1px;
-}
-.ui-helper-reset {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	outline: 0;
-	line-height: 1.3;
-	text-decoration: none;
-	font-size: 100%;
-	list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
-	content: "";
-	display: table;
-	border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
-	clear: both;
-}
-.ui-helper-clearfix {
-	min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
-	width: 100%;
-	height: 100%;
-	top: 0;
-	left: 0;
-	position: absolute;
-	opacity: 0;
-	filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
-	z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
-	cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-	display: block;
-	text-indent: -99999px;
-	overflow: hidden;
-	background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
-	position: fixed;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-}
-.ui-draggable-handle {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-resizable {
-	position: relative;
-}
-.ui-resizable-handle {
-	position: absolute;
-	font-size: 0.1px;
-	display: block;
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
-	display: none;
-}
-.ui-resizable-n {
-	cursor: n-resize;
-	height: 7px;
-	width: 100%;
-	top: -5px;
-	left: 0;
-}
-.ui-resizable-s {
-	cursor: s-resize;
-	height: 7px;
-	width: 100%;
-	bottom: -5px;
-	left: 0;
-}
-.ui-resizable-e {
-	cursor: e-resize;
-	width: 7px;
-	right: -5px;
-	top: 0;
-	height: 100%;
-}
-.ui-resizable-w {
-	cursor: w-resize;
-	width: 7px;
-	left: -5px;
-	top: 0;
-	height: 100%;
-}
-.ui-resizable-se {
-	cursor: se-resize;
-	width: 12px;
-	height: 12px;
-	right: 1px;
-	bottom: 1px;
-}
-.ui-resizable-sw {
-	cursor: sw-resize;
-	width: 9px;
-	height: 9px;
-	left: -5px;
-	bottom: -5px;
-}
-.ui-resizable-nw {
-	cursor: nw-resize;
-	width: 9px;
-	height: 9px;
-	left: -5px;
-	top: -5px;
-}
-.ui-resizable-ne {
-	cursor: ne-resize;
-	width: 9px;
-	height: 9px;
-	right: -5px;
-	top: -5px;
-}
-.ui-selectable {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-selectable-helper {
-	position: absolute;
-	z-index: 100;
-	border: 1px dotted black;
-}
-.ui-sortable-handle {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
-	display: block;
-	cursor: pointer;
-	position: relative;
-	margin: 2px 0 0 0;
-	padding: .5em .5em .5em .7em;
-	min-height: 0; /* support: IE7 */
-	font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
-	padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
-	padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
-	position: absolute;
-	left: .5em;
-	top: 50%;
-	margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
-	padding: 1em 2.2em;
-	border-top: 0;
-	overflow: auto;
-}
-.ui-autocomplete {
-	position: absolute;
-	top: 0;
-	left: 0;
-	cursor: default;
-}
-.ui-button {
-	display: inline-block;
-	position: relative;
-	padding: 0;
-	line-height: normal;
-	margin-right: .1em;
-	cursor: pointer;
-	vertical-align: middle;
-	text-align: center;
-	overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
-	text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-	width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-	width: 2.4em;
-}
-.ui-button-icons-only {
-	width: 3.4em;
-}
-button.ui-button-icons-only {
-	width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
-	display: block;
-	line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
-	padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-	padding: .4em;
-	text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-	padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-	padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-	padding-left: 2.1em;
-	padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
-	padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-	position: absolute;
-	top: 50%;
-	margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-	left: 50%;
-	margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-	left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-	right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
-	margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-	margin-left: 0;
-	margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
-	border: 0;
-	padding: 0;
-}
-.ui-datepicker {
-	width: 17em;
-	padding: .2em .2em 0;
-	display: none;
-}
-.ui-datepicker .ui-datepicker-header {
-	position: relative;
-	padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-	position: absolute;
-	top: 2px;
-	width: 1.8em;
-	height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
-	top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
-	left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
-	right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
-	left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
-	right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
-	display: block;
-	position: absolute;
-	left: 50%;
-	margin-left: -8px;
-	top: 50%;
-	margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
-	margin: 0 2.3em;
-	line-height: 1.8em;
-	text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
-	font-size: 1em;
-	margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
-	width: 45%;
-}
-.ui-datepicker table {
-	width: 100%;
-	font-size: .9em;
-	border-collapse: collapse;
-	margin: 0 0 .4em;
-}
-.ui-datepicker th {
-	padding: .7em .3em;
-	text-align: center;
-	font-weight: bold;
-	border: 0;
-}
-.ui-datepicker td {
-	border: 0;
-	padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
-	display: block;
-	padding: .2em;
-	text-align: right;
-	text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
-	background-image: none;
-	margin: .7em 0 0 0;
-	padding: 0 .2em;
-	border-left: 0;
-	border-right: 0;
-	border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
-	float: right;
-	margin: .5em .2em .4em;
-	cursor: pointer;
-	padding: .2em .6em .3em .6em;
-	width: auto;
-	overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
-	float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
-	width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
-	float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
-	width: 95%;
-	margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
-	width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
-	width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
-	width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
-	border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
-	clear: left;
-}
-.ui-datepicker-row-break {
-	clear: both;
-	width: 100%;
-	font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
-	direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
-	right: 2px;
-	left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
-	left: 2px;
-	right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
-	right: 1px;
-	left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
-	left: 1px;
-	right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
-	clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
-	float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
-	float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
-	border-right-width: 0;
-	border-left-width: 1px;
-}
-.ui-dialog {
-	overflow: hidden;
-	position: absolute;
-	top: 0;
-	left: 0;
-	padding: .2em;
-	outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
-	padding: .4em 1em;
-	position: relative;
-}
-.ui-dialog .ui-dialog-title {
-	float: left;
-	margin: .1em 0;
-	white-space: nowrap;
-	width: 90%;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
-	position: absolute;
-	right: .3em;
-	top: 50%;
-	width: 20px;
-	margin: -10px 0 0 0;
-	padding: 1px;
-	height: 20px;
-}
-.ui-dialog .ui-dialog-content {
-	position: relative;
-	border: 0;
-	padding: .5em 1em;
-	background: none;
-	overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
-	text-align: left;
-	border-width: 1px 0 0 0;
-	background-image: none;
-	margin-top: .5em;
-	padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
-	float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
-	margin: .5em .4em .5em 0;
-	cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
-	width: 12px;
-	height: 12px;
-	right: -5px;
-	bottom: -5px;
-	background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
-	cursor: move;
-}
-.ui-menu {
-	list-style: none;
-	padding: 0;
-	margin: 0;
-	display: block;
-	outline: none;
-}
-.ui-menu .ui-menu {
-	position: absolute;
-}
-.ui-menu .ui-menu-item {
-	position: relative;
-	margin: 0;
-	padding: 3px 1em 3px .4em;
-	cursor: pointer;
-	min-height: 0; /* support: IE7 */
-	/* support: IE10, see #8844 */
-	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
-	margin: 5px 0;
-	height: 0;
-	font-size: 0;
-	line-height: 0;
-	border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
-	margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
-	position: relative;
-}
-.ui-menu-icons .ui-menu-item {
-	padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-	left: .2em;
-	margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
-	left: auto;
-	right: 0;
-}
-.ui-progressbar {
-	height: 2em;
-	text-align: left;
-	overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
-	margin: -1px;
-	height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
-	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
-	height: 100%;
-	filter: alpha(opacity=25); /* support: IE8 */
-	opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
-	background-image: none;
-}
-.ui-selectmenu-menu {
-	padding: 0;
-	margin: 0;
-	position: absolute;
-	top: 0;
-	left: 0;
-	display: none;
-}
-.ui-selectmenu-menu .ui-menu {
-	overflow: auto;
-	/* Support: IE7 */
-	overflow-x: hidden;
-	padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
-	font-size: 1em;
-	font-weight: bold;
-	line-height: 1.5;
-	padding: 2px 0.4em;
-	margin: 0.5em 0 0 0;
-	height: auto;
-	border: 0;
-}
-.ui-selectmenu-open {
-	display: block;
-}
-.ui-selectmenu-button {
-	display: inline-block;
-	overflow: hidden;
-	position: relative;
-	text-decoration: none;
-	cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
-	right: 0.5em;
-	left: auto;
-	margin-top: -8px;
-	position: absolute;
-	top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
-	text-align: left;
-	padding: 0.4em 2.1em 0.4em 1em;
-	display: block;
-	line-height: 1.4;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-}
-.ui-slider {
-	position: relative;
-	text-align: left;
-}
-.ui-slider .ui-slider-handle {
-	position: absolute;
-	z-index: 2;
-	width: 1.2em;
-	height: 1.2em;
-	cursor: default;
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-slider .ui-slider-range {
-	position: absolute;
-	z-index: 1;
-	font-size: .7em;
-	display: block;
-	border: 0;
-	background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
-	filter: inherit;
-}
-
-.ui-slider-horizontal {
-	height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
-	top: -.3em;
-	margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
-	top: 0;
-	height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
-	left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
-	right: 0;
-}
-
-.ui-slider-vertical {
-	width: .8em;
-	height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
-	left: -.3em;
-	margin-left: 0;
-	margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
-	left: 0;
-	width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
-	bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
-	top: 0;
-}
-.ui-spinner {
-	position: relative;
-	display: inline-block;
-	overflow: hidden;
-	padding: 0;
-	vertical-align: middle;
-}
-.ui-spinner-input {
-	border: none;
-	background: none;
-	color: inherit;
-	padding: 0;
-	margin: .2em 0;
-	vertical-align: middle;
-	margin-left: .4em;
-	margin-right: 22px;
-}
-.ui-spinner-button {
-	width: 16px;
-	height: 50%;
-	font-size: .5em;
-	padding: 0;
-	margin: 0;
-	text-align: center;
-	position: absolute;
-	cursor: default;
-	display: block;
-	overflow: hidden;
-	right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
-	border-top: none;
-	border-bottom: none;
-	border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
-	position: absolute;
-	margin-top: -8px;
-	top: 50%;
-	left: 0;
-}
-.ui-spinner-up {
-	top: 0;
-}
-.ui-spinner-down {
-	bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
-	/* need to fix icons sprite */
-	background-position: -65px -16px;
-}
-.ui-tabs {
-	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-	padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
-	margin: 0;
-	padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
-	list-style: none;
-	float: left;
-	position: relative;
-	top: 0;
-	margin: 1px .2em 0 0;
-	border-bottom-width: 0;
-	padding: 0;
-	white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
-	float: left;
-	padding: .5em 1em;
-	text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
-	margin-bottom: -1px;
-	padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
-	cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
-	cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
-	display: block;
-	border-width: 0;
-	padding: 1em 1.4em;
-	background: none;
-}
-.ui-tooltip {
-	padding: 8px;
-	position: absolute;
-	z-index: 9999;
-	max-width: 300px;
-	-webkit-box-shadow: 0 0 5px #aaa;
-	box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
-	border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
-	font-family: Verdana,Arial,sans-serif;
-	font-size: 1.1em;
-}
-.ui-widget .ui-widget {
-	font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
-	font-family: Verdana,Arial,sans-serif;
-	font-size: 1em;
-}
-.ui-widget-content {
-	border: 1px solid #aaaaaa;
-	background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
-	color: #222222;
-}
-.ui-widget-content a {
-	color: #222222;
-}
-.ui-widget-header {
-	border: 1px solid #aaaaaa;
-	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
-	color: #222222;
-	font-weight: bold;
-}
-.ui-widget-header a {
-	color: #222222;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-	border: 1px solid #d3d3d3;
-	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
-	font-weight: normal;
-	color: #555555;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
-	color: #555555;
-	text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
-	border: 1px solid #999999;
-	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
-	font-weight: normal;
-	color: #212121;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
-	color: #212121;
-	text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
-	border: 1px solid #aaaaaa;
-	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
-	font-weight: normal;
-	color: #212121;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
-	color: #212121;
-	text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
-	border: 1px solid #fcefa1;
-	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
-	color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
-	color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
-	border: 1px solid #cd0a0a;
-	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
-	color: #cd0a0a;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
-	color: #cd0a0a;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
-	color: #cd0a0a;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
-	font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
-	opacity: .7;
-	filter:Alpha(Opacity=70); /* support: IE8 */
-	font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
-	opacity: .35;
-	filter:Alpha(Opacity=35); /* support: IE8 */
-	background-image: none;
-}
-.ui-state-disabled .ui-icon {
-	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-	width: 16px;
-	height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
-	background-image: url("images/ui-icons_222222_256x240.png");
-}
-.ui-widget-header .ui-icon {
-	background-image: url("images/ui-icons_222222_256x240.png");
-}
-.ui-state-default .ui-icon {
-	background-image: url("images/ui-icons_888888_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
-	background-image: url("images/ui-icons_454545_256x240.png");
-}
-.ui-state-active .ui-icon {
-	background-image: url("images/ui-icons_454545_256x240.png");
-}
-.ui-state-highlight .ui-icon {
-	background-image: url("images/ui-icons_2e83ff_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
-	background-image: url("images/ui-icons_cd0a0a_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
-	border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
-	border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
-	border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
-	border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
-	background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
-	opacity: .3;
-	filter: Alpha(Opacity=30); /* support: IE8 */
-}
-.ui-widget-shadow {
-	margin: -8px 0 0 -8px;
-	padding: 8px;
-	background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
-	opacity: .3;
-	filter: Alpha(Opacity=30); /* support: IE8 */
-	border-radius: 8px;
-}
diff --git a/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css b/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css
deleted file mode 100644
index 208ac779..00000000
--- a/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.11.3 - 2015-02-27
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/web/pgadmin/templates/base.html b/web/pgadmin/templates/base.html
index 829c195b..176a0ad6 100755
--- a/web/pgadmin/templates/base.html
+++ b/web/pgadmin/templates/base.html
@@ -46,12 +46,6 @@
           href="{{ url_for('static', filename='vendor/select2/select2.css' if config.DEBUG else 'vendor/select2/select2.min.css')}}"/>
 
     <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/slickgrid/slick.grid.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/slickgrid/slick-default-theme.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css' if config.DEBUG else 'vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css')}}"/>
-    <link type="text/css" rel="stylesheet"
           href="{{ url_for('static', filename='vendor/codemirror/addon/scroll/simplescrollbars.css')}}"/>
 
     <!-- View specified stylesheets -->
@@ -76,10 +70,6 @@
                   name: 'codemirror',
                   location: '{{ url_for('static', filename='vendor/codemirror')}}',
                   main: 'lib/codemirror'
-                },{
-                  name: 'slickgrid',
-                  location: '{{ url_for('static', filename='vendor/slickgrid')}}',
-                  main: 'slick.core'
                 }],
                 shim: {
                     "backbone": {
@@ -134,18 +124,14 @@
                         "deps": ['jquery'], "exports": 'jQuery.fn.drag'
                     },
                     "jquery.ui": {"deps": ['jquery']},
+                    "slick.pgadmin.formatters": {"deps": ['slickgrid']},
+                    "slick.pgadmin.editors": {"deps": ['slickgrid']},
                     "slickgrid": {
                         "deps": [
                             'jquery', "jquery.ui", "jquery.event.drag"
                         ],
                         "exports": 'Slick'
                     },
-                    "slickgrid/slick.grid": {
-                        "deps": [
-                            'jquery', "jquery.ui", "jquery.event.drag", "slickgrid"
-                        ],
-                        "exports": 'Slick.Grid'
-                    },
                     "flotr2": {
                         deps: ['bean'],
                         exports: function(bean) {
@@ -189,7 +175,8 @@
                     "jquery.ui": "{{ url_for('static', filename='vendor/jquery-ui/jquery-ui-1.11.3' + ('' if config.DEBUG else '.min')) }}",
                     "bignumber": "{{ url_for('static', filename='vendor/bignumber/bignumber' if config.DEBUG else 'vendor/bignumber/bignumber.min') }}",
                     bean :"{{ url_for('static', filename='vendor/flotr2/bean' + ('' if config.DEBUG else '-min')) }}",
-                    flotr2 :"{{ url_for('static', filename='vendor/flotr2/flotr2.amd') }}"
+                    flotr2 :"{{ url_for('static', filename='vendor/flotr2/flotr2.amd') }}",
+                    slickgrid: "{{ url_for('static', filename='js/generated/slickgrid') }}"
                     {% for script in current_app.javascripts %}
                         ,'{{ script.name }}': "{{ script.path }}"
                     {% endfor %}
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
index b9f017ec..e6c97ec4 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
@@ -25,15 +25,9 @@ define([
     'codemirror/addon/search/search',
     'codemirror/addon/search/searchcursor',
     'codemirror/addon/search/jump-to-line',
-    'backgrid.sizeable.columns', 'slickgrid/slick.formatters',
-    'slick.pgadmin.formatters', 'slickgrid/slick.editors',
-    'slick.pgadmin.editors', 'slickgrid/plugins/slick.autotooltips',
-    'slickgrid/plugins/slick.cellrangedecorator',
-    'slickgrid/plugins/slick.cellrangeselector',
-    'slickgrid/plugins/slick.cellselectionmodel',
-    'slickgrid/plugins/slick.cellcopymanager',
-    'slickgrid/plugins/slick.rowselectionmodel',
-    'slickgrid/slick.grid'
+    'backgrid.sizeable.columns',
+    'slick.pgadmin.formatters',
+    'slick.pgadmin.editors',
 ], function(
   $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror,
   pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
@@ -880,7 +874,7 @@ define([
         if (self.history_grid) {
           self.history_grid.remove();
         }
-
+        
         self.history_collection = new HistoryBundle.historyCollection([]);
 
         let queryHistoryElement = reactComponents.React.createElement(
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 61115495..004de842 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -15,9 +15,9 @@ import 'slickgrid.grid';
 import ColumnSelector from 'sources/selection/column_selector';
 import ActiveCellCapture from 'sources/selection/active_cell_capture';
 import 'sources/selection/grid_selector';
+import 'slickgrid.plugins/slick.cellrangeselector';
+
 import XCellSelectionModel from 'sources/selection/xcell_selection_model';
-import 'sources/slickgrid/pgslick.cellrangedecorator';
-import 'sources/slickgrid/pgslick.cellrangeselector';
 
 describe('ColumnSelector', function () {
   var container, data, columns, options;
diff --git a/web/regression/javascript/selection/xcell_selection_model_spec.js b/web/regression/javascript/selection/xcell_selection_model_spec.js
index db3f6d60..f41d96c4 100644
--- a/web/regression/javascript/selection/xcell_selection_model_spec.js
+++ b/web/regression/javascript/selection/xcell_selection_model_spec.js
@@ -7,6 +7,7 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
+import 'slickgrid.plugins/slick.cellrangeselector';
 import XCellSelectionModel from 'sources/selection/xcell_selection_model';
 import 'slickgrid.grid';
 import Slick from 'slickgrid';
diff --git a/web/regression/javascript/slickgrid/cell_selector_spec.js b/web/regression/javascript/slickgrid/cell_selector_spec.js
index 7ad72e32..162f3fa5 100644
--- a/web/regression/javascript/slickgrid/cell_selector_spec.js
+++ b/web/regression/javascript/slickgrid/cell_selector_spec.js
@@ -8,14 +8,18 @@
 //////////////////////////////////////////////////////////////
 
 import $ from 'jquery';
-import Slick from 'slickgrid';
+import 'slickgrid';
 import 'slickgrid.grid';
+
 import XCellSelectionModel from 'sources/selection/xcell_selection_model';
 import CellSelector from 'sources/slickgrid/cell_selector';
 import RangeSelectionHelper from 'sources/selection/range_selection_helper';
 
 describe('CellSelector', function () {
   var container, columns, cellSelector, data, cellSelectionModel, grid;
+
+  var Slick = window.Slick;
+
   beforeEach(function () {
     container = $('<div></div>');
     container.height(9999);
diff --git a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
index eb4411dc..e2edaf78 100644
--- a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
+++ b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
@@ -13,6 +13,7 @@ import RangeSelectionHelper from 'sources/selection/range_selection_helper';
 import XCellSelectionModel from 'sources/selection/xcell_selection_model';
 import Slick from 'slickgrid';
 import 'slickgrid.grid';
+
 import $ from 'jquery';
 
 describe('#handleQueryOutputKeyboardEvent', function () {
diff --git a/web/webpack.config.js b/web/webpack.config.js
index fc6d29e0..cd41ea67 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -3,8 +3,9 @@
 module.exports = {
   context: __dirname + '/pgadmin/static',
   entry: {
-    reactComponents: './jsx/components.jsx',
+    reactComponents: './bundle/components.js',
     history: './js/history/index.js',
+    slickgrid: './bundle/slickgrid.js',
   },
   output: {
     libraryTarget: 'amd',
@@ -22,8 +23,10 @@ module.exports = {
           presets: ['es2015', 'react'],
         },
       },
-    },
-    ],
+    }, {
+      test: /\.css$/,
+      use: ['style-loader', 'raw-loader'],
+    }],
   },
 
   resolve: {
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index 6754f048..737ef280 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -3,6 +3,7 @@ const path = require('path');
 const webpack = require('webpack');
 
 const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
+const nodeModulesDir = path.resolve(__dirname, 'node_modules');
 const regressionDir = path.resolve(__dirname, 'regression');
 
 module.exports = {
@@ -25,21 +26,23 @@ module.exports = {
             presets: ['es2015', 'react'],
           },
         },
-      },
-      {
+      }, {
+        test: /\.css$/,
+        use: [ 'style-loader', 'raw-loader' ],
+      }, {
         test: /.*slickgrid\/slick\.(?!core)*/,
         loader: 'imports-loader?' +
         'jquery.ui' +
         ',jquery.event.drag' +
         ',slickgrid',
       }, {
-        test: /.*slickgrid\/plugins\/slick\.rowselectionmodel/,
+        test: /.*slickgrid\.plugins\/slick\.cellrangeselector/,
         loader: 'imports-loader?' +
         'jquery.ui' +
         ',jquery.event.drag' +
         ',slickgrid' +
         '!exports-loader?' +
-        'Slick.RowSelectionModel',
+        'Slick.CellRangeSelector',
       }, {
         test: /.*slickgrid\/slick\.core.*/,
         loader: 'imports-loader?' +
@@ -59,11 +62,12 @@ module.exports = {
       'jquery.event.drag': sourcesDir + '/vendor/jquery-ui/jquery.event.drag-2.2',
       'sources': sourcesDir + '/js',
       'underscore.string': sourcesDir + '/vendor/underscore/underscore.string',
+      'vendor': sourcesDir + '/vendor/',
       'translations': regressionDir + '/javascript/fake_translations',
       'pgadmin.browser.endpoints': regressionDir + '/javascript/fake_endpoints',
-      'slickgrid': sourcesDir + '/vendor/slickgrid/slick.core',
-      'slickgrid.grid': sourcesDir + '/vendor/slickgrid/slick.grid',
-      'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
+      'slickgrid': nodeModulesDir + '/slickgrid/',
+      'slickgrid.plugins': nodeModulesDir + '/slickgrid/plugins/',
+      'slickgrid.grid': nodeModulesDir + '/slickgrid/slick.grid',
       'browser': path.resolve(__dirname, 'pgadmin/browser/static/js'),
       'pgadmin': sourcesDir + '/js/pgadmin',
     },
diff --git a/web/yarn.lock b/web/yarn.lock
index ce72d41b..dc44f2c5 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -59,6 +59,13 @@ ajv@^4.7.0, ajv@^4.9.1:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
+ajv@^5.0.0:
+  version "5.1.5"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.1.5.tgz#8734931b601f00d4feef7c65738d77d1b65d1f68"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -67,6 +74,10 @@ align-text@^0.1.1, align-text@^0.1.3:
     longest "^1.0.1"
     repeat-string "^1.5.2"
 
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
 amdefine@>=0.0.4:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
@@ -216,6 +227,17 @@ asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 
+autoprefixer@^6.3.1:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
 aws-sign2@~0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
@@ -231,7 +253,7 @@ axios@^0.16.1:
     follow-redirects "^1.2.3"
     is-buffer "^1.1.5"
 
-babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
   dependencies:
@@ -751,7 +773,7 @@ backo2@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
 
-balanced-match@^0.4.1:
+balanced-match@^0.4.1, balanced-match@^0.4.2:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
 
@@ -974,6 +996,13 @@ browserify@^14.0.0, browserify@~14.1.0:
     vm-browserify "~0.0.1"
     xtend "^4.0.0"
 
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
 buffer-xor@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -1031,6 +1060,19 @@ camelcase@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
 
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000684"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000684.tgz#99acb0118b8fd1fdd601a15e0c0f2dfc15a81680"
+
 caseless@~0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
@@ -1102,6 +1144,12 @@ circular-json@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
 
+clap@^1.0.9:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857"
+  dependencies:
+    chalk "^1.1.3"
+
 cli-cursor@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
@@ -1128,15 +1176,57 @@ cliui@^3.2.0:
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
+clone@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
 
+coa@~1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.3.tgz#1b54a5e1dcf77c990455d4deea98c564416dc893"
+  dependencies:
+    q "^1.1.2"
+
 code-point-at@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 
-colors@^1.1.0:
+color-convert@^1.3.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.0.0, color-name@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@^1.1.0, colors@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
 
@@ -1306,6 +1396,29 @@ crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
     public-encrypt "^4.0.0"
     randombytes "^2.0.0"
 
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@^0.28.4:
+  version "0.28.4"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.4.tgz#6cf3579192ce355e8b38d5f42dd7a1f2ec898d0f"
+  dependencies:
+    babel-code-frame "^6.11.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano ">=2.6.1 <4"
+    icss-utils "^2.1.0"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.0.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.0.0"
+    postcss-modules-local-by-default "^1.0.1"
+    postcss-modules-scope "^1.0.0"
+    postcss-modules-values "^1.1.0"
+    postcss-value-parser "^3.3.0"
+    source-list-map "^0.1.7"
+
 css-select@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
@@ -1315,10 +1428,66 @@ css-select@~1.2.0:
     domutils "1.5.1"
     nth-check "~1.0.1"
 
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
 css-what@2.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
 
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4":
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
 custom-event@~1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
@@ -1367,7 +1536,7 @@ debug@^2.1.1, debug@^2.2.0, debug@^2.4.5:
   dependencies:
     ms "2.0.0"
 
-decamelize@^1.0.0, decamelize@^1.1.1:
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
@@ -1532,6 +1701,10 @@ ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
 
+electron-to-chromium@^1.2.7:
+  version "1.3.14"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43"
+
 elliptic@^6.0.0:
   version "6.4.0"
   resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
@@ -1794,6 +1967,10 @@ espree@^3.4.0:
     acorn "^5.0.1"
     acorn-jsx "^3.0.0"
 
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
 esprima@^3.1.1:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
@@ -1909,6 +2086,10 @@ fast-levenshtein@~2.0.4:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
 fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9:
   version "0.8.12"
   resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
@@ -1991,6 +2172,10 @@ flat-cache@^1.2.1:
     graceful-fs "^4.1.2"
     write "^0.2.1"
 
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
 follow-redirects@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3167a7e42fdaca21"
@@ -2256,6 +2441,10 @@ hosted-git-info@^2.1.4:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
 
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
 htmlescape@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
@@ -2303,6 +2492,16 @@ iconv-lite@0.4.15, iconv-lite@~0.4.13:
   version "0.4.15"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
 
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+icss-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+  dependencies:
+    postcss "^6.0.1"
+
 ieee754@^1.1.4:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
@@ -2328,6 +2527,10 @@ imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
 
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
 indexof@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
@@ -2402,6 +2605,10 @@ invert-kv@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
 
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -2505,6 +2712,10 @@ is-path-inside@^1.0.0:
   dependencies:
     path-is-inside "^1.0.1"
 
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
 is-posix-bracket@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -2537,6 +2748,12 @@ is-subset@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
 
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
 is-symbol@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
@@ -2598,6 +2815,18 @@ jodid25519@^1.0.0:
   dependencies:
     jsbn "~0.1.0"
 
+jquery-ui@>=1.8.0:
+  version "1.12.1"
+  resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.12.1.tgz#bcb4045c8dd0539c134bc1488cdd3e768a7a9e51"
+
+jquery@>=1.8.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787"
+
+js-base64@^2.1.9:
+  version "2.1.9"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce"
+
 js-string-escape@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
@@ -2613,6 +2842,13 @@ js-yaml@^3.5.1:
     argparse "^1.0.7"
     esprima "^3.1.1"
 
+js-yaml@~3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^2.6.0"
+
 jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -2876,6 +3112,10 @@ lodash.bind@^4.1.4:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
 
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
 lodash.defaults@^4.0.1:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@ -2923,6 +3163,10 @@ lodash.map@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
 
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
 lodash.memoize@~3.0.3:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
@@ -2947,6 +3191,10 @@ lodash.some@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
 
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
 lodash@^3.10.1, lodash@^3.8.0:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
@@ -2976,6 +3224,14 @@ lru-cache@2.2.x:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
 
+macaddress@^0.2.8:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
+
+math-expression-evaluator@^1.2.14:
+  version "1.2.17"
+  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
 media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -3054,7 +3310,7 @@ mkdirp@0.5.0:
   dependencies:
     minimist "0.0.8"
 
-"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   dependencies:
@@ -3183,6 +3439,19 @@ normalize-path@^2.0.1:
   dependencies:
     remove-trailing-separator "^1.0.1"
 
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
 npmlog@^4.0.2:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
@@ -3198,6 +3467,10 @@ nth-check@~1.0.1:
   dependencies:
     boolbase "~1.0.0"
 
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
 number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -3483,10 +3756,260 @@ pluralize@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
 
+postcss-calc@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+  dependencies:
+    postcss "^5.0.2"
+    postcss-message-helpers "^2.0.0"
+    reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+  dependencies:
+    colormin "^1.0.5"
+    postcss "^5.0.13"
+    postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+  dependencies:
+    postcss "^5.0.11"
+    postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+  dependencies:
+    postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+  dependencies:
+    postcss "^5.0.14"
+    uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
+  dependencies:
+    postcss "^5.0.4"
+    uniqid "^4.0.0"
+
+postcss-merge-idents@^2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.10"
+    postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+  dependencies:
+    browserslist "^1.5.2"
+    caniuse-api "^1.5.2"
+    postcss "^5.0.4"
+    postcss-selector-parser "^2.2.2"
+    vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+  dependencies:
+    object-assign "^4.0.1"
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+  dependencies:
+    postcss "^5.0.12"
+    postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.2"
+    postcss-value-parser "^3.0.2"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+  dependencies:
+    alphanum-sort "^1.0.2"
+    has "^1.0.1"
+    postcss "^5.0.14"
+    postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+  dependencies:
+    postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^1.4.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.8"
+    postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+  dependencies:
+    flatten "^1.0.2"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+  dependencies:
+    is-svg "^2.0.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+    svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+  version "5.2.17"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b"
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.2.tgz#5c4fea589f0ac3b00caa75b1cbc3a284195b7e5d"
+  dependencies:
+    chalk "^1.1.3"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
 
+prepend-http@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
 preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
@@ -3542,6 +4065,10 @@ punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
 
+q@^1.1.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
+
 qjobs@^1.1.4:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73"
@@ -3554,6 +4081,13 @@ qs@~6.3.0:
   version "6.3.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
 
+query-string@^4.1.0:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
 querystring-es3@^0.2.0, querystring-es3@~0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -3587,6 +4121,10 @@ raw-body@~2.2.0:
     iconv-lite "0.4.15"
     unpipe "1.0.0"
 
+raw-loader@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
+
 rc@^1.1.7:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
@@ -3695,6 +4233,20 @@ rechoir@^0.6.2:
   dependencies:
     resolve "^1.1.6"
 
+reduce-css-calc@^1.2.6:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+  dependencies:
+    balanced-match "^0.4.2"
+    math-expression-evaluator "^1.2.14"
+    reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+  dependencies:
+    balanced-match "^0.4.2"
+
 regenerate@^1.2.1:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
@@ -3718,6 +4270,14 @@ regex-cache@^0.4.2:
     is-equal-shallow "^0.1.3"
     is-primitive "^2.0.0"
 
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
 regexpu-core@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
@@ -3897,6 +4457,16 @@ safe-buffer@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
 
+sax@~1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
+
+schema-utils@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
+  dependencies:
+    ajv "^5.0.0"
+
 "semver@2 || 3 || 4 || 5", semver@^5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -3963,6 +4533,13 @@ slice-ansi@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
 
+"slickgrid@git+https://github.com/6pac/SlickGrid.git#2.3.7":
+  version "2.3.7"
+  resolved "git+https://github.com/6pac/SlickGrid.git#8ff68140bd5be132d2913640b4b1f2512219d075"
+  dependencies:
+    jquery ">=1.8.0"
+    jquery-ui ">=1.8.0"
+
 sntp@1.x.x:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -4013,6 +4590,16 @@ socket.io@1.7.3:
     socket.io-client "1.7.3"
     socket.io-parser "2.3.1"
 
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
 source-list-map@^1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1"
@@ -4101,6 +4688,10 @@ stream-splicer@^2.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.2"
 
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
 string-width@^1.0.1, string-width@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -4150,6 +4741,13 @@ strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
 
+style-loader@^0.18.2:
+  version "0.18.2"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.3.0"
+
 subarg@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
@@ -4160,12 +4758,24 @@ supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
 
-supports-color@^3.1.0:
+supports-color@^3.1.0, supports-color@^3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
   dependencies:
     has-flag "^1.0.0"
 
+svgo@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+  dependencies:
+    coa "~1.0.1"
+    colors "~1.1.2"
+    csso "~2.3.1"
+    js-yaml "~3.7.0"
+    mkdirp "~0.5.1"
+    sax "~1.2.1"
+    whet.extend "~0.9.9"
+
 syntax-error@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1"
@@ -4339,6 +4949,20 @@ underscore@~1.8.3:
   version "1.8.3"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
 
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqid@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
+  dependencies:
+    macaddress "^0.2.8"
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -4392,6 +5016,10 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "~1.0.0"
     spdx-expression-parse "~1.0.0"
 
+vendors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
+
 verror@1.3.6:
   version "1.3.6"
   resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
@@ -4473,6 +5101,10 @@ whatwg-fetch@>=0.10.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
 
+whet.extend@~0.9.9:
+  version "0.9.9"
+  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
 which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
