Bug 1313961 - Update new debugger frontend r=me
authorJames Long <longster@gmail.com>
Sun, 30 Oct 2016 23:07:28 -0400
changeset 320206 e017b947cea08b7bdd21007e95bd13e14ad59103
parent 320205 e3279760cd977aac30bd9e8032d3ee71f55d2a67
child 320207 182f24158aad396bcf11a3b531ed903d6e10a60c
child 320215 a10837dc8cdfaf4d0ebcf9c6c9f11970e064353b
push id20752
push userjlong@mozilla.com
push dateMon, 31 Oct 2016 03:08:19 +0000
treeherderfx-team@e017b947cea0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersme
bugs1313961
milestone52.0a1
Bug 1313961 - Update new debugger frontend r=me
devtools/client/debugger/new/bundle.js
devtools/client/debugger/new/images/Svg.js
devtools/client/debugger/new/images/blackBox.svg
devtools/client/debugger/new/images/close.svg
devtools/client/debugger/new/images/domain.svg
devtools/client/debugger/new/images/file.svg
devtools/client/debugger/new/images/folder.svg
devtools/client/debugger/new/images/magnifying-glass.svg
devtools/client/debugger/new/images/pause.svg
devtools/client/debugger/new/images/plus.svg
devtools/client/debugger/new/images/prettyPrint.svg
devtools/client/debugger/new/images/resume.svg
devtools/client/debugger/new/images/sad-face.svg
devtools/client/debugger/new/images/stepIn.svg
devtools/client/debugger/new/images/stepOut.svg
devtools/client/debugger/new/images/stepOver.svg
devtools/client/debugger/new/images/subSettings.svg
devtools/client/debugger/new/images/toggle-breakpoints.svg
devtools/client/debugger/new/images/worker.svg
devtools/client/debugger/new/pretty-print-worker.js
devtools/client/debugger/new/source-map-worker.js
devtools/client/debugger/new/styles.css
devtools/client/debugger/new/test/mochitest/.eslintrc
devtools/client/debugger/new/test/mochitest/.eslintrc.js
devtools/client/debugger/new/test/mochitest/browser.ini
devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js
devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js
devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js
devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js
devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js
devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js
devtools/client/debugger/new/test/mochitest/examples/bogus-map.js
devtools/client/debugger/new/test/mochitest/examples/bundle.js
devtools/client/debugger/new/test/mochitest/examples/bundle.js.map
devtools/client/debugger/new/test/mochitest/examples/doc-minified.html
devtools/client/debugger/new/test/mochitest/examples/doc-sourcemap-bogus.html
devtools/client/debugger/new/test/mochitest/examples/entry.js
devtools/client/debugger/new/test/mochitest/examples/math.min.js
devtools/client/debugger/new/test/mochitest/head.js
--- a/devtools/client/debugger/new/bundle.js
+++ b/devtools/client/debugger/new/bundle.js
@@ -1,9 +1,9 @@
-// Generated from: 873b94a2fc86b95fb4ff2ba728b50e5f137a909b chore(package): update eslint-plugin-flowtype to version 2.20.0 (#895)
+// Generated from: 5dff6a910f2b9a66c843ea4aac8ebe35e2bf5350 Fix close button size (#1046)
 
 var Debugger =
 /******/ (function(modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
 /******/
 /******/ 	// The require function
 /******/ 	function __webpack_require__(moduleId) {
@@ -49,193 +49,146 @@ var Debugger =
 
 	module.exports = __webpack_require__(1);
 
 
 /***/ },
 /* 1 */
 /***/ function(module, exports, __webpack_require__) {
 
-	/* global window, document, DebuggerConfig */
-	
-	var _require = __webpack_require__(2);
+	var React = __webpack_require__(2);
+	
+	var _require = __webpack_require__(3);
 	
 	var bindActionCreators = _require.bindActionCreators;
 	var combineReducers = _require.combineReducers;
 	
-	var _require2 = __webpack_require__(15);
-	
-	var Provider = _require2.Provider;
-	
-	var ReactDOM = __webpack_require__(25);
-	var React = __webpack_require__(17);
-	var dom = React.DOM;
-	
-	
-	var DevToolsUtils = __webpack_require__(27);
-	var AppConstants = __webpack_require__(41).AppConstants;
-	
-	var _require3 = __webpack_require__(45);
-	
-	var injectGlobals = _require3.injectGlobals;
-	
-	var _require4 = __webpack_require__(47);
-	
-	var isEnabled = _require4.isEnabled;
-	var isFirefoxPanel = _require4.isFirefoxPanel;
-	var getValue = _require4.getValue;
-	var isDevelopment = _require4.isDevelopment;
-	var setConfig = _require4.setConfig;
-	
-	
-	setConfig(({"environment":"firefox-panel","baseWorkerURL":"resource://devtools/client/debugger/new/","logging":false,"clientLogging":false,"features":{"tabs":true,"sourceMaps":true}}));
-	
-	// Set various flags before requiring app code.
-	if (isEnabled("logging.client")) {
-	  DevToolsUtils.dumpn.wantLogging = true;
-	}
-	
-	var _require5 = __webpack_require__(98);
-	
-	var getClient = _require5.getClient;
-	var connectClients = _require5.connectClients;
-	var startDebugging = _require5.startDebugging;
-	
-	var firefox = __webpack_require__(100);
-	var configureStore = __webpack_require__(181);
-	var reducers = __webpack_require__(191);
-	var selectors = __webpack_require__(202);
-	
-	var LandingPage = __webpack_require__(203);
-	var App = __webpack_require__(210);
+	var ReactDOM = __webpack_require__(16);
+	
+	var _require2 = __webpack_require__(18);
+	
+	var _require2$client = _require2.client;
+	var getClient = _require2$client.getClient;
+	var firefox = _require2$client.firefox;
+	var renderRoot = _require2.renderRoot;
+	var bootstrap = _require2.bootstrap;
+	
+	var _require3 = __webpack_require__(87);
+	
+	var getValue = _require3.getValue;
+	var isFirefoxPanel = _require3.isFirefoxPanel;
+	
+	
+	var configureStore = __webpack_require__(236);
+	
+	var reducers = __webpack_require__(247);
+	var selectors = __webpack_require__(257);
+	
+	var App = __webpack_require__(258);
 	
 	var createStore = configureStore({
 	  log: getValue("logging.actions"),
 	  makeThunkArgs: (args, state) => {
 	    return Object.assign({}, args, { client: getClient(state) });
 	  }
 	});
 	
 	var store = createStore(combineReducers(reducers));
-	var actions = bindActionCreators(__webpack_require__(213), store.dispatch);
-	
-	if (isDevelopment()) {
-	  AppConstants.DEBUG_JS_MODULES = true;
-	  injectGlobals({ store });
-	}
+	var actions = bindActionCreators(__webpack_require__(260), store.dispatch);
+	
+	if (false) {
+	  L10N.setBundle(require("./strings.json"));
+	}
+	
+	window.appStore = store;
 	
 	// Expose the bound actions so external things can do things like
 	// selecting a source.
 	window.actions = {
 	  selectSource: actions.selectSource,
 	  selectSourceURL: actions.selectSourceURL
 	};
 	
-	function renderRoot(component) {
-	  var mount = document.querySelector("#mount");
-	
-	  // bail in test environments that do not have a mount
-	  if (!mount) {
-	    return;
-	  }
-	
-	  ReactDOM.render(React.createElement(Provider, { store }, dom.div({
-	    className: "theme-light",
-	    style: { flex: 1 }
-	  }, React.createElement(component))), mount);
-	}
-	
 	function unmountRoot() {
 	  var mount = document.querySelector("#mount");
 	  ReactDOM.unmountComponentAtNode(mount);
 	}
 	
-	function getTargetFromQuery() {
-	  var href = window.location.href;
-	  var nodeMatch = href.match(/ws=([^&#]*)/);
-	  var firefoxMatch = href.match(/firefox-tab=([^&#]*)/);
-	  var chromeMatch = href.match(/chrome-tab=([^&#]*)/);
-	
-	  if (nodeMatch) {
-	    return { type: "node", param: nodeMatch[1] };
-	  } else if (firefoxMatch) {
-	    return { type: "firefox", param: firefoxMatch[1] };
-	  } else if (chromeMatch) {
-	    return { type: "chrome", param: chromeMatch[1] };
-	  }
-	
-	  return null;
-	}
-	
-	var connTarget = getTargetFromQuery();
-	if (connTarget) {
-	  startDebugging(connTarget, actions).then(tabs => {
-	    actions.newTabs(tabs);
-	    actions.selectTab({ id: connTarget.param });
-	    renderRoot(App);
-	  });
-	} else if (isFirefoxPanel()) {
+	if (isFirefoxPanel()) {
 	  (function () {
-	    var sourceMap = __webpack_require__(215);
+	    var sourceMap = __webpack_require__(262);
+	    var prettyPrint = __webpack_require__(274);
 	
 	    module.exports = {
 	      bootstrap: (_ref) => {
 	        var threadClient = _ref.threadClient;
 	        var tabTarget = _ref.tabTarget;
 	
+	        // TODO (jlast) remove when the panel has L10N
+	        if (!window.L10N) {
+	          window.L10N = __webpack_require__(451);
+	          L10N.setBundle(__webpack_require__(452));
+	        }
+	
 	        firefox.setThreadClient(threadClient);
 	        firefox.setTabTarget(tabTarget);
-	        renderRoot(App);
+	        renderRoot(React, ReactDOM, App, store);
 	        return firefox.initPage(actions);
 	      },
 	      destroy: () => {
 	        unmountRoot();
 	        sourceMap.destroyWorker();
+	        prettyPrint.destroyWorker();
 	      },
 	      store: store,
 	      actions: actions,
 	      selectors: selectors,
 	      client: firefox.clientCommands
 	    };
 	  })();
 	} else {
-	  renderRoot(LandingPage);
-	  connectClients(tabs => actions.newTabs(tabs));
+	  bootstrap(React, ReactDOM, App, actions, store);
 	}
 
 /***/ },
 /* 2 */
+/***/ function(module, exports) {
+
+	module.exports = devtoolsRequire("devtools/client/shared/vendor/react");
+
+/***/ },
+/* 3 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;
 	
-	var _createStore = __webpack_require__(3);
+	var _createStore = __webpack_require__(4);
 	
 	var _createStore2 = _interopRequireDefault(_createStore);
 	
-	var _combineReducers = __webpack_require__(10);
+	var _combineReducers = __webpack_require__(11);
 	
 	var _combineReducers2 = _interopRequireDefault(_combineReducers);
 	
-	var _bindActionCreators = __webpack_require__(12);
+	var _bindActionCreators = __webpack_require__(13);
 	
 	var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);
 	
-	var _applyMiddleware = __webpack_require__(13);
+	var _applyMiddleware = __webpack_require__(14);
 	
 	var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);
 	
-	var _compose = __webpack_require__(14);
+	var _compose = __webpack_require__(15);
 	
 	var _compose2 = _interopRequireDefault(_compose);
 	
-	var _warning = __webpack_require__(11);
+	var _warning = __webpack_require__(12);
 	
 	var _warning2 = _interopRequireDefault(_warning);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	/*
 	* This is a dummy function to check if the function name has been altered by minification.
 	* If the function has been minified and NODE_ENV !== 'production', warn the user.
@@ -248,30 +201,30 @@ var Debugger =
 	
 	exports.createStore = _createStore2["default"];
 	exports.combineReducers = _combineReducers2["default"];
 	exports.bindActionCreators = _bindActionCreators2["default"];
 	exports.applyMiddleware = _applyMiddleware2["default"];
 	exports.compose = _compose2["default"];
 
 /***/ },
-/* 3 */
+/* 4 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports.ActionTypes = undefined;
 	exports["default"] = createStore;
 	
-	var _isPlainObject = __webpack_require__(4);
+	var _isPlainObject = __webpack_require__(5);
 	
 	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
 	
-	var _symbolObservable = __webpack_require__(8);
+	var _symbolObservable = __webpack_require__(9);
 	
 	var _symbolObservable2 = _interopRequireDefault(_symbolObservable);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	/**
 	 * These are private action types reserved by Redux.
 	 * For any unknown actions, you must return the current state.
@@ -515,21 +468,21 @@ var Debugger =
 	    dispatch: dispatch,
 	    subscribe: subscribe,
 	    getState: getState,
 	    replaceReducer: replaceReducer
 	  }, _ref2[_symbolObservable2["default"]] = observable, _ref2;
 	}
 
 /***/ },
-/* 4 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var getPrototype = __webpack_require__(5),
-	    isObjectLike = __webpack_require__(7);
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var getPrototype = __webpack_require__(6),
+	    isObjectLike = __webpack_require__(8);
 	
 	/** `Object#toString` result references. */
 	var objectTag = '[object Object]';
 	
 	/** Used for built-in method references. */
 	var funcProto = Function.prototype,
 	    objectProto = Object.prototype;
 	
@@ -589,29 +542,29 @@ var Debugger =
 	  return (typeof Ctor == 'function' &&
 	    Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
 	}
 	
 	module.exports = isPlainObject;
 
 
 /***/ },
-/* 5 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var overArg = __webpack_require__(6);
+/* 6 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var overArg = __webpack_require__(7);
 	
 	/** Built-in value references. */
 	var getPrototype = overArg(Object.getPrototypeOf, Object);
 	
 	module.exports = getPrototype;
 
 
 /***/ },
-/* 6 */
+/* 7 */
 /***/ function(module, exports) {
 
 	/**
 	 * Creates a unary function that invokes `func` with its argument transformed.
 	 *
 	 * @private
 	 * @param {Function} func The function to wrap.
 	 * @param {Function} transform The argument transform.
@@ -622,17 +575,17 @@ var Debugger =
 	    return func(transform(arg));
 	  };
 	}
 	
 	module.exports = overArg;
 
 
 /***/ },
-/* 7 */
+/* 8 */
 /***/ function(module, exports) {
 
 	/**
 	 * Checks if `value` is object-like. A value is object-like if it's not `null`
 	 * and has a `typeof` result of "object".
 	 *
 	 * @static
 	 * @memberOf _
@@ -657,28 +610,28 @@ var Debugger =
 	function isObjectLike(value) {
 	  return value != null && typeof value == 'object';
 	}
 	
 	module.exports = isObjectLike;
 
 
 /***/ },
-/* 8 */
+/* 9 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* WEBPACK VAR INJECTION */(function(global) {/* global window */
 	'use strict';
 	
-	module.exports = __webpack_require__(9)(global || window || this);
+	module.exports = __webpack_require__(10)(global || window || this);
 	
 	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
 
 /***/ },
-/* 9 */
+/* 10 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	module.exports = function symbolObservablePonyfill(root) {
 		var result;
 		var Symbol = root.Symbol;
 	
@@ -693,31 +646,31 @@ var Debugger =
 			result = '@@observable';
 		}
 	
 		return result;
 	};
 
 
 /***/ },
-/* 10 */
+/* 11 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = combineReducers;
 	
-	var _createStore = __webpack_require__(3);
-	
-	var _isPlainObject = __webpack_require__(4);
+	var _createStore = __webpack_require__(4);
+	
+	var _isPlainObject = __webpack_require__(5);
 	
 	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
 	
-	var _warning = __webpack_require__(11);
+	var _warning = __webpack_require__(12);
 	
 	var _warning2 = _interopRequireDefault(_warning);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	function getUndefinedStateErrorMessage(key, action) {
 	  var actionType = action && action.type;
 	  var actionName = actionType && '"' + actionType.toString() + '"' || 'an action';
@@ -825,17 +778,17 @@ var Debugger =
 	      nextState[key] = nextStateForKey;
 	      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
 	    }
 	    return hasChanged ? nextState : state;
 	  };
 	}
 
 /***/ },
-/* 11 */
+/* 12 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = warning;
 	/**
 	 * Prints a warning in the console if it exists.
@@ -855,17 +808,17 @@ var Debugger =
 	    // it would pause the execution at this line.
 	    throw new Error(message);
 	    /* eslint-disable no-empty */
 	  } catch (e) {}
 	  /* eslint-enable no-empty */
 	}
 
 /***/ },
-/* 12 */
+/* 13 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = bindActionCreators;
 	function bindActionCreator(actionCreator, dispatch) {
 	  return function () {
@@ -911,28 +864,28 @@ var Debugger =
 	    if (typeof actionCreator === 'function') {
 	      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
 	    }
 	  }
 	  return boundActionCreators;
 	}
 
 /***/ },
-/* 13 */
+/* 14 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	
 	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 	
 	exports["default"] = applyMiddleware;
 	
-	var _compose = __webpack_require__(14);
+	var _compose = __webpack_require__(15);
 	
 	var _compose2 = _interopRequireDefault(_compose);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	/**
 	 * Creates a store enhancer that applies middleware to the dispatch method
 	 * of the Redux store. This is handy for a variety of tasks, such as expressing
@@ -974,17 +927,17 @@ var Debugger =
 	      return _extends({}, store, {
 	        dispatch: _dispatch
 	      });
 	    };
 	  };
 	}
 
 /***/ },
-/* 14 */
+/* 15 */
 /***/ function(module, exports) {
 
 	"use strict";
 	
 	exports.__esModule = true;
 	exports["default"] = compose;
 	/**
 	 * Composes single-argument functions from right to left. The rightmost
@@ -1019,53 +972,211 @@ var Debugger =
 	      };
 	    }();
 	
 	    if (typeof _ret === "object") return _ret.v;
 	  }
 	}
 
 /***/ },
-/* 15 */
+/* 16 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	module.exports = __webpack_require__(17);
+
+
+/***/ },
+/* 17 */
+/***/ function(module, exports) {
+
+	module.exports = devtoolsRequire("devtools/client/shared/vendor/react-dom");
+
+/***/ },
+/* 18 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* global window, document, DebuggerConfig */
+	
+	var _require = __webpack_require__(3);
+	
+	var bindActionCreators = _require.bindActionCreators;
+	var combineReducers = _require.combineReducers;
+	
+	var _require2 = __webpack_require__(19);
+	
+	var Provider = _require2.Provider;
+	
+	var _require3 = __webpack_require__(28);
+	
+	var DevToolsUtils = _require3.DevToolsUtils;
+	var AppConstants = _require3.AppConstants;
+	
+	var _require4 = __webpack_require__(86);
+	
+	var injectGlobals = _require4.injectGlobals;
+	var debugGlobal = _require4.debugGlobal;
+	
+	var _require5 = __webpack_require__(87);
+	
+	var setConfig = _require5.setConfig;
+	var isEnabled = _require5.isEnabled;
+	var getValue = _require5.getValue;
+	var isDevelopment = _require5.isDevelopment;
+	
+	
+	setConfig(({"environment":"firefox-panel","baseWorkerURL":"resource://devtools/client/debugger/new/","logging":false,"clientLogging":false,"features":{"tabs":true,"sourceMaps":true,"prettyPrint":true}}));
+	
+	// Set various flags before requiring app code.
+	if (isEnabled("logging.client")) {
+	  DevToolsUtils.dumpn.wantLogging = true;
+	}
+	
+	var client = __webpack_require__(139);
+	var getClient = client.getClient;
+	var connectClients = client.connectClients;
+	var startDebugging = client.startDebugging;
+	
+	
+	var Root = __webpack_require__(208);
+	
+	// Using this static variable allows webpack to know at compile-time
+	// to avoid this require and not include it at all in the output.
+	if (false) {
+	  var theme = getValue("theme");
+	  switch (theme) {
+	    case "dark":
+	      require("./lib/themes/dark-theme.css");break;
+	    case "light":
+	      require("./lib/themes/light-theme.css");break;
+	    case "firebug":
+	      require("./lib/themes/firebug-theme.css");break;
+	  }
+	  document.body.parentNode.classList.add(`theme-${ theme }`);
+	
+	  window.L10N = require("./utils/L10N");
+	}
+	
+	function initApp() {
+	  var configureStore = __webpack_require__(214);
+	  var reducers = __webpack_require__(224);
+	  var LandingPage = __webpack_require__(229);
+	
+	  var createStore = configureStore({
+	    log: getValue("logging.actions"),
+	    makeThunkArgs: (args, state) => {
+	      return Object.assign({}, args, { client: getClient(state) });
+	    }
+	  });
+	
+	  var store = createStore(combineReducers(reducers));
+	  var actions = bindActionCreators(__webpack_require__(234), store.dispatch);
+	
+	  if (isDevelopment()) {
+	    AppConstants.DEBUG_JS_MODULES = true;
+	    injectGlobals({ store });
+	  }
+	
+	  return { store, actions, LandingPage };
+	}
+	
+	function renderRoot(_React, _ReactDOM, component, _store) {
+	  var mount = document.querySelector("#mount");
+	
+	  // bail in test environments that do not have a mount
+	  if (!mount) {
+	    return;
+	  }
+	
+	  _ReactDOM.render(_React.createElement(Provider, { store: _store }, Root(component)), mount);
+	}
+	
+	function getTargetFromQuery() {
+	  var href = window.location.href;
+	  var nodeMatch = href.match(/ws=([^&#]*)/);
+	  var firefoxMatch = href.match(/firefox-tab=([^&#]*)/);
+	  var chromeMatch = href.match(/chrome-tab=([^&#]*)/);
+	
+	  if (nodeMatch) {
+	    return { type: "node", param: nodeMatch[1] };
+	  } else if (firefoxMatch) {
+	    return { type: "firefox", param: firefoxMatch[1] };
+	  } else if (chromeMatch) {
+	    return { type: "chrome", param: chromeMatch[1] };
+	  }
+	
+	  return null;
+	}
+	
+	function bootstrap(React, ReactDOM, App, appActions, appStore) {
+	  var connTarget = getTargetFromQuery();
+	  if (connTarget) {
+	    startDebugging(connTarget, appActions).then(tabs => {
+	      renderRoot(React, ReactDOM, App, appStore);
+	    });
+	  } else {
+	    (function () {
+	      var _initApp = initApp();
+	
+	      var store = _initApp.store;
+	      var actions = _initApp.actions;
+	      var LandingPage = _initApp.LandingPage;
+	
+	      renderRoot(React, ReactDOM, LandingPage, store);
+	      connectClients(tabs => actions.newTabs(tabs));
+	    })();
+	  }
+	}
+	
+	module.exports = {
+	  bootstrap,
+	  renderRoot,
+	  debugGlobal,
+	  client
+	};
+
+/***/ },
+/* 19 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports.connect = exports.Provider = undefined;
 	
-	var _Provider = __webpack_require__(16);
+	var _Provider = __webpack_require__(20);
 	
 	var _Provider2 = _interopRequireDefault(_Provider);
 	
-	var _connect = __webpack_require__(20);
+	var _connect = __webpack_require__(23);
 	
 	var _connect2 = _interopRequireDefault(_connect);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	exports.Provider = _Provider2["default"];
 	exports.connect = _connect2["default"];
 
 /***/ },
-/* 16 */
+/* 20 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = undefined;
 	
-	var _react = __webpack_require__(17);
-	
-	var _storeShape = __webpack_require__(18);
+	var _react = __webpack_require__(2);
+	
+	var _storeShape = __webpack_require__(21);
 	
 	var _storeShape2 = _interopRequireDefault(_storeShape);
 	
-	var _warning = __webpack_require__(19);
+	var _warning = __webpack_require__(22);
 	
 	var _warning2 = _interopRequireDefault(_warning);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
 	function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -1124,39 +1235,33 @@ var Debugger =
 	  store: _storeShape2["default"].isRequired,
 	  children: _react.PropTypes.element.isRequired
 	};
 	Provider.childContextTypes = {
 	  store: _storeShape2["default"].isRequired
 	};
 
 /***/ },
-/* 17 */
-/***/ function(module, exports) {
-
-	module.exports = devtoolsRequire("devtools/client/shared/vendor/react");
-
-/***/ },
-/* 18 */
+/* 21 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	
-	var _react = __webpack_require__(17);
+	var _react = __webpack_require__(2);
 	
 	exports["default"] = _react.PropTypes.shape({
 	  subscribe: _react.PropTypes.func.isRequired,
 	  dispatch: _react.PropTypes.func.isRequired,
 	  getState: _react.PropTypes.func.isRequired
 	});
 
 /***/ },
-/* 19 */
+/* 22 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = warning;
 	/**
 	 * Prints a warning in the console if it exists.
@@ -1175,53 +1280,53 @@ var Debugger =
 	    // to find the callsite that caused this warning to fire.
 	    throw new Error(message);
 	    /* eslint-disable no-empty */
 	  } catch (e) {}
 	  /* eslint-enable no-empty */
 	}
 
 /***/ },
-/* 20 */
+/* 23 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 	
 	exports.__esModule = true;
 	exports["default"] = connect;
 	
-	var _react = __webpack_require__(17);
-	
-	var _storeShape = __webpack_require__(18);
+	var _react = __webpack_require__(2);
+	
+	var _storeShape = __webpack_require__(21);
 	
 	var _storeShape2 = _interopRequireDefault(_storeShape);
 	
-	var _shallowEqual = __webpack_require__(21);
+	var _shallowEqual = __webpack_require__(24);
 	
 	var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
 	
-	var _wrapActionCreators = __webpack_require__(22);
+	var _wrapActionCreators = __webpack_require__(25);
 	
 	var _wrapActionCreators2 = _interopRequireDefault(_wrapActionCreators);
 	
-	var _warning = __webpack_require__(19);
+	var _warning = __webpack_require__(22);
 	
 	var _warning2 = _interopRequireDefault(_warning);
 	
-	var _isPlainObject = __webpack_require__(4);
+	var _isPlainObject = __webpack_require__(5);
 	
 	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
 	
-	var _hoistNonReactStatics = __webpack_require__(23);
+	var _hoistNonReactStatics = __webpack_require__(26);
 	
 	var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
 	
-	var _invariant = __webpack_require__(24);
+	var _invariant = __webpack_require__(27);
 	
 	var _invariant2 = _interopRequireDefault(_invariant);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
 	function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -1573,17 +1678,17 @@ var Debugger =
 	      };
 	    }
 	
 	    return (0, _hoistNonReactStatics2["default"])(Connect, WrappedComponent);
 	  };
 	}
 
 /***/ },
-/* 21 */
+/* 24 */
 /***/ function(module, exports) {
 
 	"use strict";
 	
 	exports.__esModule = true;
 	exports["default"] = shallowEqual;
 	function shallowEqual(objA, objB) {
 	  if (objA === objB) {
@@ -1604,34 +1709,34 @@ var Debugger =
 	      return false;
 	    }
 	  }
 	
 	  return true;
 	}
 
 /***/ },
-/* 22 */
+/* 25 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	exports.__esModule = true;
 	exports["default"] = wrapActionCreators;
 	
-	var _redux = __webpack_require__(2);
+	var _redux = __webpack_require__(3);
 	
 	function wrapActionCreators(actionCreators) {
 	  return function (dispatch) {
 	    return (0, _redux.bindActionCreators)(actionCreators, dispatch);
 	  };
 	}
 
 /***/ },
-/* 23 */
+/* 26 */
 /***/ function(module, exports) {
 
 	/**
 	 * Copyright 2015, Yahoo! Inc.
 	 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
 	 */
 	'use strict';
 	
@@ -1677,17 +1782,17 @@ var Debugger =
 	        }
 	    }
 	
 	    return targetComponent;
 	};
 
 
 /***/ },
-/* 24 */
+/* 27 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
 	 * Copyright 2013-2015, Facebook, Inc.
 	 * All rights reserved.
 	 *
 	 * This source code is licensed under the BSD-style license found in the
 	 * LICENSE file in the root directory of this source tree. An additional grant
@@ -1734,875 +1839,3714 @@ var Debugger =
 	    throw error;
 	  }
 	};
 	
 	module.exports = invariant;
 
 
 /***/ },
-/* 25 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	module.exports = __webpack_require__(26);
-
-
-/***/ },
-/* 26 */
-/***/ function(module, exports) {
-
-	module.exports = devtoolsRequire("devtools/client/shared/vendor/react-dom");
-
-/***/ },
-/* 27 */
-/***/ function(module, exports, __webpack_require__) {
-
+/* 28 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var _require = __webpack_require__(29);
+	
+	var KeyShortcuts = _require.KeyShortcuts;
+	
+	var _require2 = __webpack_require__(67);
+	
+	var DebuggerTransport = _require2.DebuggerTransport;
+	
+	var _require3 = __webpack_require__(79);
+	
+	var DebuggerClient = _require3.DebuggerClient;
+	
+	var PrefsHelper = __webpack_require__(83).PrefsHelper;
+	
+	var _require4 = __webpack_require__(84);
+	
+	var TargetFactory = _require4.TargetFactory;
+	
+	var DevToolsUtils = __webpack_require__(68);
+	var AppConstants = __webpack_require__(70);
+	var EventEmitter = __webpack_require__(60);
+	var WebsocketTransport = __webpack_require__(85);
+	
+	module.exports = {
+	  KeyShortcuts,
+	  PrefsHelper,
+	  DebuggerClient,
+	  DebuggerTransport,
+	  TargetFactory,
+	  DevToolsUtils,
+	  AppConstants,
+	  EventEmitter,
+	  WebsocketTransport
+	};
+
+/***/ },
+/* 29 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+	
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	var _require = __webpack_require__(30);
+	
+	var appinfo = _require.Services.appinfo;
+	
+	var EventEmitter = __webpack_require__(60);
+	var isOSX = appinfo.OS === "Darwin";
+	"use strict";
+	
+	// List of electron keys mapped to DOM API (DOM_VK_*) key code
+	var ElectronKeysMapping = {
+	  "F1": "DOM_VK_F1",
+	  "F2": "DOM_VK_F2",
+	  "F3": "DOM_VK_F3",
+	  "F4": "DOM_VK_F4",
+	  "F5": "DOM_VK_F5",
+	  "F6": "DOM_VK_F6",
+	  "F7": "DOM_VK_F7",
+	  "F8": "DOM_VK_F8",
+	  "F9": "DOM_VK_F9",
+	  "F10": "DOM_VK_F10",
+	  "F11": "DOM_VK_F11",
+	  "F12": "DOM_VK_F12",
+	  "F13": "DOM_VK_F13",
+	  "F14": "DOM_VK_F14",
+	  "F15": "DOM_VK_F15",
+	  "F16": "DOM_VK_F16",
+	  "F17": "DOM_VK_F17",
+	  "F18": "DOM_VK_F18",
+	  "F19": "DOM_VK_F19",
+	  "F20": "DOM_VK_F20",
+	  "F21": "DOM_VK_F21",
+	  "F22": "DOM_VK_F22",
+	  "F23": "DOM_VK_F23",
+	  "F24": "DOM_VK_F24",
+	  "Space": "DOM_VK_SPACE",
+	  "Backspace": "DOM_VK_BACK_SPACE",
+	  "Delete": "DOM_VK_DELETE",
+	  "Insert": "DOM_VK_INSERT",
+	  "Return": "DOM_VK_RETURN",
+	  "Enter": "DOM_VK_RETURN",
+	  "Up": "DOM_VK_UP",
+	  "Down": "DOM_VK_DOWN",
+	  "Left": "DOM_VK_LEFT",
+	  "Right": "DOM_VK_RIGHT",
+	  "Home": "DOM_VK_HOME",
+	  "End": "DOM_VK_END",
+	  "PageUp": "DOM_VK_PAGE_UP",
+	  "PageDown": "DOM_VK_PAGE_DOWN",
+	  "Escape": "DOM_VK_ESCAPE",
+	  "Esc": "DOM_VK_ESCAPE",
+	  "Tab": "DOM_VK_TAB",
+	  "VolumeUp": "DOM_VK_VOLUME_UP",
+	  "VolumeDown": "DOM_VK_VOLUME_DOWN",
+	  "VolumeMute": "DOM_VK_VOLUME_MUTE",
+	  "PrintScreen": "DOM_VK_PRINTSCREEN"
+	};
+	
+	/**
+	 * Helper to listen for keyboard events decribed in .properties file.
+	 *
+	 * let shortcuts = new KeyShortcuts({
+	 *   window
+	 * });
+	 * shortcuts.on("Ctrl+F", event => {
+	 *   // `event` is the KeyboardEvent which relates to the key shortcuts
+	 * });
+	 *
+	 * @param DOMWindow window
+	 *        The window object of the document to listen events from.
+	 * @param DOMElement target
+	 *        Optional DOM Element on which we should listen events from.
+	 *        If omitted, we listen for all events fired on `window`.
+	 */
+	function KeyShortcuts(_ref) {
+	  var window = _ref.window;
+	  var target = _ref.target;
+	
+	  this.window = window;
+	  this.target = target || window;
+	  this.keys = new Map();
+	  this.eventEmitter = new EventEmitter();
+	  this.target.addEventListener("keydown", this);
+	}
+	
+	/*
+	 * Parse an electron-like key string and return a normalized object which
+	 * allow efficient match on DOM key event. The normalized object matches DOM
+	 * API.
+	 *
+	 * @param DOMWindow window
+	 *        Any DOM Window object, just to fetch its `KeyboardEvent` object
+	 * @param String str
+	 *        The shortcut string to parse, following this document:
+	 *        https://github.com/electron/electron/blob/master/docs/api/accelerator.md
+	 */
+	KeyShortcuts.parseElectronKey = function (window, str) {
+	  var modifiers = str.split("+");
+	  var key = modifiers.pop();
+	
+	  var shortcut = {
+	    ctrl: false,
+	    meta: false,
+	    alt: false,
+	    shift: false,
+	    // Set for character keys
+	    key: undefined,
+	    // Set for non-character keys
+	    keyCode: undefined
+	  };
+	  for (var mod of modifiers) {
+	    if (mod === "Alt") {
+	      shortcut.alt = true;
+	    } else if (["Command", "Cmd"].includes(mod)) {
+	      shortcut.meta = true;
+	    } else if (["CommandOrControl", "CmdOrCtrl"].includes(mod)) {
+	      if (isOSX) {
+	        shortcut.meta = true;
+	      } else {
+	        shortcut.ctrl = true;
+	      }
+	    } else if (["Control", "Ctrl"].includes(mod)) {
+	      shortcut.ctrl = true;
+	    } else if (mod === "Shift") {
+	      shortcut.shift = true;
+	    } else {
+	      console.error("Unsupported modifier:", mod, "from key:", str);
+	      return null;
+	    }
+	  }
+	
+	  // Plus is a special case. It's a character key and shouldn't be matched
+	  // against a keycode as it is only accessible via Shift/Capslock
+	  if (key === "Plus") {
+	    key = "+";
+	  }
+	
+	  if (typeof key === "string" && key.length === 1) {
+	    // Match any single character
+	    shortcut.key = key.toLowerCase();
+	  } else if (key in ElectronKeysMapping) {
+	    // Maps the others manually to DOM API DOM_VK_*
+	    key = ElectronKeysMapping[key];
+	    shortcut.keyCode = window.KeyboardEvent[key];
+	    // Used only to stringify the shortcut
+	    shortcut.keyCodeString = key;
+	    shortcut.key = key;
+	  } else {
+	    console.error("Unsupported key:", key);
+	    return null;
+	  }
+	
+	  return shortcut;
+	};
+	
+	KeyShortcuts.stringify = function (shortcut) {
+	  var list = [];
+	  if (shortcut.alt) {
+	    list.push("Alt");
+	  }
+	  if (shortcut.ctrl) {
+	    list.push("Ctrl");
+	  }
+	  if (shortcut.meta) {
+	    list.push("Cmd");
+	  }
+	  if (shortcut.shift) {
+	    list.push("Shift");
+	  }
+	  var key = void 0;
+	  if (shortcut.key) {
+	    key = shortcut.key.toUpperCase();
+	  } else {
+	    key = shortcut.keyCodeString;
+	  }
+	  list.push(key);
+	  return list.join("+");
+	};
+	
+	KeyShortcuts.prototype = {
+	  destroy() {
+	    this.target.removeEventListener("keydown", this);
+	    this.keys.clear();
+	  },
+	
+	  doesEventMatchShortcut(event, shortcut) {
+	    if (shortcut.meta != event.metaKey) {
+	      return false;
+	    }
+	    if (shortcut.ctrl != event.ctrlKey) {
+	      return false;
+	    }
+	    if (shortcut.alt != event.altKey) {
+	      return false;
+	    }
+	    // Shift is a special modifier, it may implicitely be required if the
+	    // expected key is a special character accessible via shift.
+	    if (shortcut.shift != event.shiftKey && event.key && event.key.match(/[a-zA-Z]/)) {
+	      return false;
+	    }
+	    if (shortcut.keyCode) {
+	      return event.keyCode == shortcut.keyCode;
+	    } else if (event.key in ElectronKeysMapping) {
+	      return ElectronKeysMapping[event.key] === shortcut.key;
+	    }
+	
+	    // get the key from the keyCode if key is not provided.
+	    var key = event.key || String.fromCharCode(event.keyCode);
+	
+	    // For character keys, we match if the final character is the expected one.
+	    // But for digits we also accept indirect match to please azerty keyboard,
+	    // which requires Shift to be pressed to get digits.
+	    return key.toLowerCase() == shortcut.key || shortcut.key.match(/[0-9]/) && event.keyCode == shortcut.key.charCodeAt(0);
+	  },
+	
+	  handleEvent(event) {
+	    for (var _ref2 of this.keys) {
+	      var _ref3 = _slicedToArray(_ref2, 2);
+	
+	      var key = _ref3[0];
+	      var shortcut = _ref3[1];
+	
+	      if (this.doesEventMatchShortcut(event, shortcut)) {
+	        this.eventEmitter.emit(key, event);
+	      }
+	    }
+	  },
+	
+	  on(key, listener) {
+	    if (typeof listener !== "function") {
+	      throw new Error("KeyShortcuts.on() expects a function as " + "second argument");
+	    }
+	    if (!this.keys.has(key)) {
+	      var shortcut = KeyShortcuts.parseElectronKey(this.window, key);
+	      // The key string is wrong and we were unable to compute the key shortcut
+	      if (!shortcut) {
+	        return;
+	      }
+	      this.keys.set(key, shortcut);
+	    }
+	    this.eventEmitter.on(key, listener);
+	  },
+	
+	  off(key, listener) {
+	    this.eventEmitter.off(key, listener);
+	  }
+	};
+	exports.KeyShortcuts = KeyShortcuts;
+
+/***/ },
+/* 30 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var Services = __webpack_require__(31);
+	var SplitBox = __webpack_require__(32);
+	// const SplitBoxCSS = require("./client/shared/components/splitter/SplitBox.css")
+	var rep = __webpack_require__(34).Rep;
+	// const repCSS = require("./client/shared/components/reps/reps.css");
+	var Grip = __webpack_require__(44).Grip;
+	var sprintf = __webpack_require__(59).sprintf;
+	
+	module.exports = {
+	  Services,
+	  SplitBox,
+	  // SplitBoxCSS,
+	  rep,
+	  // repCSS,
+	  Grip,
+	  sprintf
+	};
+
+/***/ },
+/* 31 */
+/***/ function(module, exports) {
+
+	module.exports = devtoolsRequire("Services");
+
+/***/ },
+/* 32 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var React = __webpack_require__(2);
+	var ReactDOM = __webpack_require__(16);
+	var Draggable = React.createFactory(__webpack_require__(33));
+	var dom = React.DOM;
+	var PropTypes = React.PropTypes;
+	
+	/**
+	 * This component represents a Splitter. The splitter supports vertical
+	 * as well as horizontal mode.
+	 */
+	
+	var SplitBox = React.createClass({
+	
+	  propTypes: {
+	    // Custom class name. You can use more names separated by a space.
+	    className: PropTypes.string,
+	    // Initial size of controlled panel.
+	    initialSize: PropTypes.any,
+	    // Optional initial width of controlled panel.
+	    initialWidth: PropTypes.number,
+	    // Optional initial height of controlled panel.
+	    initialHeight: PropTypes.number,
+	    // Left/top panel
+	    startPanel: PropTypes.any,
+	    // Min panel size.
+	    minSize: PropTypes.any,
+	    // Max panel size.
+	    maxSize: PropTypes.any,
+	    // Right/bottom panel
+	    endPanel: PropTypes.any,
+	    // True if the right/bottom panel should be controlled.
+	    endPanelControl: PropTypes.bool,
+	    // Size of the splitter handle bar.
+	    splitterSize: PropTypes.number,
+	    // True if the splitter bar is vertical (default is vertical).
+	    vert: PropTypes.bool,
+	    // Optional style properties passed into the splitbox
+	    style: PropTypes.object
+	  },
+	
+	  displayName: "SplitBox",
+	
+	  getDefaultProps() {
+	    return {
+	      splitterSize: 5,
+	      vert: true,
+	      endPanelControl: false
+	    };
+	  },
+	
+	  /**
+	   * The state stores the current orientation (vertical or horizontal)
+	   * and the current size (width/height). All these values can change
+	   * during the component's life time.
+	   */
+	  getInitialState() {
+	    return {
+	      vert: this.props.vert,
+	      width: this.props.initialWidth || this.props.initialSize,
+	      height: this.props.initialHeight || this.props.initialSize
+	    };
+	  },
+	
+	  // Dragging Events
+	
+	  /**
+	   * Set 'resizing' cursor on entire document during splitter dragging.
+	   * This avoids cursor-flickering that happens when the mouse leaves
+	   * the splitter bar area (happens frequently).
+	   */
+	  onStartMove() {
+	    var splitBox = ReactDOM.findDOMNode(this);
+	    var doc = splitBox.ownerDocument;
+	    var defaultCursor = doc.documentElement.style.cursor;
+	    doc.documentElement.style.cursor = this.state.vert ? "ew-resize" : "ns-resize";
+	
+	    splitBox.classList.add("dragging");
+	
+	    this.setState({
+	      defaultCursor: defaultCursor
+	    });
+	  },
+	
+	  onStopMove() {
+	    var splitBox = ReactDOM.findDOMNode(this);
+	    var doc = splitBox.ownerDocument;
+	    doc.documentElement.style.cursor = this.state.defaultCursor;
+	
+	    splitBox.classList.remove("dragging");
+	  },
+	
+	  screenX() {
+	    var borderWidth = (window.outerWidth - window.innerWidth) / 2;
+	    return window.screenX + borderWidth;
+	  },
+	
+	  screenY() {
+	    var borderHeignt = window.outerHeight - window.innerHeight;
+	    return window.screenY + borderHeignt;
+	  },
+	
+	  /**
+	   * Adjust size of the controlled panel. Depending on the current
+	   * orientation we either remember the width or height of
+	   * the splitter box.
+	   */
+	  onMove(x, y) {
+	    var node = ReactDOM.findDOMNode(this);
+	    var doc = node.ownerDocument;
+	    var win = doc.defaultView;
+	
+	    var size = void 0;
+	    var endPanelControl = this.props.endPanelControl;
+	
+	
+	    if (this.state.vert) {
+	      // Switch the control flag in case of RTL. Note that RTL
+	      // has impact on vertical splitter only.
+	      var dir = win.getComputedStyle(doc.documentElement).direction;
+	      if (dir == "rtl") {
+	        endPanelControl = !endPanelControl;
+	      }
+	
+	      var innerOffset = x - this.screenX();
+	      size = endPanelControl ? node.offsetLeft + node.offsetWidth - innerOffset : innerOffset - node.offsetLeft;
+	
+	      this.setState({
+	        width: size
+	      });
+	    } else {
+	      var _innerOffset = y - this.screenY();
+	      size = endPanelControl ? node.offsetTop + node.offsetHeight - _innerOffset : _innerOffset - node.offsetTop;
+	
+	      this.setState({
+	        height: size
+	      });
+	    }
+	  },
+	
+	  // Rendering
+	
+	  render() {
+	    var vert = this.state.vert;
+	    var _props = this.props;
+	    var startPanel = _props.startPanel;
+	    var endPanel = _props.endPanel;
+	    var endPanelControl = _props.endPanelControl;
+	    var minSize = _props.minSize;
+	    var maxSize = _props.maxSize;
+	    var splitterSize = _props.splitterSize;
+	
+	
+	    var style = Object.assign({}, this.props.style);
+	
+	    // Calculate class names list.
+	    var classNames = ["split-box"];
+	    classNames.push(vert ? "vert" : "horz");
+	    if (this.props.className) {
+	      classNames = classNames.concat(this.props.className.split(" "));
+	    }
+	
+	    var leftPanelStyle = void 0;
+	    var rightPanelStyle = void 0;
+	
+	    // Set proper size for panels depending on the current state.
+	    if (vert) {
+	      leftPanelStyle = {
+	        maxWidth: endPanelControl ? null : maxSize,
+	        minWidth: endPanelControl ? null : minSize,
+	        width: endPanelControl ? null : this.state.width
+	      };
+	      rightPanelStyle = {
+	        maxWidth: endPanelControl ? maxSize : null,
+	        minWidth: endPanelControl ? minSize : null,
+	        width: endPanelControl ? this.state.width : null
+	      };
+	    } else {
+	      leftPanelStyle = {
+	        maxHeight: endPanelControl ? null : maxSize,
+	        minHeight: endPanelControl ? null : minSize,
+	        height: endPanelControl ? null : this.state.height
+	      };
+	      rightPanelStyle = {
+	        maxHeight: endPanelControl ? maxSize : null,
+	        minHeight: endPanelControl ? minSize : null,
+	        height: endPanelControl ? this.state.height : null
+	      };
+	    }
+	
+	    // Calculate splitter size
+	    var splitterStyle = {
+	      flex: "0 0 " + splitterSize + "px"
+	    };
+	
+	    return dom.div({
+	      className: classNames.join(" "),
+	      style: style }, startPanel ? dom.div({
+	      className: endPanelControl ? "uncontrolled" : "controlled",
+	      style: leftPanelStyle }, startPanel) : null, Draggable({
+	      className: "splitter",
+	      style: splitterStyle,
+	      onStart: this.onStartMove,
+	      onStop: this.onStopMove,
+	      onMove: this.onMove
+	    }), endPanel ? dom.div({
+	      className: endPanelControl ? "controlled" : "uncontrolled",
+	      style: rightPanelStyle }, endPanel) : null);
+	  }
+	});
+	
+	module.exports = SplitBox;
+
+/***/ },
+/* 33 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+	 * You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	var React = __webpack_require__(2);
+	var ReactDOM = __webpack_require__(16);
+	var dom = React.DOM;
+	var PropTypes = React.PropTypes;
+	
+	
+	var Draggable = React.createClass({
+	  displayName: "Draggable",
+	
+	  propTypes: {
+	    onMove: PropTypes.func.isRequired,
+	    onStart: PropTypes.func,
+	    onStop: PropTypes.func,
+	    style: PropTypes.object,
+	    className: PropTypes.string
+	  },
+	
+	  startDragging(ev) {
+	    ev.preventDefault();
+	    var doc = ReactDOM.findDOMNode(this).ownerDocument;
+	    doc.addEventListener("mousemove", this.onMove);
+	    doc.addEventListener("mouseup", this.onUp);
+	    this.props.onStart && this.props.onStart();
+	  },
+	
+	  onMove(ev) {
+	    ev.preventDefault();
+	    // Use screen coordinates so, moving mouse over iframes
+	    // doesn't mangle (relative) coordinates.
+	    this.props.onMove(ev.screenX, ev.screenY);
+	  },
+	
+	  onUp(ev) {
+	    ev.preventDefault();
+	    var doc = ReactDOM.findDOMNode(this).ownerDocument;
+	    doc.removeEventListener("mousemove", this.onMove);
+	    doc.removeEventListener("mouseup", this.onUp);
+	    this.props.onStop && this.props.onStop();
+	  },
+	
+	  render() {
+	    return dom.div({
+	      style: this.props.style,
+	      className: this.props.className,
+	      onMouseDown: this.startDragging
+	    });
+	  }
+	});
+	
+	module.exports = Draggable;
+
+/***/ },
+/* 34 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	
+	  // Load all existing rep templates
+	
+	  var _require2 = __webpack_require__(36);
+	
+	  var Undefined = _require2.Undefined;
+	
+	  var _require3 = __webpack_require__(37);
+	
+	  var Null = _require3.Null;
+	
+	  var _require4 = __webpack_require__(38);
+	
+	  var StringRep = _require4.StringRep;
+	
+	  var _require5 = __webpack_require__(39);
+	
+	  var Number = _require5.Number;
+	
+	  var _require6 = __webpack_require__(40);
+	
+	  var ArrayRep = _require6.ArrayRep;
+	
+	  var _require7 = __webpack_require__(42);
+	
+	  var Obj = _require7.Obj;
+	
+	  var _require8 = __webpack_require__(45);
+	
+	  var SymbolRep = _require8.SymbolRep;
+	
+	  // DOM types (grips)
+	
+	  var _require9 = __webpack_require__(46);
+	
+	  var Attribute = _require9.Attribute;
+	
+	  var _require10 = __webpack_require__(47);
+	
+	  var DateTime = _require10.DateTime;
+	
+	  var _require11 = __webpack_require__(48);
+	
+	  var Document = _require11.Document;
+	
+	  var _require12 = __webpack_require__(49);
+	
+	  var Event = _require12.Event;
+	
+	  var _require13 = __webpack_require__(50);
+	
+	  var Func = _require13.Func;
+	
+	  var _require14 = __webpack_require__(51);
+	
+	  var RegExp = _require14.RegExp;
+	
+	  var _require15 = __webpack_require__(52);
+	
+	  var StyleSheet = _require15.StyleSheet;
+	
+	  var _require16 = __webpack_require__(53);
+	
+	  var TextNode = _require16.TextNode;
+	
+	  var _require17 = __webpack_require__(54);
+	
+	  var Window = _require17.Window;
+	
+	  var _require18 = __webpack_require__(55);
+	
+	  var ObjectWithText = _require18.ObjectWithText;
+	
+	  var _require19 = __webpack_require__(56);
+	
+	  var ObjectWithURL = _require19.ObjectWithURL;
+	
+	  var _require20 = __webpack_require__(57);
+	
+	  var GripArray = _require20.GripArray;
+	
+	  var _require21 = __webpack_require__(58);
+	
+	  var GripMap = _require21.GripMap;
+	
+	  var _require22 = __webpack_require__(44);
+	
+	  var Grip = _require22.Grip;
+	
+	  // List of all registered template.
+	  // XXX there should be a way for extensions to register a new
+	  // or modify an existing rep.
+	
+	  var reps = [RegExp, StyleSheet, Event, DateTime, TextNode, Attribute, Func, ArrayRep, Document, Window, ObjectWithText, ObjectWithURL, GripArray, GripMap, Grip, Undefined, Null, StringRep, Number, SymbolRep];
+	
+	  /**
+	   * Generic rep that is using for rendering native JS types or an object.
+	   * The right template used for rendering is picked automatically according
+	   * to the current value type. The value must be passed is as 'object'
+	   * property.
+	   */
+	  var Rep = React.createClass({
+	    displayName: "Rep",
+	
+	    propTypes: {
+	      object: React.PropTypes.any,
+	      defaultRep: React.PropTypes.object,
+	      mode: React.PropTypes.string
+	    },
+	
+	    render: function () {
+	      var rep = getRep(this.props.object, this.props.defaultRep);
+	      return rep(this.props);
+	    }
+	  });
+	
+	  // Helpers
+	
+	  /**
+	   * Return a rep object that is responsible for rendering given
+	   * object.
+	   *
+	   * @param object {Object} Object to be rendered in the UI. This
+	   * can be generic JS object as well as a grip (handle to a remote
+	   * debuggee object).
+	   *
+	   * @param defaultObject {React.Component} The default template
+	   * that should be used to render given object if none is found.
+	   */
+	  function getRep(object) {
+	    var defaultRep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Obj;
+	
+	    var type = typeof object;
+	    if (type == "object" && object instanceof String) {
+	      type = "string";
+	    } else if (type == "object" && object.type === "symbol") {
+	      type = "symbol";
+	    }
+	
+	    if (isGrip(object)) {
+	      type = object.class;
+	    }
+	
+	    for (var i = 0; i < reps.length; i++) {
+	      var rep = reps[i];
+	      try {
+	        // supportsObject could return weight (not only true/false
+	        // but a number), which would allow to priorities templates and
+	        // support better extensibility.
+	        if (rep.supportsObject(object, type)) {
+	          return React.createFactory(rep.rep);
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	    }
+	
+	    return React.createFactory(defaultRep.rep);
+	  }
+	
+	  // Exports from this module
+	  exports.Rep = Rep;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 35 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* globals URLSearchParams */
+	/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  /**
+	   * Create React factories for given arguments.
+	   * Example:
+	   *   const { Rep } = createFactories(require("./rep"));
+	   */
+	  function createFactories(args) {
+	    var result = {};
+	    for (var p in args) {
+	      result[p] = React.createFactory(args[p]);
+	    }
+	    return result;
+	  }
+	
+	  /**
+	   * Returns true if the given object is a grip (see RDP protocol)
+	   */
+	  function isGrip(object) {
+	    return object && object.actor;
+	  }
+	
+	  function escapeNewLines(value) {
+	    return value.replace(/\r/gm, "\\r").replace(/\n/gm, "\\n");
+	  }
+	
+	  function cropMultipleLines(text, limit) {
+	    return escapeNewLines(cropString(text, limit));
+	  }
+	
+	  function cropString(text, limit, alternativeText) {
+	    if (!alternativeText) {
+	      alternativeText = "\u2026";
+	    }
+	
+	    // Make sure it's a string.
+	    text = text + "";
+	
+	    // Crop the string only if a limit is actually specified.
+	    if (!limit || limit <= 0) {
+	      return text;
+	    }
+	
+	    // Set the limit at least to the length of the alternative text
+	    // plus one character of the original text.
+	    if (limit <= alternativeText.length) {
+	      limit = alternativeText.length + 1;
+	    }
+	
+	    var halfLimit = (limit - alternativeText.length) / 2;
+	
+	    if (text.length > limit) {
+	      return text.substr(0, Math.ceil(halfLimit)) + alternativeText + text.substr(text.length - Math.floor(halfLimit));
+	    }
+	
+	    return text;
+	  }
+	
+	  function parseURLParams(url) {
+	    url = new URL(url);
+	    return parseURLEncodedText(url.searchParams);
+	  }
+	
+	  function parseURLEncodedText(text) {
+	    var params = [];
+	
+	    // In case the text is empty just return the empty parameters
+	    if (text == "") {
+	      return params;
+	    }
+	
+	    var searchParams = new URLSearchParams(text);
+	    var entries = [].concat(_toConsumableArray(searchParams.entries()));
+	    return entries.map(entry => {
+	      return {
+	        name: entry[0],
+	        value: entry[1]
+	      };
+	    });
+	  }
+	
+	  function getFileName(url) {
+	    var split = splitURLBase(url);
+	    return split.name;
+	  }
+	
+	  function splitURLBase(url) {
+	    if (!isDataURL(url)) {
+	      return splitURLTrue(url);
+	    }
+	    return {};
+	  }
+	
+	  function getURLDisplayString(url) {
+	    return cropString(url);
+	  }
+	
+	  function isDataURL(url) {
+	    return url && url.substr(0, 5) == "data:";
+	  }
+	
+	  function splitURLTrue(url) {
+	    var reSplitFile = /(.*?):\/{2,3}([^\/]*)(.*?)([^\/]*?)($|\?.*)/;
+	    var m = reSplitFile.exec(url);
+	
+	    if (!m) {
+	      return {
+	        name: url,
+	        path: url
+	      };
+	    } else if (m[4] == "" && m[5] == "") {
+	      return {
+	        protocol: m[1],
+	        domain: m[2],
+	        path: m[3],
+	        name: m[3] != "/" ? m[3] : m[2]
+	      };
+	    }
+	
+	    return {
+	      protocol: m[1],
+	      domain: m[2],
+	      path: m[2] + m[3],
+	      name: m[4] + m[5]
+	    };
+	  }
+	
+	  // Exports from this module
+	  exports.createFactories = createFactories;
+	  exports.isGrip = isGrip;
+	  exports.cropString = cropString;
+	  exports.cropMultipleLines = cropMultipleLines;
+	  exports.parseURLParams = parseURLParams;
+	  exports.parseURLEncodedText = parseURLEncodedText;
+	  exports.getFileName = getFileName;
+	  exports.getURLDisplayString = getURLDisplayString;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 36 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  // Shortcuts
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders undefined value
+	   */
+	
+	  var Undefined = React.createClass({
+	    displayName: "UndefinedRep",
+	
+	    render: function () {
+	      return span({ className: "objectBox objectBox-undefined" }, "undefined");
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    if (object && object.type && object.type == "undefined") {
+	      return true;
+	    }
+	
+	    return type == "undefined";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Undefined = {
+	    rep: Undefined,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 37 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  // Shortcuts
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders null value
+	   */
+	
+	  var Null = React.createClass({
+	    displayName: "NullRep",
+	
+	    render: function () {
+	      return span({ className: "objectBox objectBox-null" }, "null");
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    if (object && object.type && object.type == "null") {
+	      return true;
+	    }
+	
+	    return object == null;
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Null = {
+	    rep: Null,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 38 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var cropMultipleLines = _require.cropMultipleLines;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a string. String value is enclosed within quotes.
+	   */
+	
+	  var StringRep = React.createClass({
+	    displayName: "StringRep",
+	
+	    propTypes: {
+	      useQuotes: React.PropTypes.bool
+	    },
+	
+	    getDefaultProps: function () {
+	      return {
+	        useQuotes: true
+	      };
+	    },
+	
+	    render: function () {
+	      var text = this.props.object;
+	      var member = this.props.member;
+	      if (member && member.open) {
+	        return span({ className: "objectBox objectBox-string" }, "\"" + text + "\"");
+	      }
+	
+	      var croppedString = this.props.cropLimit ? cropMultipleLines(text, this.props.cropLimit) : cropMultipleLines(text);
+	
+	      var formattedString = this.props.useQuotes ? "\"" + croppedString + "\"" : croppedString;
+	
+	      return span({ className: "objectBox objectBox-string" }, formattedString);
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    return type == "string";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.StringRep = {
+	    rep: StringRep,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 39 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  // Shortcuts
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a number
+	   */
+	
+	  var Number = React.createClass({
+	    displayName: "Number",
+	
+	    stringify: function (object) {
+	      var isNegativeZero = Object.is(object, -0) || object.type && object.type == "-0";
+	
+	      return isNegativeZero ? "-0" : String(object);
+	    },
+	
+	    render: function () {
+	      var value = this.props.object;
+	
+	      return span({ className: "objectBox objectBox-number" }, this.stringify(value));
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    return type == "boolean" || type == "number" || type == "object" && object.type == "-0";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Number = {
+	    rep: Number,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 40 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	
+	  var _createFactories = createFactories(__webpack_require__(41));
+	
+	  var Caption = _createFactories.Caption;
+	
+	  // Shortcuts
+	
+	  var DOM = React.DOM;
+	
+	  /**
+	   * Renders an array. The array is enclosed by left and right bracket
+	   * and the max number of rendered items depends on the current mode.
+	   */
+	  var ArrayRep = React.createClass({
+	    displayName: "ArrayRep",
+	
+	    getTitle: function (object, context) {
+	      return "[" + object.length + "]";
+	    },
+	
+	    arrayIterator: function (array, max) {
+	      var items = [];
+	      var delim = void 0;
+	
+	      for (var i = 0; i < array.length && i < max; i++) {
+	        try {
+	          var value = array[i];
+	
+	          delim = i == array.length - 1 ? "" : ", ";
+	
+	          items.push(ItemRep({
+	            key: i,
+	            object: value,
+	            // Hardcode tiny mode to avoid recursive handling.
+	            mode: "tiny",
+	            delim: delim
+	          }));
+	        } catch (exc) {
+	          items.push(ItemRep({
+	            key: i,
+	            object: exc,
+	            mode: "tiny",
+	            delim: delim
+	          }));
+	        }
+	      }
+	
+	      if (array.length > max) {
+	        var objectLink = this.props.objectLink || DOM.span;
+	        items.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: this.props.object
+	          }, array.length - max + " more…")
+	        }));
+	      }
+	
+	      return items;
+	    },
+	
+	    /**
+	     * Returns true if the passed object is an array with additional (custom)
+	     * properties, otherwise returns false. Custom properties should be
+	     * displayed in extra expandable section.
+	     *
+	     * Example array with a custom property.
+	     * let arr = [0, 1];
+	     * arr.myProp = "Hello";
+	     *
+	     * @param {Array} array The array object.
+	     */
+	    hasSpecialProperties: function (array) {
+	      function isInteger(x) {
+	        var y = parseInt(x, 10);
+	        if (isNaN(y)) {
+	          return false;
+	        }
+	        return x === y.toString();
+	      }
+	
+	      var props = Object.getOwnPropertyNames(array);
+	      for (var i = 0; i < props.length; i++) {
+	        var p = props[i];
+	
+	        // Valid indexes are skipped
+	        if (isInteger(p)) {
+	          continue;
+	        }
+	
+	        // Ignore standard 'length' property, anything else is custom.
+	        if (p != "length") {
+	          return true;
+	        }
+	      }
+	
+	      return false;
+	    },
+	
+	    // Event Handlers
+	
+	    onToggleProperties: function (event) {},
+	
+	    onClickBracket: function (event) {},
+	
+	    render: function () {
+	      var mode = this.props.mode || "short";
+	      var object = this.props.object;
+	      var items = void 0;
+	      var brackets = void 0;
+	      var needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]" } : { left: "[", right: "]" };
+	      };
+	
+	      if (mode == "tiny") {
+	        var isEmpty = object.length === 0;
+	        items = DOM.span({ className: "length" }, isEmpty ? "" : object.length);
+	        brackets = needSpace(false);
+	      } else {
+	        var max = mode == "short" ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+	
+	      var objectLink = this.props.objectLink || DOM.span;
+	
+	      return DOM.span({
+	        className: "objectBox objectBox-array" }, objectLink({
+	        className: "arrayLeftBracket",
+	        object: object
+	      }, brackets.left), items, objectLink({
+	        className: "arrayRightBracket",
+	        object: object
+	      }, brackets.right), DOM.span({
+	        className: "arrayProperties",
+	        role: "group" }));
+	    }
+	  });
+	
+	  /**
+	   * Renders array item. Individual values are separated by a comma.
+	   */
+	  var ItemRep = React.createFactory(React.createClass({
+	    displayName: "ItemRep",
+	
+	    render: function () {
+	      var _createFactories2 = createFactories(__webpack_require__(34));
+	
+	      var Rep = _createFactories2.Rep;
+	
+	
+	      var object = this.props.object;
+	      var delim = this.props.delim;
+	      var mode = this.props.mode;
+	      return DOM.span({}, Rep({ object: object, mode: mode }), delim);
+	    }
+	  }));
+	
+	  function supportsObject(object, type) {
+	    return Array.isArray(object) || Object.prototype.toString.call(object) === "[object Arguments]";
+	  }
+	
+	  // Exports from this module
+	  exports.ArrayRep = {
+	    rep: ArrayRep,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 41 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	  var DOM = React.DOM;
+	
+	  /**
+	   * Renders a caption. This template is used by other components
+	   * that needs to distinguish between a simple text/value and a label.
+	   */
+	  var Caption = React.createClass({
+	    displayName: "Caption",
+	
+	    render: function () {
+	      return DOM.span({ "className": "caption" }, this.props.object);
+	    }
+	  });
+	
+	  // Exports from this module
+	  exports.Caption = Caption;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 42 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 	
 	"use strict";
-	
-	/* General utilities used throughout devtools. */
-	
-	var { Ci, Cu, Cc, components } = __webpack_require__(28);
-	var Services = __webpack_require__(33);
-	var promise = __webpack_require__(39);
-	
-	const { FileUtils } = __webpack_require__(40);
-	
-	/**
-	 * Turn the error |aError| into a string, without fail.
-	 */
-	exports.safeErrorString = function safeErrorString(aError) {
-	  try {
-	    let errorString = aError.toString();
-	    if (typeof errorString == "string") {
-	      // Attempt to attach a stack to |errorString|. If it throws an error, or
-	      // isn't a string, don't use it.
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	
+	  var _createFactories = createFactories(__webpack_require__(41));
+	
+	  var Caption = _createFactories.Caption;
+	
+	  var _createFactories2 = createFactories(__webpack_require__(43));
+	
+	  var PropRep = _createFactories2.PropRep;
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	  /**
+	   * Renders an object. An object is represented by a list of its
+	   * properties enclosed in curly brackets.
+	   */
+	
+	  var Obj = React.createClass({
+	    displayName: "Obj",
+	
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string
+	    },
+	
+	    getTitle: function (object) {
+	      var className = object && object.class ? object.class : "Object";
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, className);
+	      }
+	      return className;
+	    },
+	
+	    safePropIterator: function (object, max) {
+	      max = typeof max === "undefined" ? 3 : max;
+	      try {
+	        return this.propIterator(object, max);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    propIterator: function (object, max) {
+	      var isInterestingProp = (t, value) => {
+	        // Do not pick objects, it could cause recursion.
+	        return t == "boolean" || t == "number" || t == "string" && value;
+	      };
+	
+	      // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=945377
+	      if (Object.prototype.toString.call(object) === "[object Generator]") {
+	        object = Object.getPrototypeOf(object);
+	      }
+	
+	      // Object members with non-empty values are preferred since it gives the
+	      // user a better overview of the object.
+	      var props = this.getProps(object, max, isInterestingProp);
+	
+	      if (props.length <= max) {
+	        // There are not enough props yet (or at least, not enough props to
+	        // be able to know whether we should print "more…" or not).
+	        // Let's display also empty members and functions.
+	        props = props.concat(this.getProps(object, max, (t, value) => {
+	          return !isInterestingProp(t, value);
+	        }));
+	      }
+	
+	      if (props.length > max) {
+	        props.pop();
+	        var objectLink = this.props.objectLink || span;
+	
+	        props.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, Object.keys(object).length - max + " more…")
+	        }));
+	      } else if (props.length > 0) {
+	        // Remove the last comma.
+	        props[props.length - 1] = React.cloneElement(props[props.length - 1], { delim: "" });
+	      }
+	
+	      return props;
+	    },
+	
+	    getProps: function (object, max, filter) {
+	      var props = [];
+	
+	      max = max || 3;
+	      if (!object) {
+	        return props;
+	      }
+	
+	      // Hardcode tiny mode to avoid recursive handling.
+	      var mode = "tiny";
+	
 	      try {
-	        if (aError.stack) {
-	          let stack = aError.stack.toString();
-	          if (typeof stack == "string") {
-	            errorString += "\nStack: " + stack;
-	          }
-	        }
-	      } catch (ee) { }
-	
-	      // Append additional line and column number information to the output,
-	      // since it might not be part of the stringified error.
-	      if (typeof aError.lineNumber == "number" && typeof aError.columnNumber == "number") {
-	        errorString += "Line: " + aError.lineNumber + ", column: " + aError.columnNumber;
-	      }
-	
-	      return errorString;
-	    }
-	  } catch (ee) { }
-	
-	  // We failed to find a good error description, so do the next best thing.
-	  return Object.prototype.toString.call(aError);
-	}
-	
-	/**
-	 * Report that |aWho| threw an exception, |aException|.
-	 */
-	exports.reportException = function reportException(aWho, aException) {
-	  let msg = aWho + " threw an exception: " + exports.safeErrorString(aException);
-	
-	  console.log(msg);
-	
-	//  if (Cu && console.error) {
-	//    /*
-	//     * Note that the xpcshell test harness registers an observer for
-	//     * console messages, so when we're running tests, this will cause
-	//     * the test to quit.
-	//     */
-	//    console.error(msg);
-	//  }
-	}
-	
-	/**
-	 * Given a handler function that may throw, return an infallible handler
-	 * function that calls the fallible handler, and logs any exceptions it
-	 * throws.
-	 *
-	 * @param aHandler function
-	 *      A handler function, which may throw.
-	 * @param aName string
-	 *      A name for aHandler, for use in error messages. If omitted, we use
-	 *      aHandler.name.
-	 *
-	 * (SpiderMonkey does generate good names for anonymous functions, but we
-	 * don't have a way to get at them from JavaScript at the moment.)
-	 */
-	exports.makeInfallible = function makeInfallible(aHandler, aName) {
-	  if (!aName)
-	    aName = aHandler.name;
-	
-	  return function (/* arguments */) {
-	    // try {
-	      return aHandler.apply(this, arguments);
-	    // } catch (ex) {
-	    //   let who = "Handler function";
-	    //   if (aName) {
-	    //     who += " " + aName;
-	    //   }
-	    //   return exports.reportException(who, ex);
-	    // }
-	  }
-	}
-	
-	
-	/**
-	 * Waits for the next tick in the event loop to execute a callback.
-	 */
-	exports.executeSoon = function executeSoon(aFn) {
-	  setTimeout(aFn, 0);
-	};
-	
-	/**
-	 * Waits for the next tick in the event loop.
-	 *
-	 * @return Promise
-	 *         A promise that is resolved after the next tick in the event loop.
-	 */
-	exports.waitForTick = function waitForTick() {
-	  let deferred = promise.defer();
-	  exports.executeSoon(deferred.resolve);
-	  return deferred.promise;
-	};
-	
-	/**
-	 * Waits for the specified amount of time to pass.
-	 *
-	 * @param number aDelay
-	 *        The amount of time to wait, in milliseconds.
-	 * @return Promise
-	 *         A promise that is resolved after the specified amount of time passes.
-	 */
-	exports.waitForTime = function waitForTime(aDelay) {
-	  let deferred = promise.defer();
-	  setTimeout(deferred.resolve, aDelay);
-	  return deferred.promise;
-	};
-	
-	/**
-	 * Like Array.prototype.forEach, but doesn't cause jankiness when iterating over
-	 * very large arrays by yielding to the browser and continuing execution on the
-	 * next tick.
-	 *
-	 * @param Array aArray
-	 *        The array being iterated over.
-	 * @param Function aFn
-	 *        The function called on each item in the array. If a promise is
-	 *        returned by this function, iterating over the array will be paused
-	 *        until the respective promise is resolved.
-	 * @returns Promise
-	 *          A promise that is resolved once the whole array has been iterated
-	 *          over, and all promises returned by the aFn callback are resolved.
-	 */
-	exports.yieldingEach = function yieldingEach(aArray, aFn) {
-	  const deferred = promise.defer();
-	
-	  let i = 0;
-	  let len = aArray.length;
-	  let outstanding = [deferred.promise];
-	
-	  (function loop() {
-	    const start = Date.now();
-	
-	    while (i < len) {
-	      // Don't block the main thread for longer than 16 ms at a time. To
-	      // maintain 60fps, you have to render every frame in at least 16ms; we
-	      // aren't including time spent in non-JS here, but this is Good
-	      // Enough(tm).
-	      if (Date.now() - start > 16) {
-	        exports.executeSoon(loop);
-	        return;
-	      }
+	        for (var name in object) {
+	          if (props.length > max) {
+	            return props;
+	          }
+	
+	          var value = void 0;
+	          try {
+	            value = object[name];
+	          } catch (exc) {
+	            continue;
+	          }
+	
+	          var t = typeof value;
+	          if (filter(t, value)) {
+	            props.push(PropRep({
+	              key: name,
+	              mode: mode,
+	              name: name,
+	              object: value,
+	              equal: ": ",
+	              delim: ", "
+	            }));
+	          }
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	
+	      return props;
+	    },
+	
+	    render: function () {
+	      var object = this.props.object;
+	      var props = this.safePropIterator(object);
+	      var objectLink = this.props.objectLink || span;
+	
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return span({ className: "objectBox objectBox-object" }, objectLink({ className: "objectTitle" }, this.getTitle(object)));
+	      }
+	
+	      return span({ className: "objectBox objectBox-object" }, this.getTitle(object), objectLink({
+	        className: "objectLeftBrace",
+	        object: object
+	      }, " { "), props, objectLink({
+	        className: "objectRightBrace",
+	        object: object
+	      }, " }"));
+	    }
+	  });
+	  function supportsObject(object, type) {
+	    return true;
+	  }
+	
+	  // Exports from this module
+	  exports.Obj = {
+	    rep: Obj,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 43 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Property for Obj (local JS objects), Grip (remote JS objects)
+	   * and GripMap (remote JS maps and weakmaps) reps.
+	   * It's used to render object properties.
+	   */
+	
+	  var PropRep = React.createFactory(React.createClass({
+	    displayName: "PropRep",
+	
+	    propTypes: {
+	      // Property name.
+	      name: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.object]).isRequired,
+	      // Equal character rendered between property name and value.
+	      equal: React.PropTypes.string,
+	      // Delimiter character used to separate individual properties.
+	      delim: React.PropTypes.string,
+	      mode: React.PropTypes.string
+	    },
+	
+	    render: function () {
+	      var _require2 = __webpack_require__(44);
+	
+	      var Grip = _require2.Grip;
+	
+	      var _createFactories = createFactories(__webpack_require__(34));
+	
+	      var Rep = _createFactories.Rep;
+	
+	
+	      var key = void 0;
+	      // The key can be a simple string, for plain objects,
+	      // or another object for maps and weakmaps.
+	      if (typeof this.props.name === "string") {
+	        key = span({ "className": "nodeName" }, this.props.name);
+	      } else {
+	        key = Rep({
+	          object: this.props.name,
+	          mode: this.props.mode || "tiny",
+	          defaultRep: Grip,
+	          objectLink: this.props.objectLink
+	        });
+	      }
+	
+	      return span({}, key, span({
+	        "className": "objectEqual"
+	      }, this.props.equal), Rep(this.props), span({
+	        "className": "objectComma"
+	      }, this.props.delim));
+	    }
+	  }));
+	
+	  // Exports from this module
+	  exports.PropRep = PropRep;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 44 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	  // Dependencies
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var isGrip = _require.isGrip;
+	
+	  var _createFactories = createFactories(__webpack_require__(41));
+	
+	  var Caption = _createFactories.Caption;
+	
+	  var _createFactories2 = createFactories(__webpack_require__(43));
+	
+	  var PropRep = _createFactories2.PropRep;
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders generic grip. Grip is client representation
+	   * of remote JS object and is used as an input object
+	   * for this rep component.
+	   */
+	
+	  var GripRep = React.createClass({
+	    displayName: "Grip",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	      isInterestingProp: React.PropTypes.func
+	    },
+	
+	    getTitle: function (object) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, object.class);
+	      }
+	      return object.class || "Object";
+	    },
+	
+	    safePropIterator: function (object, max) {
+	      max = typeof max === "undefined" ? 3 : max;
+	      try {
+	        return this.propIterator(object, max);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    propIterator: function (object, max) {
+	      // Property filter. Show only interesting properties to the user.
+	      var isInterestingProp = this.props.isInterestingProp || ((type, value) => {
+	        return type == "boolean" || type == "number" || type == "string" && value.length != 0;
+	      });
+	
+	      var ownProperties = object.preview ? object.preview.ownProperties : [];
+	      var indexes = this.getPropIndexes(ownProperties, max, isInterestingProp);
+	      if (indexes.length < max && indexes.length < object.ownPropertyLength) {
+	        // There are not enough props yet. Then add uninteresting props to display them.
+	        indexes = indexes.concat(this.getPropIndexes(ownProperties, max - indexes.length, (t, value, name) => {
+	          return !isInterestingProp(t, value, name);
+	        }));
+	      }
+	
+	      var props = this.getProps(ownProperties, indexes);
+	      if (props.length < object.ownPropertyLength) {
+	        // There are some undisplayed props. Then display "more...".
+	        var objectLink = this.props.objectLink || span;
+	
+	        props.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, (object ? object.ownPropertyLength : 0) - max + " more…")
+	        }));
+	      } else if (props.length > 0) {
+	        // Remove the last comma.
+	        // NOTE: do not change comp._store.props directly to update a property,
+	        // it should be re-rendered or cloned with changed props
+	        var last = props.length - 1;
+	        props[last] = React.cloneElement(props[last], {
+	          delim: ""
+	        });
+	      }
+	
+	      return props;
+	    },
+	
+	    /**
+	     * Get props ordered by index.
+	     *
+	     * @param {Object} ownProperties Props object.
+	     * @param {Array} indexes Indexes of props.
+	     * @return {Array} Props.
+	     */
+	    getProps: function (ownProperties, indexes) {
+	      var props = [];
+	
+	      // Make indexes ordered by ascending.
+	      indexes.sort(function (a, b) {
+	        return a - b;
+	      });
+	
+	      indexes.forEach(i => {
+	        var name = Object.keys(ownProperties)[i];
+	        var prop = ownProperties[name];
+	        var value = prop.value !== undefined ? prop.value : prop;
+	        props.push(PropRep(Object.assign({}, this.props, {
+	          key: name,
+	          mode: "tiny",
+	          name: name,
+	          object: value,
+	          equal: ": ",
+	          delim: ", ",
+	          defaultRep: Grip
+	        })));
+	      });
+	
+	      return props;
+	    },
+	
+	    /**
+	     * Get the indexes of props in the object.
+	     *
+	     * @param {Object} ownProperties Props object.
+	     * @param {Number} max The maximum length of indexes array.
+	     * @param {Function} filter Filter the props you want.
+	     * @return {Array} Indexes of interesting props in the object.
+	     */
+	    getPropIndexes: function (ownProperties, max, filter) {
+	      var indexes = [];
 	
 	      try {
-	        outstanding.push(aFn(aArray[i], i++));
-	      } catch (e) {
-	        deferred.reject(e);
-	        return;
-	      }
-	    }
-	
-	    deferred.resolve();
-	  }());
-	
-	  return promise.all(outstanding);
-	}
-	
-	/**
-	 * Like XPCOMUtils.defineLazyGetter, but with a |this| sensitive getter that
-	 * allows the lazy getter to be defined on a prototype and work correctly with
-	 * instances.
-	 *
-	 * @param Object aObject
-	 *        The prototype object to define the lazy getter on.
-	 * @param String aKey
-	 *        The key to define the lazy getter on.
-	 * @param Function aCallback
-	 *        The callback that will be called to determine the value. Will be
-	 *        called with the |this| value of the current instance.
-	 */
-	exports.defineLazyPrototypeGetter =
-	function defineLazyPrototypeGetter(aObject, aKey, aCallback) {
-	  Object.defineProperty(aObject, aKey, {
-	    configurable: true,
-	    get: function() {
-	      const value = aCallback.call(this);
-	
-	      Object.defineProperty(this, aKey, {
-	        configurable: true,
-	        writable: true,
-	        value: value
-	      });
-	
-	      return value;
-	    }
-	  });
-	}
-	
-	/**
-	 * Safely get the property value from a Debugger.Object for a given key. Walks
-	 * the prototype chain until the property is found.
-	 *
-	 * @param Debugger.Object aObject
-	 *        The Debugger.Object to get the value from.
-	 * @param String aKey
-	 *        The key to look for.
-	 * @return Any
-	 */
-	exports.getProperty = function getProperty(aObj, aKey) {
-	  let root = aObj;
-	  try {
-	    do {
-	      const desc = aObj.getOwnPropertyDescriptor(aKey);
-	      if (desc) {
-	        if ("value" in desc) {
-	          return desc.value;
-	        }
-	        // Call the getter if it's safe.
-	        return exports.hasSafeGetter(desc) ? desc.get.call(root).return : undefined;
-	      }
-	      aObj = aObj.proto;
-	    } while (aObj);
-	  } catch (e) {
-	    // If anything goes wrong report the error and return undefined.
-	    exports.reportException("getProperty", e);
-	  }
-	  return undefined;
-	};
-	
-	/**
-	 * Determines if a descriptor has a getter which doesn't call into JavaScript.
-	 *
-	 * @param Object aDesc
-	 *        The descriptor to check for a safe getter.
-	 * @return Boolean
-	 *         Whether a safe getter was found.
-	 */
-	exports.hasSafeGetter = function hasSafeGetter(aDesc) {
-	  // Scripted functions that are CCWs will not appear scripted until after
-	  // unwrapping.
-	  try {
-	    let fn = aDesc.get.unwrap();
-	    return fn && fn.callable && fn.class == "Function" && fn.script === undefined;
-	  } catch(e) {
-	    // Avoid exception 'Object in compartment marked as invisible to Debugger'
-	    return false;
-	  }
-	};
-	
-	/**
-	 * Check if it is safe to read properties and execute methods from the given JS
-	 * object. Safety is defined as being protected from unintended code execution
-	 * from content scripts (or cross-compartment code).
-	 *
-	 * See bugs 945920 and 946752 for discussion.
-	 *
-	 * @type Object aObj
-	 *       The object to check.
-	 * @return Boolean
-	 *         True if it is safe to read properties from aObj, or false otherwise.
-	 */
-	exports.isSafeJSObject = function isSafeJSObject(aObj) {
-	  // If we are running on a worker thread, Cu is not available. In this case,
-	  // we always return false, just to be on the safe side.
-	  if (isWorker) {
-	    return false;
-	  }
-	
-	  if (Cu.getGlobalForObject(aObj) ==
-	      Cu.getGlobalForObject(exports.isSafeJSObject)) {
-	    return true; // aObj is not a cross-compartment wrapper.
-	  }
-	
-	  let principal = Cu.getObjectPrincipal(aObj);
-	  if (Services.scriptSecurityManager.isSystemPrincipal(principal)) {
-	    return true; // allow chrome objects
-	  }
-	
-	  return Cu.isXrayWrapper(aObj);
-	};
-	
-	exports.dumpn = function dumpn(str) {
-	  if (exports.dumpn.wantLogging) {
-	    console.log("DBG-SERVER: " + str + "\n");
-	  }
-	}
-	
-	// We want wantLogging to be writable. The exports object is frozen by the
-	// loader, so define it on dumpn instead.
-	exports.dumpn.wantLogging = false;
-	
-	/**
-	 * A verbose logger for low-level tracing.
-	 */
-	exports.dumpv = function(msg) {
-	  if (exports.dumpv.wantVerbose) {
-	    exports.dumpn(msg);
-	  }
-	};
-	
-	// We want wantLogging to be writable. The exports object is frozen by the
-	// loader, so define it on dumpn instead.
-	exports.dumpv.wantVerbose = false;
-	
-	/**
-	 * Utility function for updating an object with the properties of
-	 * other objects.
-	 *
-	 * @param aTarget Object
-	 *        The object being updated.
-	 * @param aNewAttrs Object
-	 *        The rest params are objects to update aTarget with. You
-	 *        can pass as many as you like.
-	 */
-	exports.update = function update(aTarget, ...aArgs) {
-	  for (let attrs of aArgs) {
-	    for (let key in attrs) {
-	      let desc = Object.getOwnPropertyDescriptor(attrs, key);
-	
-	      if (desc) {
-	        Object.defineProperty(aTarget, key, desc);
-	      }
-	    }
-	  }
-	
-	  return aTarget;
-	}
-	
-	/**
-	 * Utility function for getting the values from an object as an array
-	 *
-	 * @param aObject Object
-	 *        The object to iterate over
-	 */
-	exports.values = function values(aObject) {
-	  return Object.keys(aObject).map(k => aObject[k]);
-	}
-	
-	/**
-	 * Defines a getter on a specified object that will be created upon first use.
-	 *
-	 * @param aObject
-	 *        The object to define the lazy getter on.
-	 * @param aName
-	 *        The name of the getter to define on aObject.
-	 * @param aLambda
-	 *        A function that returns what the getter should return.  This will
-	 *        only ever be called once.
-	 */
-	exports.defineLazyGetter = function defineLazyGetter(aObject, aName, aLambda) {
-	  Object.defineProperty(aObject, aName, {
-	    get: function () {
-	      delete aObject[aName];
-	      return aObject[aName] = aLambda.apply(aObject);
-	    },
-	    configurable: true,
-	    enumerable: true
-	  });
-	};
-	
-	// DEPRECATED: use DevToolsUtils.assert(condition, message) instead!
-	let haveLoggedDeprecationMessage = false;
-	exports.dbg_assert = function dbg_assert(cond, e) {
-	  if (!haveLoggedDeprecationMessage) {
-	    haveLoggedDeprecationMessage = true;
-	    const deprecationMessage = "DevToolsUtils.dbg_assert is deprecated! Use DevToolsUtils.assert instead!"
-	          + Error().stack;
-	    console.log(deprecationMessage);
-	    if (typeof console === "object" && console && console.warn) {
-	      console.warn(deprecationMessage);
-	    }
-	  }
-	
-	  if (!cond) {
-	    return e;
-	  }
-	};
-	
-	const { AppConstants } = __webpack_require__(41);
-	
-	/**
-	 * No operation. The empty function.
-	 */
-	exports.noop = function () { };
-	
-	function reallyAssert(condition, message) {
-	  if (!condition) {
-	    const err = new Error("Assertion failure: " + message);
-	    exports.reportException("DevToolsUtils.assert", err);
-	    throw err;
-	  }
-	}
-	
-	/**
-	 * DevToolsUtils.assert(condition, message)
-	 *
-	 * @param Boolean condition
-	 * @param String message
-	 *
-	 * Assertions are enabled when any of the following are true:
-	 *   - This is a DEBUG_JS_MODULES build
-	 *   - This is a DEBUG build
-	 *   - DevToolsUtils.testing is set to true
-	 *
-	 * If assertions are enabled, then `condition` is checked and if false-y, the
-	 * assertion failure is logged and then an error is thrown.
-	 *
-	 * If assertions are not enabled, then this function is a no-op.
-	 *
-	 * This is an improvement over `dbg_assert`, which doesn't actually cause any
-	 * fatal behavior, and is therefore much easier to accidentally ignore.
-	 */
-	Object.defineProperty(exports, "assert", {
-	  get: () => (AppConstants.DEBUG || AppConstants.DEBUG_JS_MODULES || this.testing)
-	    ? reallyAssert
-	    : exports.noop,
-	})
-	
-	/**
-	 * Defines a getter on a specified object for a module.  The module will not
-	 * be imported until first use.
-	 *
-	 * @param aObject
-	 *        The object to define the lazy getter on.
-	 * @param aName
-	 *        The name of the getter to define on aObject for the module.
-	 * @param aResource
-	 *        The URL used to obtain the module.
-	 * @param aSymbol
-	 *        The name of the symbol exported by the module.
-	 *        This parameter is optional and defaults to aName.
-	 */
-	exports.defineLazyModuleGetter = function defineLazyModuleGetter(aObject, aName,
-	                                                                 aResource,
-	                                                                 aSymbol)
-	{
-	  this.defineLazyGetter(aObject, aName, function XPCU_moduleLambda() {
-	    var temp = {};
-	    Cu.import(aResource, temp);
-	    return temp[aSymbol || aName];
-	  });
-	};
-	
-	const { NetUtil } = __webpack_require__(42);
-	
-	const { TextDecoder, OS } = __webpack_require__(43);
-	
-	const NetworkHelper = __webpack_require__(44);
-	
-	/**
-	 * Performs a request to load the desired URL and returns a promise.
-	 *
-	 * @param aURL String
-	 *        The URL we will request.
-	 * @param aOptions Object
-	 *        An object with the following optional properties:
-	 *        - loadFromCache: if false, will bypass the cache and
-	 *          always load fresh from the network (default: true)
-	 *        - policy: the nsIContentPolicy type to apply when fetching the URL
-	 *        - window: the window to get the loadGroup from
-	 *        - charset: the charset to use if the channel doesn't provide one
-	 * @returns Promise that resolves with an object with the following members on
-	 *          success:
-	 *           - content: the document at that URL, as a string,
-	 *           - contentType: the content type of the document
-	 *
-	 *          If an error occurs, the promise is rejected with that error.
-	 *
-	 * XXX: It may be better to use nsITraceableChannel to get to the sources
-	 * without relying on caching when we can (not for eval, etc.):
-	 * http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/
-	 */
-	function mainThreadFetch(aURL, aOptions={ loadFromCache: true,
-	                                          policy: Ci.nsIContentPolicy.TYPE_OTHER,
-	                                          window: null,
-	                                          charset: null }) {
-	  // Create a channel.
-	  let url = aURL.split(" -> ").pop();
-	  let channel;
-	  try {
-	    channel = newChannelForURL(url, aOptions);
-	  } catch (ex) {
-	    return promise.reject(ex);
-	  }
-	
-	  // Set the channel options.
-	  channel.loadFlags = aOptions.loadFromCache
-	    ? channel.LOAD_FROM_CACHE
-	    : channel.LOAD_BYPASS_CACHE;
-	
-	  if (aOptions.window) {
-	    // Respect private browsing.
-	    channel.loadGroup = aOptions.window.QueryInterface(Ci.nsIInterfaceRequestor)
-	                          .getInterface(Ci.nsIWebNavigation)
-	                          .QueryInterface(Ci.nsIDocumentLoader)
-	                          .loadGroup;
-	  }
-	
-	  let deferred = promise.defer();
-	  let onResponse = (stream, status, request) => {
-	    if (!components.isSuccessCode(status)) {
-	      deferred.reject(new Error(`Failed to fetch ${url}. Code ${status}.`));
-	      return;
-	    }
-	
-	    try {
-	      // We cannot use NetUtil to do the charset conversion as if charset
-	      // information is not available and our default guess is wrong the method
-	      // might fail and we lose the stream data. This means we can't fall back
-	      // to using the locale default encoding (bug 1181345).
-	
-	      // Read and decode the data according to the locale default encoding.
-	      let available = stream.available();
-	      let source = NetUtil.readInputStreamToString(stream, available);
-	      stream.close();
-	
-	      // If the channel or the caller has correct charset information, the
-	      // content will be decoded correctly. If we have to fall back to UTF-8 and
-	      // the guess is wrong, the conversion fails and convertToUnicode returns
-	      // the input unmodified. Essentially we try to decode the data as UTF-8
-	      // and if that fails, we use the locale specific default encoding. This is
-	      // the best we can do if the source does not provide charset info.
-	      let charset = channel.contentCharset || aOptions.charset || "UTF-8";
-	      let unicodeSource = NetworkHelper.convertToUnicode(source, charset);
-	
-	      deferred.resolve({
-	        content: unicodeSource,
-	        contentType: request.contentType
-	      });
-	    } catch (ex) {
-	      let uri = request.originalURI;
-	      if (ex.name === "NS_BASE_STREAM_CLOSED" && uri instanceof Ci.nsIFileURL) {
-	        // Empty files cause NS_BASE_STREAM_CLOSED exception. Use OS.File to
-	        // differentiate between empty files and other errors (bug 1170864).
-	        // This can be removed when bug 982654 is fixed.
-	
-	        uri.QueryInterface(Ci.nsIFileURL);
-	        let result = OS.File.read(uri.file.path).then(bytes => {
-	          // Convert the bytearray to a String.
-	          let decoder = new TextDecoder();
-	          let content = decoder.decode(bytes);
-	
-	          // We can't detect the contentType without opening a channel
-	          // and that failed already. This is the best we can do here.
-	          return {
-	            content,
-	            contentType: "text/plain"
+	        var i = 0;
+	        for (var name in ownProperties) {
+	          if (indexes.length >= max) {
+	            return indexes;
+	          }
+	
+	          var prop = ownProperties[name];
+	          var value = prop.value !== undefined ? prop.value : prop;
+	
+	          // Type is specified in grip's "class" field and for primitive
+	          // values use typeof.
+	          var type = value.class || typeof value;
+	          type = type.toLowerCase();
+	
+	          if (filter(type, value, name)) {
+	            indexes.push(i);
+	          }
+	          i++;
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	
+	      return indexes;
+	    },
+	
+	    render: function () {
+	      var object = this.props.object;
+	      var props = this.safePropIterator(object, this.props.mode == "long" ? 100 : 3);
+	
+	      var objectLink = this.props.objectLink || span;
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return span({ className: "objectBox objectBox-object" }, this.getTitle(object), objectLink({
+	          className: "objectLeftBrace",
+	          object: object
+	        }, ""));
+	      }
+	
+	      return span({ className: "objectBox objectBox-object" }, this.getTitle(object), objectLink({
+	        className: "objectLeftBrace",
+	        object: object
+	      }, " { "), props, objectLink({
+	        className: "objectRightBrace",
+	        object: object
+	      }, " }"));
+	    }
+	  });
+	
+	  // Registration
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	    return object.preview && object.preview.ownProperties;
+	  }
+	
+	  var Grip = {
+	    rep: GripRep,
+	    supportsObject: supportsObject
+	  };
+	
+	  // Exports from this module
+	  exports.Grip = Grip;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 45 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  // Shortcuts
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a symbol.
+	   */
+	
+	  var SymbolRep = React.createClass({
+	    displayName: "SymbolRep",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    render: function () {
+	      var object = this.props.object;
+	      var name = object.name;
+	
+	
+	      return span({ className: "objectBox objectBox-symbol" }, `Symbol(${ name || "" })`);
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    return type == "symbol";
+	  }
+	
+	  // Exports from this module
+	  exports.SymbolRep = {
+	    rep: SymbolRep,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 46 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var isGrip = _require.isGrip;
+	
+	  var _require2 = __webpack_require__(38);
+	
+	  var StringRep = _require2.StringRep;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  var _createFactories = createFactories(StringRep);
+	
+	  var StringRepFactory = _createFactories.rep;
+	
+	  /**
+	   * Renders DOM attribute
+	   */
+	
+	  var Attribute = React.createClass({
+	    displayName: "Attr",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      return grip.preview.nodeName;
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      var value = grip.preview.value;
+	      var objectLink = this.props.objectLink || span;
+	
+	      return objectLink({ className: "objectLink-Attr" }, span({}, span({ className: "attrTitle" }, this.getTitle(grip)), span({ className: "attrEqual" }, "="), StringRepFactory({ object: value })));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return type == "Attr" && grip.preview;
+	  }
+	
+	  exports.Attribute = {
+	    rep: Attribute,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 47 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Used to render JS built-in Date() object.
+	   */
+	
+	  var DateTime = React.createClass({
+	    displayName: "Date",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, grip.class + " ");
+	      }
+	      return "";
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      return span({ className: "objectBox" }, this.getTitle(grip), span({ className: "Date" }, new Date(grip.preview.timestamp).toISOString()));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return type == "Date" && grip.preview;
+	  }
+	
+	  // Exports from this module
+	  exports.DateTime = {
+	    rep: DateTime,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 48 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var getURLDisplayString = _require.getURLDisplayString;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders DOM document object.
+	   */
+	
+	  var Document = React.createClass({
+	    displayName: "Document",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getLocation: function (grip) {
+	      var location = grip.preview.location;
+	      return location ? getURLDisplayString(location) : "";
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({ className: "objectBox" }, this.props.objectLink({
+	          object: grip
+	        }, grip.class + " "));
+	      }
+	      return "";
+	    },
+	
+	    getTooltip: function (doc) {
+	      return doc.location.href;
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	
+	      return span({ className: "objectBox objectBox-object" }, this.getTitle(grip), span({ className: "objectPropValue" }, this.getLocation(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return object.preview && type == "HTMLDocument";
+	  }
+	
+	  // Exports from this module
+	  exports.Document = {
+	    rep: Document,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 49 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var isGrip = _require.isGrip;
+	
+	  var _createFactories = createFactories(__webpack_require__(44).Grip);
+	
+	  var rep = _createFactories.rep;
+	
+	  /**
+	   * Renders DOM event objects.
+	   */
+	
+	  var Event = React.createClass({
+	    displayName: "event",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    render: function () {
+	      // Use `Object.assign` to keep `this.props` without changes because:
+	      // 1. JSON.stringify/JSON.parse is slow.
+	      // 2. Immutable.js is planned for the future.
+	      var props = Object.assign({}, this.props);
+	      props.object = Object.assign({}, this.props.object);
+	      props.object.preview = Object.assign({}, this.props.object.preview);
+	      props.object.preview.ownProperties = props.object.preview.properties;
+	      delete props.object.preview.properties;
+	      props.object.ownPropertyLength = Object.keys(props.object.preview.ownProperties).length;
+	
+	      switch (props.object.class) {
+	        case "MouseEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return name == "clientX" || name == "clientY" || name == "layerX" || name == "layerY";
+	          };
+	          break;
+	        case "KeyboardEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return name == "key" || name == "charCode" || name == "keyCode";
+	          };
+	          break;
+	        case "MessageEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return name == "isTrusted" || name == "data";
 	          };
-	        });
-	
-	        deferred.resolve(result);
+	          break;
+	      }
+	      return rep(props);
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return grip.preview && grip.preview.kind == "DOMEvent";
+	  }
+	
+	  // Exports from this module
+	  exports.Event = {
+	    rep: Event,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 50 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var cropString = _require.cropString;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * This component represents a template for Function objects.
+	   */
+	
+	  var Func = React.createClass({
+	    displayName: "Func",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, "function ");
+	      }
+	      return "";
+	    },
+	
+	    summarizeFunction: function (grip) {
+	      var name = grip.userDisplayName || grip.displayName || grip.name || "function";
+	      return cropString(name + "()", 100);
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	
+	      return span({ className: "objectBox objectBox-function" }, this.getTitle(grip), this.summarizeFunction(grip));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return type == "function";
+	    }
+	
+	    return type == "Function";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Func = {
+	    rep: Func,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 51 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a grip object with regular expression.
+	   */
+	
+	  var RegExp = React.createClass({
+	    displayName: "regexp",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getSource: function (grip) {
+	      return grip.displayString;
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      var objectLink = this.props.objectLink || span;
+	
+	      return span({ className: "objectBox objectBox-regexp" }, objectLink({
+	        object: grip,
+	        className: "regexpSource"
+	      }, this.getSource(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return type == "RegExp";
+	  }
+	
+	  // Exports from this module
+	  exports.RegExp = {
+	    rep: RegExp,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 52 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var getURLDisplayString = _require.getURLDisplayString;
+	
+	  // Shortcuts
+	
+	  var DOM = React.DOM;
+	
+	  /**
+	   * Renders a grip representing CSSStyleSheet
+	   */
+	  var StyleSheet = React.createClass({
+	    displayName: "object",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      var title = "StyleSheet ";
+	      if (this.props.objectLink) {
+	        return DOM.span({ className: "objectBox" }, this.props.objectLink({
+	          object: grip
+	        }, title));
+	      }
+	      return title;
+	    },
+	
+	    getLocation: function (grip) {
+	      // Embedded stylesheets don't have URL and so, no preview.
+	      var url = grip.preview ? grip.preview.url : "";
+	      return url ? getURLDisplayString(url) : "";
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	
+	      return DOM.span({ className: "objectBox objectBox-object" }, this.getTitle(grip), DOM.span({ className: "objectPropValue" }, this.getLocation(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return type == "CSSStyleSheet";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.StyleSheet = {
+	    rep: StyleSheet,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 53 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var cropMultipleLines = _require.cropMultipleLines;
+	
+	  // Shortcuts
+	
+	  var DOM = React.DOM;
+	
+	  /**
+	   * Renders DOM #text node.
+	   */
+	  var TextNode = React.createClass({
+	    displayName: "TextNode",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string
+	    },
+	
+	    getTextContent: function (grip) {
+	      return cropMultipleLines(grip.preview.textContent);
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, "#text");
+	      }
+	      return "";
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      var mode = this.props.mode || "short";
+	
+	      if (mode == "short" || mode == "tiny") {
+	        return DOM.span({ className: "objectBox objectBox-textNode" }, this.getTitle(grip), "\"" + this.getTextContent(grip) + "\"");
+	      }
+	
+	      var objectLink = this.props.objectLink || DOM.span;
+	      return DOM.span({ className: "objectBox objectBox-textNode" }, this.getTitle(grip), objectLink({
+	        object: grip
+	      }, "<"), DOM.span({ className: "nodeTag" }, "TextNode"), " textContent=\"", DOM.span({ className: "nodeValue" }, this.getTextContent(grip)), "\"", objectLink({
+	        object: grip
+	      }, ">;"));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return grip.preview && grip.class == "Text";
+	  }
+	
+	  // Exports from this module
+	  exports.TextNode = {
+	    rep: TextNode,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 54 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var getURLDisplayString = _require.getURLDisplayString;
+	
+	  // Shortcuts
+	
+	  var DOM = React.DOM;
+	
+	  /**
+	   * Renders a grip representing a window.
+	   */
+	  var Window = React.createClass({
+	    displayName: "Window",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return DOM.span({ className: "objectBox" }, this.props.objectLink({
+	          object: grip
+	        }, grip.class + " "));
+	      }
+	      return "";
+	    },
+	
+	    getLocation: function (grip) {
+	      return getURLDisplayString(grip.preview.url);
+	    },
+	
+	    getDisplayValue: function (grip) {
+	      if (this.props.mode === "tiny") {
+	        return grip.isGlobal ? "Global" : "Window";
 	      } else {
-	        deferred.reject(ex);
-	      }
-	    }
-	  };
-	
-	  // Open the channel
-	  try {
-	    NetUtil.asyncFetch(channel, onResponse);
-	  } catch (ex) {
-	    return promise.reject(ex);
-	  }
-	
-	  return deferred.promise;
-	}
-	
-	/**
-	 * Opens a channel for given URL. Tries a bit harder than NetUtil.newChannel.
-	 *
-	 * @param {String} url - The URL to open a channel for.
-	 * @param {Object} options - The options object passed to @method fetch.
-	 * @return {nsIChannel} - The newly created channel. Throws on failure.
-	 */
-	function newChannelForURL(url, { policy }) {
-	  let channelOptions = {
-	    contentPolicyType: policy,
-	    loadUsingSystemPrincipal: true,
-	    uri: url
-	  };
-	
-	  try {
-	    return NetUtil.newChannel(channelOptions);
-	  } catch (e) {
-	    // In the xpcshell tests, the script url is the absolute path of the test
-	    // file, which will make a malformed URI error be thrown. Add the file
-	    // scheme to see if it helps.
-	    channelOptions.uri = "file://" + url;
-	
-	    return NetUtil.newChannel(channelOptions);
-	  }
-	}
-	
-	// Fetch is defined differently depending on whether we are on the main thread
-	// or a worker thread.
-	if (typeof WorkerGlobalScope === 'undefined') { // i.e. not in a worker
-	  exports.fetch = mainThreadFetch;
-	} else {
-	  // Services is not available in worker threads, nor is there any other way
-	  // to fetch a URL. We need to enlist the help from the main thread here, by
-	  // issuing an rpc request, to fetch the URL on our behalf.
-	  exports.fetch = function (url, options) {
-	    return rpc("fetch", url, options);
-	  }
-	}
-	
-	/**
-	 * Returns a promise that is resolved or rejected when all promises have settled
-	 * (resolved or rejected).
-	 *
-	 * This differs from Promise.all, which will reject immediately after the first
-	 * rejection, instead of waiting for the remaining promises to settle.
-	 *
-	 * @param values
-	 *        Iterable of promises that may be pending, resolved, or rejected. When
-	 *        when all promises have settled (resolved or rejected), the returned
-	 *        promise will be resolved or rejected as well.
-	 *
-	 * @return A new promise that is fulfilled when all values have settled
-	 *         (resolved or rejected). Its resolution value will be an array of all
-	 *         resolved values in the given order, or undefined if values is an
-	 *         empty array. The reject reason will be forwarded from the first
-	 *         promise in the list of given promises to be rejected.
-	 */
-	exports.settleAll = values => {
-	  if (values === null || typeof(values[Symbol.iterator]) != "function") {
-	    throw new Error("settleAll() expects an iterable.");
-	  }
-	
-	  let deferred = promise.defer();
-	
-	  values = Array.isArray(values) ? values : [...values];
-	  let countdown = values.length;
-	  let resolutionValues = new Array(countdown);
-	  let rejectionValue;
-	  let rejectionOccurred = false;
-	
-	  if (!countdown) {
-	    deferred.resolve(resolutionValues);
+	        return this.getLocation(grip);
+	      }
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	
+	      return DOM.span({ className: "objectBox objectBox-Window" }, this.getTitle(grip), DOM.span({ className: "objectPropValue" }, this.getDisplayValue(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return object.preview && type == "Window";
+	  }
+	
+	  // Exports from this module
+	  exports.Window = {
+	    rep: Window,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 55 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a grip object with textual data.
+	   */
+	
+	  var ObjectWithText = React.createClass({
+	    displayName: "ObjectWithText",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({ className: "objectBox" }, this.props.objectLink({
+	          object: grip
+	        }, this.getType(grip) + " "));
+	      }
+	      return "";
+	    },
+	
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+	
+	    getDescription: function (grip) {
+	      return "\"" + grip.preview.text + "\"";
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      return span({ className: "objectBox objectBox-" + this.getType(grip) }, this.getTitle(grip), span({ className: "objectPropValue" }, this.getDescription(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return grip.preview && grip.preview.kind == "ObjectWithText";
+	  }
+	
+	  // Exports from this module
+	  exports.ObjectWithText = {
+	    rep: ObjectWithText,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 56 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  var React = __webpack_require__(2);
+	
+	  // Reps
+	
+	  var _require = __webpack_require__(35);
+	
+	  var isGrip = _require.isGrip;
+	  var getURLDisplayString = _require.getURLDisplayString;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders a grip object with URL data.
+	   */
+	
+	  var ObjectWithURL = React.createClass({
+	    displayName: "ObjectWithURL",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({ className: "objectBox" }, this.props.objectLink({
+	          object: grip
+	        }, this.getType(grip) + " "));
+	      }
+	      return "";
+	    },
+	
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+	
+	    getDescription: function (grip) {
+	      return getURLDisplayString(grip.preview.url);
+	    },
+	
+	    render: function () {
+	      var grip = this.props.object;
+	      return span({ className: "objectBox objectBox-" + this.getType(grip) }, this.getTitle(grip), span({ className: "objectPropValue" }, this.getDescription(grip)));
+	    }
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return grip.preview && grip.preview.kind == "ObjectWithURL";
+	  }
+	
+	  // Exports from this module
+	  exports.ObjectWithURL = {
+	    rep: ObjectWithURL,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 57 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var isGrip = _require.isGrip;
+	
+	  var _createFactories = createFactories(__webpack_require__(41));
+	
+	  var Caption = _createFactories.Caption;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	
+	  /**
+	   * Renders an array. The array is enclosed by left and right bracket
+	   * and the max number of rendered items depends on the current mode.
+	   */
+	
+	  var GripArray = React.createClass({
+	    displayName: "GripArray",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	      provider: React.PropTypes.object
+	    },
+	
+	    getLength: function (grip) {
+	      return grip.preview ? grip.preview.length : 0;
+	    },
+	
+	    getTitle: function (object, context) {
+	      var objectLink = this.props.objectLink || span;
+	      if (this.props.mode != "tiny") {
+	        return objectLink({
+	          object: object
+	        }, object.class + " ");
+	      }
+	      return "";
+	    },
+	
+	    arrayIterator: function (grip, max) {
+	      var items = [];
+	
+	      if (!grip.preview || !grip.preview.length) {
+	        return items;
+	      }
+	
+	      var array = grip.preview.items;
+	      if (!array) {
+	        return items;
+	      }
+	
+	      var delim = void 0;
+	      // number of grip.preview.items is limited to 10, but we may have more
+	      // items in grip-array
+	      var delimMax = grip.preview.length > array.length ? array.length : array.length - 1;
+	      var provider = this.props.provider;
+	
+	      for (var i = 0; i < array.length && i < max; i++) {
+	        try {
+	          var itemGrip = array[i];
+	          var value = provider ? provider.getValue(itemGrip) : itemGrip;
+	
+	          delim = i == delimMax ? "" : ", ";
+	
+	          items.push(GripArrayItem(Object.assign({}, this.props, {
+	            key: i,
+	            object: value,
+	            delim: delim })));
+	        } catch (exc) {
+	          items.push(GripArrayItem(Object.assign({}, this.props, {
+	            object: exc,
+	            delim: delim,
+	            key: i })));
+	        }
+	      }
+	      if (array.length > max || grip.preview.length > array.length) {
+	        var objectLink = this.props.objectLink || span;
+	        var leftItemNum = grip.preview.length - max > 0 ? grip.preview.length - max : grip.preview.length - array.length;
+	        items.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: this.props.object
+	          }, leftItemNum + " more…")
+	        }));
+	      }
+	
+	      return items;
+	    },
+	
+	    render: function () {
+	      var mode = this.props.mode || "short";
+	      var object = this.props.object;
+	
+	      var items = void 0;
+	      var brackets = void 0;
+	      var needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]" } : { left: "[", right: "]" };
+	      };
+	
+	      if (mode == "tiny") {
+	        var objectLength = this.getLength(object);
+	        var isEmpty = objectLength === 0;
+	        items = span({ className: "length" }, isEmpty ? "" : objectLength);
+	        brackets = needSpace(false);
+	      } else {
+	        var max = mode == "short" ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+	
+	      var objectLink = this.props.objectLink || span;
+	      var title = this.getTitle(object);
+	
+	      return span({
+	        className: "objectBox objectBox-array" }, title, objectLink({
+	        className: "arrayLeftBracket",
+	        object: object
+	      }, brackets.left), items, objectLink({
+	        className: "arrayRightBracket",
+	        object: object
+	      }, brackets.right), span({
+	        className: "arrayProperties",
+	        role: "group" }));
+	    }
+	  });
+	
+	  /**
+	   * Renders array item. Individual values are separated by
+	   * a delimiter (a comma by default).
+	   */
+	  var GripArrayItem = React.createFactory(React.createClass({
+	    displayName: "GripArrayItem",
+	
+	    propTypes: {
+	      delim: React.PropTypes.string
+	    },
+	
+	    render: function () {
+	      var _createFactories2 = createFactories(__webpack_require__(34));
+	
+	      var Rep = _createFactories2.Rep;
+	
+	
+	      return span({}, Rep(Object.assign({}, this.props, {
+	        mode: "tiny"
+	      })), this.props.delim);
+	    }
+	  }));
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return grip.preview && grip.preview.kind == "ArrayLike";
+	  }
+	
+	  // Exports from this module
+	  exports.GripArray = {
+	    rep: GripArray,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 58 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	"use strict";
+	// Make this available to both AMD and CJS environments
+	
+	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+	
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  var React = __webpack_require__(2);
+	
+	  var _require = __webpack_require__(35);
+	
+	  var createFactories = _require.createFactories;
+	  var isGrip = _require.isGrip;
+	
+	  var _createFactories = createFactories(__webpack_require__(41));
+	
+	  var Caption = _createFactories.Caption;
+	
+	  var _createFactories2 = createFactories(__webpack_require__(43));
+	
+	  var PropRep = _createFactories2.PropRep;
+	
+	  // Shortcuts
+	
+	  var span = React.DOM.span;
+	  /**
+	   * Renders an map. A map is represented by a list of its
+	   * entries enclosed in curly brackets.
+	   */
+	
+	  var GripMap = React.createClass({
+	    displayName: "GripMap",
+	
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string
+	    },
+	
+	    getTitle: function (object) {
+	      var title = object && object.class ? object.class : "Map";
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, title);
+	      }
+	      return title;
+	    },
+	
+	    safeEntriesIterator: function (object, max) {
+	      max = typeof max === "undefined" ? 3 : max;
+	      try {
+	        return this.entriesIterator(object, max);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    entriesIterator: function (object, max) {
+	      // Entry filter. Show only interesting entries to the user.
+	      var isInterestingEntry = this.props.isInterestingEntry || ((type, value) => {
+	        return type == "boolean" || type == "number" || type == "string" && value.length != 0;
+	      });
+	
+	      var mapEntries = object.preview && object.preview.entries ? object.preview.entries : [];
+	
+	      var indexes = this.getEntriesIndexes(mapEntries, max, isInterestingEntry);
+	      if (indexes.length < max && indexes.length < mapEntries.length) {
+	        // There are not enough entries yet, so we add uninteresting entries.
+	        indexes = indexes.concat(this.getEntriesIndexes(mapEntries, max - indexes.length, (t, value, name) => {
+	          return !isInterestingEntry(t, value, name);
+	        }));
+	      }
+	
+	      var entries = this.getEntries(mapEntries, indexes);
+	      if (entries.length < mapEntries.length) {
+	        // There are some undisplayed entries. Then display "more…".
+	        var objectLink = this.props.objectLink || span;
+	
+	        entries.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, `${ mapEntries.length - max } more…`)
+	        }));
+	      }
+	
+	      return entries;
+	    },
+	
+	    /**
+	     * Get entries ordered by index.
+	     *
+	     * @param {Array} entries Entries array.
+	     * @param {Array} indexes Indexes of entries.
+	     * @return {Array} Array of PropRep.
+	     */
+	    getEntries: function (entries, indexes) {
+	      // Make indexes ordered by ascending.
+	      indexes.sort(function (a, b) {
+	        return a - b;
+	      });
+	
+	      return indexes.map((index, i) => {
+	        var _entries$index = _slicedToArray(entries[index], 2);
+	
+	        var key = _entries$index[0];
+	        var entryValue = _entries$index[1];
+	
+	        var value = entryValue.value !== undefined ? entryValue.value : entryValue;
+	
+	        return PropRep({
+	          // key,
+	          name: key,
+	          equal: ": ",
+	          object: value,
+	          // Do not add a trailing comma on the last entry
+	          // if there won't be a "more..." item.
+	          delim: i < indexes.length - 1 || indexes.length < entries.length ? ", " : "",
+	          mode: "tiny",
+	          objectLink: this.props.objectLink
+	        });
+	      });
+	    },
+	
+	    /**
+	     * Get the indexes of entries in the map.
+	     *
+	     * @param {Array} entries Entries array.
+	     * @param {Number} max The maximum length of indexes array.
+	     * @param {Function} filter Filter the entry you want.
+	     * @return {Array} Indexes of filtered entries in the map.
+	     */
+	    getEntriesIndexes: function (entries, max, filter) {
+	      return entries.reduce((indexes, _ref, i) => {
+	        var _ref2 = _slicedToArray(_ref, 2);
+	
+	        var key = _ref2[0];
+	        var entry = _ref2[1];
+	
+	        if (indexes.length < max) {
+	          var value = entry && entry.value !== undefined ? entry.value : entry;
+	          // Type is specified in grip's "class" field and for primitive
+	          // values use typeof.
+	          var type = (value && value.class ? value.class : typeof value).toLowerCase();
+	
+	          if (filter(type, value, key)) {
+	            indexes.push(i);
+	          }
+	        }
+	
+	        return indexes;
+	      }, []);
+	    },
+	
+	    render: function () {
+	      var object = this.props.object;
+	      var props = this.safeEntriesIterator(object, this.props.mode == "long" ? 100 : 3);
+	
+	      var objectLink = this.props.objectLink || span;
+	      if (this.props.mode == "tiny") {
+	        return span({ className: "objectBox objectBox-object" }, this.getTitle(object), objectLink({
+	          className: "objectLeftBrace",
+	          object: object
+	        }, ""));
+	      }
+	
+	      return span({ className: "objectBox objectBox-object" }, this.getTitle(object), objectLink({
+	        className: "objectLeftBrace",
+	        object: object
+	      }, " { "), props, objectLink({
+	        className: "objectRightBrace",
+	        object: object
+	      }, " }"));
+	    }
+	  });
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	    return grip.preview && grip.preview.kind == "MapLike";
+	  }
+	
+	  // Exports from this module
+	  exports.GripMap = {
+	    rep: GripMap,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+/***/ },
+/* 59 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Copyright (c) 2007-2016, Alexandru Marasteanu <hello [at) alexei (dot] ro>
+	 * All rights reserved.
+	 *
+	 * Redistribution and use in source and binary forms, with or without
+	 * modification, are permitted provided that the following conditions are met:
+	 * * Redistributions of source code must retain the above copyright
+	 *   notice, this list of conditions and the following disclaimer.
+	 * * Redistributions in binary form must reproduce the above copyright
+	 *   notice, this list of conditions and the following disclaimer in the
+	 *   documentation and/or other materials provided with the distribution.
+	 * * Neither the name of this software nor the names of its contributors may be
+	 *   used to endorse or promote products derived from this software without
+	 *   specific prior written permission.
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+	 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+	 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+	 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+	 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+	 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+	 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+	 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 */
+	
+	/* globals window, exports, define */
+	
+	(function (window) {
+	    'use strict';
+	
+	    var re = {
+	        not_string: /[^s]/,
+	        not_bool: /[^t]/,
+	        not_type: /[^T]/,
+	        not_primitive: /[^v]/,
+	        number: /[diefg]/,
+	        numeric_arg: /bcdiefguxX/,
+	        json: /[j]/,
+	        not_json: /[^j]/,
+	        text: /^[^\x25]+/,
+	        modulo: /^\x25{2}/,
+	        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosStTuvxX])/,
+	        key: /^([a-z_][a-z_\d]*)/i,
+	        key_access: /^\.([a-z_][a-z_\d]*)/i,
+	        index_access: /^\[(\d+)\]/,
+	        sign: /^[\+\-]/
+	    };
+	
+	    function sprintf() {
+	        var key = arguments[0],
+	            cache = sprintf.cache;
+	        if (!(cache[key] && cache.hasOwnProperty(key))) {
+	            cache[key] = sprintf.parse(key);
+	        }
+	        return sprintf.format.call(null, cache[key], arguments);
+	    }
+	
+	    sprintf.format = function (parse_tree, argv) {
+	        var cursor = 1,
+	            tree_length = parse_tree.length,
+	            node_type = '',
+	            arg,
+	            output = [],
+	            i,
+	            k,
+	            match,
+	            pad,
+	            pad_character,
+	            pad_length,
+	            is_positive = true,
+	            sign = '';
+	        for (i = 0; i < tree_length; i++) {
+	            node_type = get_type(parse_tree[i]);
+	            if (node_type === 'string') {
+	                output[output.length] = parse_tree[i];
+	            } else if (node_type === 'array') {
+	                match = parse_tree[i]; // convenience purposes only
+	                if (match[2]) {
+	                    // keyword argument
+	                    arg = argv[cursor];
+	                    for (k = 0; k < match[2].length; k++) {
+	                        if (!arg.hasOwnProperty(match[2][k])) {
+	                            throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
+	                        }
+	                        arg = arg[match[2][k]];
+	                    }
+	                } else if (match[1]) {
+	                    // positional argument (explicit)
+	                    arg = argv[match[1]];
+	                } else {
+	                    // positional argument (implicit)
+	                    arg = argv[cursor++];
+	                }
+	
+	                if (re.not_type.test(match[8]) && re.not_primitive.test(match[8]) && get_type(arg) == 'function') {
+	                    arg = arg();
+	                }
+	
+	                if (re.numeric_arg.test(match[8]) && get_type(arg) != 'number' && isNaN(arg)) {
+	                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)));
+	                }
+	
+	                if (re.number.test(match[8])) {
+	                    is_positive = arg >= 0;
+	                }
+	
+	                switch (match[8]) {
+	                    case 'b':
+	                        arg = parseInt(arg, 10).toString(2);
+	                        break;
+	                    case 'c':
+	                        arg = String.fromCharCode(parseInt(arg, 10));
+	                        break;
+	                    case 'd':
+	                    case 'i':
+	                        arg = parseInt(arg, 10);
+	                        break;
+	                    case 'j':
+	                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0);
+	                        break;
+	                    case 'e':
+	                        arg = match[7] ? parseFloat(arg).toExponential(match[7]) : parseFloat(arg).toExponential();
+	                        break;
+	                    case 'f':
+	                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg);
+	                        break;
+	                    case 'g':
+	                        arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg);
+	                        break;
+	                    case 'o':
+	                        arg = arg.toString(8);
+	                        break;
+	                    case 's':
+	                    case 'S':
+	                        arg = String(arg);
+	                        arg = match[7] ? arg.substring(0, match[7]) : arg;
+	                        break;
+	                    case 't':
+	                        arg = String(!!arg);
+	                        arg = match[7] ? arg.substring(0, match[7]) : arg;
+	                        break;
+	                    case 'T':
+	                        arg = get_type(arg);
+	                        arg = match[7] ? arg.substring(0, match[7]) : arg;
+	                        break;
+	                    case 'u':
+	                        arg = parseInt(arg, 10) >>> 0;
+	                        break;
+	                    case 'v':
+	                        arg = arg.valueOf();
+	                        arg = match[7] ? arg.substring(0, match[7]) : arg;
+	                        break;
+	                    case 'x':
+	                        arg = parseInt(arg, 10).toString(16);
+	                        break;
+	                    case 'X':
+	                        arg = parseInt(arg, 10).toString(16).toUpperCase();
+	                        break;
+	                }
+	                if (re.json.test(match[8])) {
+	                    output[output.length] = arg;
+	                } else {
+	                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
+	                        sign = is_positive ? '+' : '-';
+	                        arg = arg.toString().replace(re.sign, '');
+	                    } else {
+	                        sign = '';
+	                    }
+	                    pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ';
+	                    pad_length = match[6] - (sign + arg).length;
+	                    pad = match[6] ? pad_length > 0 ? str_repeat(pad_character, pad_length) : '' : '';
+	                    output[output.length] = match[5] ? sign + arg + pad : pad_character === '0' ? sign + pad + arg : pad + sign + arg;
+	                }
+	            }
+	        }
+	        return output.join('');
+	    };
+	
+	    sprintf.cache = {};
+	
+	    sprintf.parse = function (fmt) {
+	        var _fmt = fmt,
+	            match = [],
+	            parse_tree = [],
+	            arg_names = 0;
+	        while (_fmt) {
+	            if ((match = re.text.exec(_fmt)) !== null) {
+	                parse_tree[parse_tree.length] = match[0];
+	            } else if ((match = re.modulo.exec(_fmt)) !== null) {
+	                parse_tree[parse_tree.length] = '%';
+	            } else if ((match = re.placeholder.exec(_fmt)) !== null) {
+	                if (match[2]) {
+	                    arg_names |= 1;
+	                    var field_list = [],
+	                        replacement_field = match[2],
+	                        field_match = [];
+	                    if ((field_match = re.key.exec(replacement_field)) !== null) {
+	                        field_list[field_list.length] = field_match[1];
+	                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+	                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+	                                field_list[field_list.length] = field_match[1];
+	                            } else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+	                                field_list[field_list.length] = field_match[1];
+	                            } else {
+	                                throw new SyntaxError("[sprintf] failed to parse named argument key");
+	                            }
+	                        }
+	                    } else {
+	                        throw new SyntaxError("[sprintf] failed to parse named argument key");
+	                    }
+	                    match[2] = field_list;
+	                } else {
+	                    arg_names |= 2;
+	                }
+	                if (arg_names === 3) {
+	                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");
+	                }
+	                parse_tree[parse_tree.length] = match;
+	            } else {
+	                throw new SyntaxError("[sprintf] unexpected placeholder");
+	            }
+	            _fmt = _fmt.substring(match[0].length);
+	        }
+	        return parse_tree;
+	    };
+	
+	    var vsprintf = function (fmt, argv, _argv) {
+	        _argv = (argv || []).slice(0);
+	        _argv.splice(0, 0, fmt);
+	        return sprintf.apply(null, _argv);
+	    };
+	
+	    /**
+	     * helpers
+	     */
+	    function get_type(variable) {
+	        if (typeof variable === 'number') {
+	            return 'number';
+	        } else if (typeof variable === 'string') {
+	            return 'string';
+	        } else {
+	            return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
+	        }
+	    }
+	
+	    var preformattedPadding = {
+	        '0': ['', '0', '00', '000', '0000', '00000', '000000', '0000000'],
+	        ' ': ['', ' ', '  ', '   ', '    ', '     ', '      ', '       '],
+	        '_': ['', '_', '__', '___', '____', '_____', '______', '_______']
+	    };
+	    function str_repeat(input, multiplier) {
+	        if (multiplier >= 0 && multiplier <= 7 && preformattedPadding[input]) {
+	            return preformattedPadding[input][multiplier];
+	        }
+	        return Array(multiplier + 1).join(input);
+	    }
+	
+	    /**
+	     * export to either browser or node.js
+	     */
+	    if (true) {
+	        exports.sprintf = sprintf;
+	        exports.vsprintf = vsprintf;
+	    } else {
+	        window.sprintf = sprintf;
+	        window.vsprintf = vsprintf;
+	
+	        if (typeof define === 'function' && define.amd) {
+	            define(function () {
+	                return {
+	                    sprintf: sprintf,
+	                    vsprintf: vsprintf
+	                };
+	            });
+	        }
+	    }
+	})(typeof window === 'undefined' ? this : window);
+
+/***/ },
+/* 60 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+	
+	/**
+	 * EventEmitter.
+	 */
+	
+	var EventEmitter = function EventEmitter() {};
+	module.exports = EventEmitter;
+	
+	var _require = __webpack_require__(61);
+	
+	var Cu = _require.Cu;
+	
+	var promise = __webpack_require__(66);
+	
+	/**
+	 * Decorate an object with event emitter functionality.
+	 *
+	 * @param Object aObjectToDecorate
+	 *        Bind all public methods of EventEmitter to
+	 *        the aObjectToDecorate object.
+	 */
+	EventEmitter.decorate = function EventEmitter_decorate(aObjectToDecorate) {
+	  var emitter = new EventEmitter();
+	  aObjectToDecorate.on = emitter.on.bind(emitter);
+	  aObjectToDecorate.off = emitter.off.bind(emitter);
+	  aObjectToDecorate.once = emitter.once.bind(emitter);
+	  aObjectToDecorate.emit = emitter.emit.bind(emitter);
+	};
+	
+	EventEmitter.prototype = {
+	  /**
+	   * Connect a listener.
+	   *
+	   * @param string aEvent
+	   *        The event name to which we're connecting.
+	   * @param function aListener
+	   *        Called when the event is fired.
+	   */
+	  on: function EventEmitter_on(aEvent, aListener) {
+	    if (!this._eventEmitterListeners) this._eventEmitterListeners = new Map();
+	    if (!this._eventEmitterListeners.has(aEvent)) {
+	      this._eventEmitterListeners.set(aEvent, []);
+	    }
+	    this._eventEmitterListeners.get(aEvent).push(aListener);
+	  },
+	
+	  /**
+	   * Listen for the next time an event is fired.
+	   *
+	   * @param string aEvent
+	   *        The event name to which we're connecting.
+	   * @param function aListener
+	   *        (Optional) Called when the event is fired. Will be called at most
+	   *        one time.
+	   * @return promise
+	   *        A promise which is resolved when the event next happens. The
+	   *        resolution value of the promise is the first event argument. If
+	   *        you need access to second or subsequent event arguments (it's rare
+	   *        that this is needed) then use aListener
+	   */
+	  once: function EventEmitter_once(aEvent, aListener) {
+	    var _this = this;
+	
+	    var deferred = promise.defer();
+	
+	    var handler = function (aEvent, aFirstArg) {
+	      for (var _len = arguments.length, aRest = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
+	        aRest[_key - 2] = arguments[_key];
+	      }
+	
+	      _this.off(aEvent, handler);
+	      if (aListener) {
+	        aListener.apply(null, [aEvent, aFirstArg].concat(aRest));
+	      }
+	      deferred.resolve(aFirstArg);
+	    };
+	
+	    handler._originalListener = aListener;
+	    this.on(aEvent, handler);
+	
 	    return deferred.promise;
-	  }
-	
-	  function checkForCompletion() {
-	    if (--countdown > 0) {
-	      return;
-	    }
-	    if (!rejectionOccurred) {
-	      deferred.resolve(resolutionValues);
-	    } else {
-	      deferred.reject(rejectionValue);
-	    }
-	  }
-	
-	  for (let i = 0; i < values.length; i++) {
-	    let index = i;
-	    let value = values[i];
-	    let resolver = result => {
-	      resolutionValues[index] = result;
-	      checkForCompletion();
-	    };
-	    let rejecter = error => {
-	      if (!rejectionOccurred) {
-	        rejectionValue = error;
-	        rejectionOccurred = true;
-	      }
-	      checkForCompletion();
-	    };
-	
-	    if (value && typeof(value.then) == "function") {
-	      value.then(resolver, rejecter);
-	    } else {
-	      // Given value is not a promise, forward it as a resolution value.
-	      resolver(value);
-	    }
-	  }
-	
-	  return deferred.promise;
-	};
-	
-	/**
-	 * When the testing flag is set, various behaviors may be altered from
-	 * production mode, typically to enable easier testing or enhanced debugging.
-	 */
-	var testing = false;
-	Object.defineProperty(exports, "testing", {
-	  get: function() {
-	    return testing;
-	  },
-	  set: function(state) {
-	    testing = state;
-	  }
-	});
-	
-	/**
-	 * Open the file at the given path for reading.
-	 *
-	 * @param {String} filePath
-	 *
-	 * @returns Promise<nsIInputStream>
-	 */
-	exports.openFileStream = function (filePath) {
-	  return new Promise((resolve, reject) => {
-	    const uri = NetUtil.newURI(new FileUtils.File(filePath));
-	    NetUtil.asyncFetch(
-	      { uri, loadUsingSystemPrincipal: true },
-	      (stream, result) => {
-	        if (!components.isSuccessCode(result)) {
-	          reject(new Error(`Could not open "${filePath}": result = ${result}`));
-	          return;
-	        }
-	
-	        resolve(stream);
-	      }
-	    );
-	  });
-	}
-	
-	exports.isGenerator = function (fn) {
-	  if (typeof fn !== "function") {
-	    return false;
-	  }
-	  let proto = Object.getPrototypeOf(fn);
-	  if (!proto) {
-	    return false;
-	  }
-	  let ctor = proto.constructor;
-	  if (!ctor) {
-	    return false;
-	  }
-	  return ctor.name == "GeneratorFunction";
-	};
-	
-	exports.isPromise = function (p) {
-	  return p && typeof p.then === "function";
-	};
-	
-	/**
-	 * Return true if `thing` is a SavedFrame, false otherwise.
-	 */
-	exports.isSavedFrame = function (thing) {
-	  return Object.prototype.toString.call(thing) === "[object SavedFrame]";
-	};
-
-
-/***/ },
-/* 28 */
+	  },
+	
+	  /**
+	   * Remove a previously-registered event listener.  Works for events
+	   * registered with either on or once.
+	   *
+	   * @param string aEvent
+	   *        The event name whose listener we're disconnecting.
+	   * @param function aListener
+	   *        The listener to remove.
+	   */
+	  off: function EventEmitter_off(aEvent, aListener) {
+	    if (!this._eventEmitterListeners) return;
+	    var listeners = this._eventEmitterListeners.get(aEvent);
+	    if (listeners) {
+	      this._eventEmitterListeners.set(aEvent, listeners.filter(l => {
+	        return l !== aListener && l._originalListener !== aListener;
+	      }));
+	    }
+	  },
+	
+	  /**
+	   * Emit an event.  All arguments to this method will
+	   * be sent to listener functions.
+	   */
+	  emit: function EventEmitter_emit(aEvent) {
+	    var _this2 = this,
+	        _arguments = arguments;
+	
+	    if (!this._eventEmitterListeners || !this._eventEmitterListeners.has(aEvent)) {
+	      return;
+	    }
+	
+	    var originalListeners = this._eventEmitterListeners.get(aEvent);
+	
+	    var _loop = function (listener) {
+	      // If the object was destroyed during event emission, stop
+	      // emitting.
+	      if (!_this2._eventEmitterListeners) {
+	        return "break";
+	      }
+	
+	      // If listeners were removed during emission, make sure the
+	      // event handler we're going to fire wasn't removed.
+	      if (originalListeners === _this2._eventEmitterListeners.get(aEvent) || _this2._eventEmitterListeners.get(aEvent).some(l => l === listener)) {
+	        try {
+	          listener.apply(null, _arguments);
+	        } catch (ex) {
+	          // Prevent a bad listener from interfering with the others.
+	          var msg = ex + ": " + ex.stack;
+	          //console.error(msg);
+	          console.log(msg);
+	        }
+	      }
+	    };
+	
+	    for (var listener of this._eventEmitterListeners.get(aEvent)) {
+	      var _ret = _loop(listener);
+	
+	      if (_ret === "break") break;
+	    }
+	  }
+	};
+
+/***/ },
+/* 61 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/*
 	 * A sham for https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/chrome
 	 */
 	
-	var { inDOMUtils } = __webpack_require__(29);
+	var _require = __webpack_require__(62);
+	
+	var inDOMUtils = _require.inDOMUtils;
+	
 	
 	var ourServices = {
 	  inIDOMUtils: inDOMUtils,
 	  nsIClipboardHelper: {
 	    copyString: () => {}
 	  },
 	  nsIXULChromeRegistry: {
-	    isLocaleRTL: () => {return false;}
-	  },
-	  nsIDOMParser: {
-	
-	  },
+	    isLocaleRTL: () => {
+	      return false;
+	    }
+	  },
+	  nsIDOMParser: {}
 	};
 	
 	module.exports = {
 	  Cc: name => {
-	    if(typeof console !== "undefined") {
+	    if (typeof console !== "undefined") {
 	      console.log('Cc sham for', name);
 	    }
 	    return {
-	      getService: (name) => ourServices[name],
-	      createInstance: (iface) => ourServices[iface],
+	      getService: name => ourServices[name],
+	      createInstance: iface => ourServices[iface]
 	    };
 	  },
 	  CC: (name, iface, method) => {
-	    if(typeof console !== "undefined") {
+	    if (typeof console !== "undefined") {
 	      console.log('CC sham for', name, iface, method);
 	    }
-	    return {
-	    };
+	    return {};
 	  },
 	  Ci: {
 	    nsIThread: {
-	      "DISPATCH_NORMAL":0,
-	      "DISPATCH_SYNC":1
+	      "DISPATCH_NORMAL": 0,
+	      "DISPATCH_SYNC": 1
 	    },
 	    nsIDOMNode: typeof HTMLElement !== "undefined" ? HTMLElement : null,
 	    nsIFocusManager: {
 	      MOVEFOCUS_BACKWARD: 2,
-	      MOVEFOCUS_FORWARD: 1,
-	    },
-	    nsIDOMKeyEvent: {
-	
-	    },
-	    nsIDOMCSSRule: {"UNKNOWN_RULE":0,"STYLE_RULE":1,"CHARSET_RULE":2,"IMPORT_RULE":3,"MEDIA_RULE":4,"FONT_FACE_RULE":5,"PAGE_RULE":6,"KEYFRAMES_RULE":7,"KEYFRAME_RULE":8,"MOZ_KEYFRAMES_RULE":7,"MOZ_KEYFRAME_RULE":8,"NAMESPACE_RULE":10,"COUNTER_STYLE_RULE":11,"SUPPORTS_RULE":12,"FONT_FEATURE_VALUES_RULE":14},
+	      MOVEFOCUS_FORWARD: 1
+	    },
+	    nsIDOMKeyEvent: {},
+	    nsIDOMCSSRule: { "UNKNOWN_RULE": 0, "STYLE_RULE": 1, "CHARSET_RULE": 2, "IMPORT_RULE": 3, "MEDIA_RULE": 4, "FONT_FACE_RULE": 5, "PAGE_RULE": 6, "KEYFRAMES_RULE": 7, "KEYFRAME_RULE": 8, "MOZ_KEYFRAMES_RULE": 7, "MOZ_KEYFRAME_RULE": 8, "NAMESPACE_RULE": 10, "COUNTER_STYLE_RULE": 11, "SUPPORTS_RULE": 12, "FONT_FEATURE_VALUES_RULE": 14 },
 	    inIDOMUtils: "inIDOMUtils",
 	    nsIClipboardHelper: "nsIClipboardHelper",
-	    nsIXULChromeRegistry: "nsIXULChromeRegistry",
+	    nsIXULChromeRegistry: "nsIXULChromeRegistry"
 	  },
 	  Cu: {
-	    reportError: msg => { (typeof console !== "undefined") ? console.error(msg) : dump(msg) },
-	    callFunctionWithAsyncStack: fn => fn(),
+	    reportError: msg => {
+	      typeof console !== "undefined" ? console.error(msg) : dump(msg);
+	    },
+	    callFunctionWithAsyncStack: fn => fn()
 	  },
 	  Cr: {},
 	  components: {
-	    isSuccessCode: () => (returnCode & 0x80000000) === 0,
-	  }
-	};
-
-
-/***/ },
-/* 29 */
+	    isSuccessCode: () => (returnCode & 0x80000000) === 0
+	  }
+	};
+
+/***/ },
+/* 62 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// A sham for inDOMUtils.
 	
 	"use strict";
 	
-	var { CSSLexer } = __webpack_require__(30);
-	var { cssColors } = __webpack_require__(31);
-	var { cssProperties } = __webpack_require__(32);
+	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+	
+	var _require = __webpack_require__(63);
+	
+	var CSSLexer = _require.CSSLexer;
+	
+	var _require2 = __webpack_require__(64);
+	
+	var cssColors = _require2.cssColors;
+	
+	var _require3 = __webpack_require__(65);
+	
+	var cssProperties = _require3.cssProperties;
+	
 	
 	var cssRGBMap;
 	
 	// From inIDOMUtils.idl.
-	var EXCLUDE_SHORTHANDS = (1 << 0);
-	var INCLUDE_ALIASES = (1 << 1);
+	var EXCLUDE_SHORTHANDS = 1 << 0;
+	var INCLUDE_ALIASES = 1 << 1;
 	var TYPE_LENGTH = 0;
 	var TYPE_PERCENTAGE = 1;
 	var TYPE_COLOR = 2;
 	var TYPE_URL = 3;
 	var TYPE_ANGLE = 4;
 	var TYPE_FREQUENCY = 5;
 	var TYPE_TIME = 6;
 	var TYPE_GRADIENT = 7;
@@ -2612,21 +5556,21 @@ var Debugger =
 	
 	function getCSSLexer(text) {
 	  return new CSSLexer(text);
 	}
 	
 	function rgbToColorName(r, g, b) {
 	  if (!cssRGBMap) {
 	    cssRGBMap = new Map();
-	    for (let name in cssColors) {
+	    for (var name in cssColors) {
 	      cssRGBMap.set(JSON.stringify(cssColors[name]), name);
 	    }
 	  }
-	  let value = cssRGBMap.get(JSON.stringify([r, g, b]));
+	  var value = cssRGBMap.get(JSON.stringify([r, g, b]));
 	  if (!value) {
 	    throw new Error("no such color");
 	  }
 	  return value;
 	}
 	
 	// Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js
 	function _hslValue(n1, n2, hue) {
@@ -2645,32 +5589,38 @@ var Debugger =
 	  } else {
 	    val = n1;
 	  }
 	  return val;
 	}
 	
 	// Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js
 	// and then modified.
-	function hslToRGB([hue, saturation, lightness]) {
+	function hslToRGB(_ref) {
+	  var _ref2 = _slicedToArray(_ref, 3);
+	
+	  var hue = _ref2[0];
+	  var saturation = _ref2[1];
+	  var lightness = _ref2[2];
+	
 	  var red;
 	  var green;
 	  var blue;
 	  if (saturation === 0) {
 	    red = lightness;
 	    green = lightness;
 	    blue = lightness;
 	  } else {
 	    var m2;
 	    if (lightness <= 0.5) {
 	      m2 = lightness * (1.0 + saturation);
 	    } else {
-	      m2 = lightness + saturation - (lightness * saturation);
-	    }
-	    var m1 = (2.0 * lightness) - m2;
+	      m2 = lightness + saturation - lightness * saturation;
+	    }
+	    var m1 = 2.0 * lightness - m2;
 	    var f = _hslValue;
 	    var h6 = hue * 6.0;
 	    red = f(m1, m2, h6 + 2);
 	    green = f(m1, m2, h6);
 	    blue = f(m1, m2, h6 - 2);
 	  }
 	  return [red, green, blue];
 	}
@@ -2680,89 +5630,87 @@ var Debugger =
 	  if (name in cssColors) {
 	    return cssColors[name];
 	  }
 	
 	  if (name === "transparent") {
 	    return [0, 0, 0, 0];
 	  }
 	
-	  let lexer = getCSSLexer(name);
-	
-	  let getToken = function() {
+	  var lexer = getCSSLexer(name);
+	
+	  var getToken = function () {
 	    while (true) {
-	      let token = lexer.nextToken();
-	      if (!token || token.tokenType !== "comment" ||
-	          token.tokenType !== "whitespace") {
+	      var token = lexer.nextToken();
+	      if (!token || token.tokenType !== "comment" || token.tokenType !== "whitespace") {
 	        return token;
 	      }
 	    }
 	  };
 	
-	  let requireComma = function(token) {
+	  var requireComma = function (token) {
 	    if (token.tokenType !== "symbol" || token.text !== ",") {
 	      return null;
 	    }
 	    return getToken();
 	  };
 	
-	  let func = getToken();
+	  var func = getToken();
 	  if (!func || func.tokenType !== "function") {
 	    return null;
 	  }
-	  let alpha = false;
+	  var alpha = false;
 	  if (func.text === "rgb" || func.text === "hsl") {
 	    // Nothing.
 	  } else if (func.text === "rgba" || func.text === "hsla") {
 	    alpha = true;
 	  } else {
 	    return null;
 	  }
 	
-	  let vals = [];
-	  for (let i = 0; i < 3; ++i) {
-	    let token = getToken();
+	  var vals = [];
+	  for (var i = 0; i < 3; ++i) {
+	    var token = getToken();
 	    if (i > 0) {
 	      token = requireComma(token);
 	    }
 	    if (token.tokenType !== "number" || !token.isInteger) {
 	      return null;
 	    }
-	    let num = token.number;
+	    var num = token.number;
 	    if (num < 0) {
 	      num = 0;
 	    } else if (num > 255) {
 	      num = 255;
 	    }
 	    vals.push(num);
 	  }
 	
 	  if (func.text === "hsl" || func.text === "hsla") {
 	    vals = hslToRGB(vals);
 	  }
 	
 	  if (alpha) {
-	    let token = requireComma(getToken());
-	    if (token.tokenType !== "number") {
+	    var _token = requireComma(getToken());
+	    if (_token.tokenType !== "number") {
 	      return null;
 	    }
-	    let num = token.number;
-	    if (num < 0) {
-	      num = 0;
-	    } else if (num > 1) {
-	      num = 1;
-	    }
-	    vals.push(num);
+	    var _num = _token.number;
+	    if (_num < 0) {
+	      _num = 0;
+	    } else if (_num > 1) {
+	      _num = 1;
+	    }
+	    vals.push(_num);
 	  } else {
 	    vals.push(1);
 	  }
 	
-	  let parenToken = getToken();
-	  if (!parenToken || parenToken.tokenType !== "symbol" ||
-	      parenToken.text !== ")") {
+	  var parenToken = getToken();
+	  if (!parenToken || parenToken.tokenType !== "symbol" || parenToken.text !== ")") {
 	    return null;
 	  }
 	  if (getToken() !== null) {
 	    return null;
 	  }
 	
 	  return vals;
 	}
@@ -2804,34 +5752,34 @@ var Debugger =
 	  }
 	  if (!(name in cssProperties)) {
 	    throw Error("unknown property " + name);
 	  }
 	  return cssProperties[name].values.slice();
 	}
 	
 	function getCSSPropertyNames(flags) {
-	  let names = Object.keys(cssProperties);
+	  var names = Object.keys(cssProperties);
 	  if ((flags & EXCLUDE_SHORTHANDS) !== 0) {
-	    names = names.filter((name) => cssProperties[name].subproperties);
+	    names = names.filter(name => cssProperties[name].subproperties);
 	  }
 	  if ((flags & INCLUDE_ALIASES) === 0) {
-	    names = names.filter((name) => !cssProperties[name].alias);
+	    names = names.filter(name => !cssProperties[name].alias);
 	  }
 	  return names;
 	}
 	
 	function cssPropertySupportsType(name, type) {
 	  if (isVariable(name)) {
 	    return false;
 	  }
 	  if (!(name in cssProperties)) {
 	    throw Error("unknown property " + name);
 	  }
-	  return (cssProperties[name].supports & (1 << type)) !== 0;
+	  return (cssProperties[name].supports & 1 << type) !== 0;
 	}
 	
 	function isInheritedProperty(name) {
 	  if (isVariable(name)) {
 	    return true;
 	  }
 	  if (!(name in cssProperties)) {
 	    return false;
@@ -2841,17 +5789,17 @@ var Debugger =
 	
 	function cssPropertyIsValid(name, value) {
 	  if (isVariable(name)) {
 	    return true;
 	  }
 	  if (!(name in cssProperties)) {
 	    return false;
 	  }
-	  let elt = document.createElement("div");
+	  var elt = document.createElement("div");
 	  elt.style = name + ":" + value;
 	  return elt.style.length > 0;
 	}
 	
 	exports.inDOMUtils = {
 	  getCSSLexer,
 	  rgbToColorName,
 	  colorToRGBA,
@@ -2872,1457 +5820,1499 @@ var Debugger =
 	  TYPE_COLOR,
 	  TYPE_URL,
 	  TYPE_ANGLE,
 	  TYPE_FREQUENCY,
 	  TYPE_TIME,
 	  TYPE_GRADIENT,
 	  TYPE_TIMING_FUNCTION,
 	  TYPE_IMAGE_RECT,
-	  TYPE_NUMBER,
-	};
-
-
-/***/ },
-/* 30 */
+	  TYPE_NUMBER
+	};
+
+/***/ },
+/* 63 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict";
 	
 	(function (root, factory) {
-	    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
-	    // Rhino, and plain browser loading.
-	    if (true) {
-	        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
-	    } else if (typeof exports !== 'undefined') {
-	        factory(exports);
-	    } else {
-	        factory(root);
-	    }
-	}(this, function (exports) {
-	
-	function between(num, first, last) { return num >= first && num <= last; }
-	function digit(code) { return between(code, 0x30,0x39); }
-	function hexdigit(code) { return digit(code) || between(code, 0x41,0x46) || between(code, 0x61,0x66); }
-	function uppercaseletter(code) { return between(code, 0x41,0x5a); }
-	function lowercaseletter(code) { return between(code, 0x61,0x7a); }
-	function letter(code) { return uppercaseletter(code) || lowercaseletter(code); }
-	function nonascii(code) { return code >= 0x80; }
-	function namestartchar(code) { return letter(code) || nonascii(code) || code == 0x5f; }
-	function namechar(code) { return namestartchar(code) || digit(code) || code == 0x2d; }
-	function nonprintable(code) { return between(code, 0,8) || code == 0xb || between(code, 0xe,0x1f) || code == 0x7f; }
-	function newline(code) { return code == 0xa; }
-	function whitespace(code) { return newline(code) || code == 9 || code == 0x20; }
-	
-	var maximumallowedcodepoint = 0x10ffff;
-	
-	var InvalidCharacterError = function(message) {
-		this.message = message;
-	};
-	InvalidCharacterError.prototype = new Error;
-	InvalidCharacterError.prototype.name = 'InvalidCharacterError';
-	
-	function stringFromCode(code) {
-		if(code <= 0xffff) return String.fromCharCode(code);
-		// Otherwise, encode astral char as surrogate pair.
-		code -= Math.pow(2, 20);
-		var lead = Math.floor(code/Math.pow(2, 10)) + 0xd800;
-		var trail = code % Math.pow(2, 10) + 0xdc00;
-		return String.fromCharCode(lead) + String.fromCharCode(trail);
-	}
-	
-	function* tokenize(str, options) {
-		if (options === undefined) {
-			options = {};
-		}
-		if (options.loc === undefined) {
-			options.loc = false;
-		}
-		if (options.offsets === undefined) {
-			options.offsets = false;
-		}
-		if (options.keepComments === undefined) {
-			options.keepComments = false;
-		}
-		if (options.startOffset === undefined) {
-			options.startOffset = 0;
-		}
-	
-		var i = options.startOffset - 1;
-		var code;
-	
-		// Line number information.
-		var line = 0;
-		var column = 0;
-		// The only use of lastLineLength is in reconsume().
-		var lastLineLength = 0;
-		var incrLineno = function() {
-			line += 1;
-			lastLineLength = column;
-			column = 0;
-		};
-		var locStart = {line:line, column:column};
-		var offsetStart = i;
-	
-		var codepoint = function(i) {
-			if(i >= str.length) {
-				return -1;
-			}
-			return str.charCodeAt(i);
-		};
-		var next = function(num) {
-			if(num === undefined)
-				num = 1;
-			if(num > 3)
-				throw "Spec Error: no more than three codepoints of lookahead.";
-	
-			var rcode;
-			for (var offset = i + 1; num-- > 0; ++offset) {
-				rcode = codepoint(offset);
-				if (rcode === 0xd && codepoint(offset+1) === 0xa) {
-					++offset;
-					rcode = 0xa;
-				} else if (rcode === 0xd || rcode === 0xc) {
-					rcode = 0xa;
-				} else if (rcode === 0x0) {
-					rcode = 0xfffd;
-				}
-			}
-	
-			return rcode;
-		};
-		var consume = function(num) {
-			if(num === undefined)
-				num = 1;
-			while(num-- > 0) {
-				++i;
-				code = codepoint(i);
-				if (code === 0xd && codepoint(i+1) === 0xa) {
+		// Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
+		// Rhino, and plain browser loading.
+		if (true) {
+			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+		} else if (typeof exports !== 'undefined') {
+			factory(exports);
+		} else {
+			factory(root);
+		}
+	})(this, function (exports) {
+	
+		function between(num, first, last) {
+			return num >= first && num <= last;
+		}
+		function digit(code) {
+			return between(code, 0x30, 0x39);
+		}
+		function hexdigit(code) {
+			return digit(code) || between(code, 0x41, 0x46) || between(code, 0x61, 0x66);
+		}
+		function uppercaseletter(code) {
+			return between(code, 0x41, 0x5a);
+		}
+		function lowercaseletter(code) {
+			return between(code, 0x61, 0x7a);
+		}
+		function letter(code) {
+			return uppercaseletter(code) || lowercaseletter(code);
+		}
+		function nonascii(code) {
+			return code >= 0x80;
+		}
+		function namestartchar(code) {
+			return letter(code) || nonascii(code) || code == 0x5f;
+		}
+		function namechar(code) {
+			return namestartchar(code) || digit(code) || code == 0x2d;
+		}
+		function nonprintable(code) {
+			return between(code, 0, 8) || code == 0xb || between(code, 0xe, 0x1f) || code == 0x7f;
+		}
+		function newline(code) {
+			return code == 0xa;
+		}
+		function whitespace(code) {
+			return newline(code) || code == 9 || code == 0x20;
+		}
+	
+		var maximumallowedcodepoint = 0x10ffff;
+	
+		var InvalidCharacterError = function (message) {
+			this.message = message;
+		};
+		InvalidCharacterError.prototype = new Error();
+		InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+	
+		function stringFromCode(code) {
+			if (code <= 0xffff) return String.fromCharCode(code);
+			// Otherwise, encode astral char as surrogate pair.
+			code -= Math.pow(2, 20);
+			var lead = Math.floor(code / Math.pow(2, 10)) + 0xd800;
+			var trail = code % Math.pow(2, 10) + 0xdc00;
+			return String.fromCharCode(lead) + String.fromCharCode(trail);
+		}
+	
+		function* tokenize(str, options) {
+			if (options === undefined) {
+				options = {};
+			}
+			if (options.loc === undefined) {
+				options.loc = false;
+			}
+			if (options.offsets === undefined) {
+				options.offsets = false;
+			}
+			if (options.keepComments === undefined) {
+				options.keepComments = false;
+			}
+			if (options.startOffset === undefined) {
+				options.startOffset = 0;
+			}
+	
+			var i = options.startOffset - 1;
+			var code;
+	
+			// Line number information.
+			var line = 0;
+			var column = 0;
+			// The only use of lastLineLength is in reconsume().
+			var lastLineLength = 0;
+			var incrLineno = function () {
+				line += 1;
+				lastLineLength = column;
+				column = 0;
+			};
+			var locStart = { line: line, column: column };
+			var offsetStart = i;
+	
+			var codepoint = function (i) {
+				if (i >= str.length) {
+					return -1;
+				}
+				return str.charCodeAt(i);
+			};
+			var next = function (num) {
+				if (num === undefined) num = 1;
+				if (num > 3) throw "Spec Error: no more than three codepoints of lookahead.";
+	
+				var rcode;
+				for (var offset = i + 1; num-- > 0; ++offset) {
+					rcode = codepoint(offset);
+					if (rcode === 0xd && codepoint(offset + 1) === 0xa) {
+						++offset;
+						rcode = 0xa;
+					} else if (rcode === 0xd || rcode === 0xc) {
+						rcode = 0xa;
+					} else if (rcode === 0x0) {
+						rcode = 0xfffd;
+					}
+				}
+	
+				return rcode;
+			};
+			var consume = function (num) {
+				if (num === undefined) num = 1;
+				while (num-- > 0) {
 					++i;
-					code = 0xa;
-				} else if (code === 0xd || code === 0xc) {
-					code = 0xa;
-				} else if (code === 0x0) {
-					code = 0xfffd;
-				}
-				if(newline(code)) incrLineno();
-				else column++;
-			}
-			return true;
-		};
-		var reconsume = function() {
-			i -= 1;		// This is ok even in the \r\n case.
-			if (newline(code)) {
-				line -= 1;
-				column = lastLineLength;
-			} else {
-				column -= 1;
-			}
-			return true;
-		};
-		var eof = function(codepoint) {
-			if(codepoint === undefined) codepoint = code;
-			return codepoint == -1;
-		};
-		var donothing = function() {};
-		var parseerror = function() { console.log("Parse error at index " + i + ", processing codepoint 0x" + code.toString(16) + ".");return true; };
-	
-		var consumeAToken = function() {
-			consume();
-			if (!options.keepComments) {
-				while(code == 0x2f && next() == 0x2a) {
-					consumeAComment();
-					consume();
-				}
-			}
-			locStart.line = line;
-			locStart.column = column;
-			offsetStart = i;
-			if(whitespace(code)) {
-				while(whitespace(next())) consume();
-				return new WhitespaceToken;
-			}
-			else if(code == 0x2f && next() == 0x2a) return consumeAComment();
-			else if(code == 0x22) return consumeAStringToken();
-			else if(code == 0x23) {
-				if(namechar(next()) || areAValidEscape(next(1), next(2))) {
-					var token = new HashToken();
-					if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
-						token.type = "id";
-						token.tokenType = "id";
+					code = codepoint(i);
+					if (code === 0xd && codepoint(i + 1) === 0xa) {
+						++i;
+						code = 0xa;
+					} else if (code === 0xd || code === 0xc) {
+						code = 0xa;
+					} else if (code === 0x0) {
+						code = 0xfffd;
+					}
+					if (newline(code)) incrLineno();else column++;
+				}
+				return true;
+			};
+			var reconsume = function () {
+				i -= 1; // This is ok even in the \r\n case.
+				if (newline(code)) {
+					line -= 1;
+					column = lastLineLength;
+				} else {
+					column -= 1;
+				}
+				return true;
+			};
+			var eof = function (codepoint) {
+				if (codepoint === undefined) codepoint = code;
+				return codepoint == -1;
+			};
+			var donothing = function () {};
+			var parseerror = function () {
+				console.log("Parse error at index " + i + ", processing codepoint 0x" + code.toString(16) + ".");return true;
+			};
+	
+			var consumeAToken = function () {
+				consume();
+				if (!options.keepComments) {
+					while (code == 0x2f && next() == 0x2a) {
+						consumeAComment();
+						consume();
+					}
+				}
+				locStart.line = line;
+				locStart.column = column;
+				offsetStart = i;
+				if (whitespace(code)) {
+					while (whitespace(next())) {
+						consume();
+					}return new WhitespaceToken();
+				} else if (code == 0x2f && next() == 0x2a) return consumeAComment();else if (code == 0x22) return consumeAStringToken();else if (code == 0x23) {
+					if (namechar(next()) || areAValidEscape(next(1), next(2))) {
+						var token = new HashToken();
+						if (wouldStartAnIdentifier(next(1), next(2), next(3))) {
+							token.type = "id";
+							token.tokenType = "id";
+						}
+						token.value = consumeAName();
+						token.text = token.value;
+						return token;
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x24) {
+					if (next() == 0x3d) {
+						consume();
+						return new SuffixMatchToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x27) return consumeAStringToken();else if (code == 0x28) return new OpenParenToken();else if (code == 0x29) return new CloseParenToken();else if (code == 0x2a) {
+					if (next() == 0x3d) {
+						consume();
+						return new SubstringMatchToken();
+					} else {
+						return new DelimToken(code);
 					}
-					token.value = consumeAName();
-					token.text = token.value;
-					return token;
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x24) {
-				if(next() == 0x3d) {
-					consume();
-					return new SuffixMatchToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x27) return consumeAStringToken();
-			else if(code == 0x28) return new OpenParenToken();
-			else if(code == 0x29) return new CloseParenToken();
-			else if(code == 0x2a) {
-				if(next() == 0x3d) {
-					consume();
-					return new SubstringMatchToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x2b) {
-				if(startsWithANumber()) {
-					reconsume();
-					return consumeANumericToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x2c) return new CommaToken();
-			else if(code == 0x2d) {
-				if(startsWithANumber()) {
+				} else if (code == 0x2b) {
+					if (startsWithANumber()) {
+						reconsume();
+						return consumeANumericToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x2c) return new CommaToken();else if (code == 0x2d) {
+					if (startsWithANumber()) {
+						reconsume();
+						return consumeANumericToken();
+					} else if (next(1) == 0x2d && next(2) == 0x3e) {
+						consume(2);
+						return new CDCToken();
+					} else if (startsWithAnIdentifier()) {
+						reconsume();
+						return consumeAnIdentlikeToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x2e) {
+					if (startsWithANumber()) {
+						reconsume();
+						return consumeANumericToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x3a) return new ColonToken();else if (code == 0x3b) return new SemicolonToken();else if (code == 0x3c) {
+					if (next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {
+						consume(3);
+						return new CDOToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x40) {
+					if (wouldStartAnIdentifier(next(1), next(2), next(3))) {
+						return new AtKeywordToken(consumeAName());
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x5b) return new OpenSquareToken();else if (code == 0x5c) {
+					if (startsWithAValidEscape()) {
+						reconsume();
+						return consumeAnIdentlikeToken();
+					} else {
+						parseerror();
+						return new DelimToken(code);
+					}
+				} else if (code == 0x5d) return new CloseSquareToken();else if (code == 0x5e) {
+					if (next() == 0x3d) {
+						consume();
+						return new PrefixMatchToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x7b) return new OpenCurlyToken();else if (code == 0x7c) {
+					if (next() == 0x3d) {
+						consume();
+						return new DashMatchToken();
+						// } else if(next() == 0x7c) {
+						// 	consume();
+						// 	return new ColumnToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (code == 0x7d) return new CloseCurlyToken();else if (code == 0x7e) {
+					if (next() == 0x3d) {
+						consume();
+						return new IncludeMatchToken();
+					} else {
+						return new DelimToken(code);
+					}
+				} else if (digit(code)) {
 					reconsume();
 					return consumeANumericToken();
-				} else if(next(1) == 0x2d && next(2) == 0x3e) {
-					consume(2);
-					return new CDCToken();
-				} else if(startsWithAnIdentifier()) {
-					reconsume();
-					return consumeAnIdentlikeToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x2e) {
-				if(startsWithANumber()) {
-					reconsume();
-					return consumeANumericToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x3a) return new ColonToken;
-			else if(code == 0x3b) return new SemicolonToken;
-			else if(code == 0x3c) {
-				if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {
-					consume(3);
-					return new CDOToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x40) {
-				if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
-					return new AtKeywordToken(consumeAName());
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x5b) return new OpenSquareToken();
-			else if(code == 0x5c) {
-				if(startsWithAValidEscape()) {
+				} else if (namestartchar(code)) {
 					reconsume();
 					return consumeAnIdentlikeToken();
-				} else {
-					parseerror();
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x5d) return new CloseSquareToken();
-			else if(code == 0x5e) {
-				if(next() == 0x3d) {
-					consume();
-					return new PrefixMatchToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x7b) return new OpenCurlyToken();
-			else if(code == 0x7c) {
-				if(next() == 0x3d) {
-					consume();
-					return new DashMatchToken();
-				// } else if(next() == 0x7c) {
-				// 	consume();
-				// 	return new ColumnToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(code == 0x7d) return new CloseCurlyToken();
-			else if(code == 0x7e) {
-				if(next() == 0x3d) {
-					consume();
-					return new IncludeMatchToken();
-				} else {
-					return new DelimToken(code);
-				}
-			}
-			else if(digit(code)) {
-				reconsume();
-				return consumeANumericToken();
-			}
-			else if(namestartchar(code)) {
-				reconsume();
-				return consumeAnIdentlikeToken();
-			}
-			else if(eof()) return new EOFToken();
-			else return new DelimToken(code);
-		};
-	
-		var consumeAComment = function() {
-			consume();
-			var comment = "";
-			while(true) {
-				consume();
-				if(code == 0x2a && next() == 0x2f) {
-					consume();
-					break;
-				} else if(eof()) {
-					break;
-				}
-				comment += stringFromCode(code);
-			}
-			return new CommentToken(comment);
-		};
-	
-		var consumeANumericToken = function() {
-			var num = consumeANumber();
-			var token;
-			if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
-				token = new DimensionToken();
-				token.value = num.value;
-				token.repr = num.repr;
-				token.type = num.type;
-				token.unit = consumeAName();
-				token.text = token.unit;
-			} else if(next() == 0x25) {
+				} else if (eof()) return new EOFToken();else return new DelimToken(code);
+			};
+	
+			var consumeAComment = function () {
 				consume();
-				token = new PercentageToken();
-				token.value = num.value;
-				token.repr = num.repr;
-			} else {
-				var token = new NumberToken();
-				token.value = num.value;
-				token.repr = num.repr;
-				token.type = num.type;
-			}
-			token.number = token.value;
-			token.isInteger = token.type === "integer";
-			// FIXME hasSign
-			return token;
-		};
-	
-		var consumeAnIdentlikeToken = function() {
-			var str = consumeAName();
-			if(str.toLowerCase() == "url" && next() == 0x28) {
-				consume();
-				while(whitespace(next(1)) && whitespace(next(2)))
-					consume();
-				if((next() == 0x22 || next() == 0x27) ||
-				   (whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27))) {
-					while(whitespace(next()))
-						consume();
-					consume();
-					let str = consumeAStringToken();
-					while(whitespace(next()))
-						consume();
-					// The closing paren.
+				var comment = "";
+				while (true) {
 					consume();
-					return new URLToken(str.text);
-				} else {
-					return consumeAURLToken();
-				}
-			} else if(next() == 0x28) {
-				consume();
-				return new FunctionToken(str);
-			} else {
-				return new IdentToken(str);
-			}
-		};
-	
-		var consumeAStringToken = function(endingCodePoint) {
-			if(endingCodePoint === undefined) endingCodePoint = code;
-			var string = "";
-			while(consume()) {
-				if(code == endingCodePoint || eof()) {
-					return new StringToken(string);
-				} else if(newline(code)) {
-					reconsume();
-					return new BadStringToken(string);
-				} else if(code == 0x5c) {
-					if(eof(next())) {
-						donothing();
-					} else if(newline(next())) {
-						consume();
-					} else {
-						string += stringFromCode(consumeEscape());
-					}
-				} else {
-					string += stringFromCode(code);
-				}
-			}
-		};
-	
-		var consumeAURLToken = function() {
-			var token = new URLToken("");
-			while(whitespace(next())) consume();
-			if(eof(next())) return token;
-			while(consume()) {
-				if(code == 0x29 || eof()) {
-					break;
-				} else if(whitespace(code)) {
-					while(whitespace(next()))
-						consume();
-					if(next() == 0x29 || eof(next())) {
+					if (code == 0x2a && next() == 0x2f) {
 						consume();
 						break;
-					} else {
-						consumeTheRemnantsOfABadURL();
-						return new BadURLToken();
+					} else if (eof()) {
+						break;
 					}
-				} else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {
-					parseerror();
-					consumeTheRemnantsOfABadURL();
-					return new BadURLToken();
-				} else if(code == 0x5c) {
-					if(startsWithAValidEscape()) {
-						token.value += stringFromCode(consumeEscape());
+					comment += stringFromCode(code);
+				}
+				return new CommentToken(comment);
+			};
+	
+			var consumeANumericToken = function () {
+				var num = consumeANumber();
+				var token;
+				if (wouldStartAnIdentifier(next(1), next(2), next(3))) {
+					token = new DimensionToken();
+					token.value = num.value;
+					token.repr = num.repr;
+					token.type = num.type;
+					token.unit = consumeAName();
+					token.text = token.unit;
+				} else if (next() == 0x25) {
+					consume();
+					token = new PercentageToken();
+					token.value = num.value;
+					token.repr = num.repr;
+				} else {
+					var token = new NumberToken();
+					token.value = num.value;
+					token.repr = num.repr;
+					token.type = num.type;
+				}
+				token.number = token.value;
+				token.isInteger = token.type === "integer";
+				// FIXME hasSign
+				return token;
+			};
+	
+			var consumeAnIdentlikeToken = function () {
+				var str = consumeAName();
+				if (str.toLowerCase() == "url" && next() == 0x28) {
+					consume();
+					while (whitespace(next(1)) && whitespace(next(2))) {
+						consume();
+					}if (next() == 0x22 || next() == 0x27 || whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27)) {
+						while (whitespace(next())) {
+							consume();
+						}consume();
+						var _str = consumeAStringToken();
+						while (whitespace(next())) {
+							consume();
+						} // The closing paren.
+						consume();
+						return new URLToken(_str.text);
 					} else {
+						return consumeAURLToken();
+					}
+				} else if (next() == 0x28) {
+					consume();
+					return new FunctionToken(str);
+				} else {
+					return new IdentToken(str);
+				}
+			};
+	
+			var consumeAStringToken = function (endingCodePoint) {
+				if (endingCodePoint === undefined) endingCodePoint = code;
+				var string = "";
+				while (consume()) {
+					if (code == endingCodePoint || eof()) {
+						return new StringToken(string);
+					} else if (newline(code)) {
+						reconsume();
+						return new BadStringToken(string);
+					} else if (code == 0x5c) {
+						if (eof(next())) {
+							donothing();
+						} else if (newline(next())) {
+							consume();
+						} else {
+							string += stringFromCode(consumeEscape());
+						}
+					} else {
+						string += stringFromCode(code);
+					}
+				}
+			};
+	
+			var consumeAURLToken = function () {
+				var token = new URLToken("");
+				while (whitespace(next())) {
+					consume();
+				}if (eof(next())) return token;
+				while (consume()) {
+					if (code == 0x29 || eof()) {
+						break;
+					} else if (whitespace(code)) {
+						while (whitespace(next())) {
+							consume();
+						}if (next() == 0x29 || eof(next())) {
+							consume();
+							break;
+						} else {
+							consumeTheRemnantsOfABadURL();
+							return new BadURLToken();
+						}
+					} else if (code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {
 						parseerror();
 						consumeTheRemnantsOfABadURL();
 						return new BadURLToken();
-					}
-				} else {
-					token.value += stringFromCode(code);
-				}
-			}
-			token.text = token.value;
-			return token;
-		};
-	
-		var consumeEscape = function() {
-			// Assume the the current character is the \
-			// and the next code point is not a newline.
-			consume();
-			if(hexdigit(code)) {
-				// Consume 1-6 hex digits
-				var digits = [code];
-				for(var total = 0; total < 5; total++) {
-					if(hexdigit(next())) {
-						consume();
-						digits.push(code);
+					} else if (code == 0x5c) {
+						if (startsWithAValidEscape()) {
+							token.value += stringFromCode(consumeEscape());
+						} else {
+							parseerror();
+							consumeTheRemnantsOfABadURL();
+							return new BadURLToken();
+						}
 					} else {
-						break;
+						token.value += stringFromCode(code);
 					}
 				}
-				if(whitespace(next())) consume();
-				var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16);
-				if( value > maximumallowedcodepoint ) value = 0xfffd;
-				return value;
-			} else if(eof()) {
-				return 0xfffd;
-			} else {
-				return code;
-			}
-		};
-	
-		var areAValidEscape = function(c1, c2) {
-			if(c1 != 0x5c) return false;
-			if(newline(c2)) return false;
-			return true;
-		};
-		var startsWithAValidEscape = function() {
-			return areAValidEscape(code, next());
-		};
-	
-		var wouldStartAnIdentifier = function(c1, c2, c3) {
-			if(c1 == 0x2d) {
-				return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);
-			} else if(namestartchar(c1)) {
+				token.text = token.value;
+				return token;
+			};
+	
+			var consumeEscape = function () {
+				// Assume the the current character is the \
+				// and the next code point is not a newline.
+				consume();
+				if (hexdigit(code)) {
+					// Consume 1-6 hex digits
+					var digits = [code];
+					for (var total = 0; total < 5; total++) {
+						if (hexdigit(next())) {
+							consume();
+							digits.push(code);
+						} else {
+							break;
+						}
+					}
+					if (whitespace(next())) consume();
+					var value = parseInt(digits.map(function (x) {
+						return String.fromCharCode(x);
+					}).join(''), 16);
+					if (value > maximumallowedcodepoint) value = 0xfffd;
+					return value;
+				} else if (eof()) {
+					return 0xfffd;
+				} else {
+					return code;
+				}
+			};
+	
+			var areAValidEscape = function (c1, c2) {
+				if (c1 != 0x5c) return false;
+				if (newline(c2)) return false;
 				return true;
-			} else if(c1 == 0x5c) {
-				return areAValidEscape(c1, c2);
-			} else {
-				return false;
-			}
-		};
-		var startsWithAnIdentifier = function() {
-			return wouldStartAnIdentifier(code, next(1), next(2));
-		};
-	
-		var wouldStartANumber = function(c1, c2, c3) {
-			if(c1 == 0x2b || c1 == 0x2d) {
-				if(digit(c2)) return true;
-				if(c2 == 0x2e && digit(c3)) return true;
-				return false;
-			} else if(c1 == 0x2e) {
-				if(digit(c2)) return true;
-				return false;
-			} else if(digit(c1)) {
-				return true;
-			} else {
-				return false;
-			}
-		};
-		var startsWithANumber = function() {
-			return wouldStartANumber(code, next(1), next(2));
-		};
-	
-		var consumeAName = function() {
-			var result = "";
-			while(consume()) {
-				if(namechar(code)) {
-					result += stringFromCode(code);
-				} else if(startsWithAValidEscape()) {
-					result += stringFromCode(consumeEscape());
+			};
+			var startsWithAValidEscape = function () {
+				return areAValidEscape(code, next());
+			};
+	
+			var wouldStartAnIdentifier = function (c1, c2, c3) {
+				if (c1 == 0x2d) {
+					return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);
+				} else if (namestartchar(c1)) {
+					return true;
+				} else if (c1 == 0x5c) {
+					return areAValidEscape(c1, c2);
 				} else {
-					reconsume();
-					return result;
-				}
-			}
-		};
-	
-		var consumeANumber = function() {
-			var repr = [];
-			var type = "integer";
-			if(next() == 0x2b || next() == 0x2d) {
-				consume();
-				repr += stringFromCode(code);
-			}
-			while(digit(next())) {
-				consume();
-				repr += stringFromCode(code);
-			}
-			if(next(1) == 0x2e && digit(next(2))) {
-				consume();
-				repr += stringFromCode(code);
-				consume();
-				repr += stringFromCode(code);
-				type = "number";
-				while(digit(next())) {
+					return false;
+				}
+			};
+			var startsWithAnIdentifier = function () {
+				return wouldStartAnIdentifier(code, next(1), next(2));
+			};
+	
+			var wouldStartANumber = function (c1, c2, c3) {
+				if (c1 == 0x2b || c1 == 0x2d) {
+					if (digit(c2)) return true;
+					if (c2 == 0x2e && digit(c3)) return true;
+					return false;
+				} else if (c1 == 0x2e) {
+					if (digit(c2)) return true;
+					return false;
+				} else if (digit(c1)) {
+					return true;
+				} else {
+					return false;
+				}
+			};
+			var startsWithANumber = function () {
+				return wouldStartANumber(code, next(1), next(2));
+			};
+	
+			var consumeAName = function () {
+				var result = "";
+				while (consume()) {
+					if (namechar(code)) {
+						result += stringFromCode(code);
+					} else if (startsWithAValidEscape()) {
+						result += stringFromCode(consumeEscape());
+					} else {
+						reconsume();
+						return result;
+					}
+				}
+			};
+	
+			var consumeANumber = function () {
+				var repr = [];
+				var type = "integer";
+				if (next() == 0x2b || next() == 0x2d) {
 					consume();
 					repr += stringFromCode(code);
 				}
-			}
-			var c1 = next(1), c2 = next(2), c3 = next(3);
-			if((c1 == 0x45 || c1 == 0x65) && digit(c2)) {
-				consume();
-				repr += stringFromCode(code);
-				consume();
-				repr += stringFromCode(code);
-				type = "number";
-				while(digit(next())) {
+				while (digit(next())) {
+					consume();
+					repr += stringFromCode(code);
+				}
+				if (next(1) == 0x2e && digit(next(2))) {
+					consume();
+					repr += stringFromCode(code);
 					consume();
 					repr += stringFromCode(code);
-				}
-			} else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {
-				consume();
-				repr += stringFromCode(code);
-				consume();
-				repr += stringFromCode(code);
-				consume();
-				repr += stringFromCode(code);
-				type = "number";
-				while(digit(next())) {
+					type = "number";
+					while (digit(next())) {
+						consume();
+						repr += stringFromCode(code);
+					}
+				}
+				var c1 = next(1),
+				    c2 = next(2),
+				    c3 = next(3);
+				if ((c1 == 0x45 || c1 == 0x65) && digit(c2)) {
+					consume();
+					repr += stringFromCode(code);
+					consume();
+					repr += stringFromCode(code);
+					type = "number";
+					while (digit(next())) {
+						consume();
+						repr += stringFromCode(code);
+					}
+				} else if ((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {
+					consume();
+					repr += stringFromCode(code);
+					consume();
+					repr += stringFromCode(code);
 					consume();
 					repr += stringFromCode(code);
-				}
-			}
-			var value = convertAStringToANumber(repr);
-			return {type:type, value:value, repr:repr};
-		};
-	
-		var convertAStringToANumber = function(string) {
-			// CSS's number rules are identical to JS, afaik.
-			return +string;
-		};
-	
-		var consumeTheRemnantsOfABadURL = function() {
-			while(consume()) {
-				if(code == 0x2d || eof()) {
-					return;
-				} else if(startsWithAValidEscape()) {
-					consumeEscape();
-					donothing();
+					type = "number";
+					while (digit(next())) {
+						consume();
+						repr += stringFromCode(code);
+					}
+				}
+				var value = convertAStringToANumber(repr);
+				return { type: type, value: value, repr: repr };
+			};
+	
+			var convertAStringToANumber = function (string) {
+				// CSS's number rules are identical to JS, afaik.
+				return +string;
+			};
+	
+			var consumeTheRemnantsOfABadURL = function () {
+				while (consume()) {
+					if (code == 0x2d || eof()) {
+						return;
+					} else if (startsWithAValidEscape()) {
+						consumeEscape();
+						donothing();
+					} else {
+						donothing();
+					}
+				}
+			};
+	
+			var iterationCount = 0;
+			while (!eof(next())) {
+				var token = consumeAToken();
+				if (options.loc) {
+					token.loc = {};
+					token.loc.start = { line: locStart.line, column: locStart.column };
+					token.loc.end = { line: line, column: column };
+				}
+				if (options.offsets) {
+					token.startOffset = offsetStart;
+					token.endOffset = i + 1;
+				}
+				yield token;
+				iterationCount++;
+				if (iterationCount > str.length * 2) return "I'm infinite-looping!";
+			}
+		}
+	
+		function CSSParserToken() {
+			throw "Abstract Base Class";
+		}
+		CSSParserToken.prototype.toJSON = function () {
+			return { token: this.tokenType };
+		};
+		CSSParserToken.prototype.toString = function () {
+			return this.tokenType;
+		};
+		CSSParserToken.prototype.toSource = function () {
+			return '' + this;
+		};
+	
+		function BadStringToken(text) {
+			this.text = text;
+			return this;
+		}
+		BadStringToken.prototype = Object.create(CSSParserToken.prototype);
+		BadStringToken.prototype.tokenType = "bad_string";
+	
+		function BadURLToken() {
+			return this;
+		}
+		BadURLToken.prototype = Object.create(CSSParserToken.prototype);
+		BadURLToken.prototype.tokenType = "bad_url";
+	
+		function WhitespaceToken() {
+			return this;
+		}
+		WhitespaceToken.prototype = Object.create(CSSParserToken.prototype);
+		WhitespaceToken.prototype.tokenType = "whitespace";
+		WhitespaceToken.prototype.toString = function () {
+			return "WS";
+		};
+		WhitespaceToken.prototype.toSource = function () {
+			return " ";
+		};
+	
+		function CDOToken() {
+			return this;
+		}
+		CDOToken.prototype = Object.create(CSSParserToken.prototype);
+		CDOToken.prototype.tokenType = "htmlcomment";
+		CDOToken.prototype.toSource = function () {
+			return "<!--";
+		};
+	
+		function CDCToken() {
+			return this;
+		}
+		CDCToken.prototype = Object.create(CSSParserToken.prototype);
+		CDCToken.prototype.tokenType = "htmlcomment";
+		CDCToken.prototype.toSource = function () {
+			return "-->";
+		};
+	
+		function ColonToken() {
+			return this;
+		}
+		ColonToken.prototype = Object.create(CSSParserToken.prototype);
+		ColonToken.prototype.tokenType = "symbol";
+		ColonToken.prototype.text = ":";
+	
+		function SemicolonToken() {
+			return this;
+		}
+		SemicolonToken.prototype = Object.create(CSSParserToken.prototype);
+		SemicolonToken.prototype.tokenType = "symbol";
+		SemicolonToken.prototype.text = ";";
+	
+		function CommaToken() {
+			return this;
+		}
+		CommaToken.prototype = Object.create(CSSParserToken.prototype);
+		CommaToken.prototype.tokenType = "symbol";
+		CommaToken.prototype.text = ",";
+	
+		function GroupingToken() {
+			throw "Abstract Base Class";
+		}
+		GroupingToken.prototype = Object.create(CSSParserToken.prototype);
+	
+		function OpenCurlyToken() {
+			this.value = "{";this.mirror = "}";return this;
+		}
+		OpenCurlyToken.prototype = Object.create(GroupingToken.prototype);
+		OpenCurlyToken.prototype.tokenType = "symbol";
+		OpenCurlyToken.prototype.text = "{";
+	
+		function CloseCurlyToken() {
+			this.value = "}";this.mirror = "{";return this;
+		}
+		CloseCurlyToken.prototype = Object.create(GroupingToken.prototype);
+		CloseCurlyToken.prototype.tokenType = "symbol";
+		CloseCurlyToken.prototype.text = "}";
+	
+		function OpenSquareToken() {
+			this.value = "[";this.mirror = "]";return this;
+		}
+		OpenSquareToken.prototype = Object.create(GroupingToken.prototype);
+		OpenSquareToken.prototype.tokenType = "symbol";
+		OpenSquareToken.prototype.text = "[";
+	
+		function CloseSquareToken() {
+			this.value = "]";this.mirror = "[";return this;
+		}
+		CloseSquareToken.prototype = Object.create(GroupingToken.prototype);
+		CloseSquareToken.prototype.tokenType = "symbol";
+		CloseSquareToken.prototype.text = "]";
+	
+		function OpenParenToken() {
+			this.value = "(";this.mirror = ")";return this;
+		}
+		OpenParenToken.prototype = Object.create(GroupingToken.prototype);
+		OpenParenToken.prototype.tokenType = "symbol";
+		OpenParenToken.prototype.text = "(";
+	
+		function CloseParenToken() {
+			this.value = ")";this.mirror = "(";return this;
+		}
+		CloseParenToken.prototype = Object.create(GroupingToken.prototype);
+		CloseParenToken.prototype.tokenType = "symbol";
+		CloseParenToken.prototype.text = ")";
+	
+		function IncludeMatchToken() {
+			return this;
+		}
+		IncludeMatchToken.prototype = Object.create(CSSParserToken.prototype);
+		IncludeMatchToken.prototype.tokenType = "includes";
+	
+		function DashMatchToken() {
+			return this;
+		}
+		DashMatchToken.prototype = Object.create(CSSParserToken.prototype);
+		DashMatchToken.prototype.tokenType = "dashmatch";
+	
+		function PrefixMatchToken() {
+			return this;
+		}
+		PrefixMatchToken.prototype = Object.create(CSSParserToken.prototype);
+		PrefixMatchToken.prototype.tokenType = "beginsmatch";
+	
+		function SuffixMatchToken() {
+			return this;
+		}
+		SuffixMatchToken.prototype = Object.create(CSSParserToken.prototype);
+		SuffixMatchToken.prototype.tokenType = "endsmatch";
+	
+		function SubstringMatchToken() {
+			return this;
+		}
+		SubstringMatchToken.prototype = Object.create(CSSParserToken.prototype);
+		SubstringMatchToken.prototype.tokenType = "containsmatch";
+	
+		function ColumnToken() {
+			return this;
+		}
+		ColumnToken.prototype = Object.create(CSSParserToken.prototype);
+		ColumnToken.prototype.tokenType = "||";
+	
+		function EOFToken() {
+			return this;
+		}
+		EOFToken.prototype = Object.create(CSSParserToken.prototype);
+		EOFToken.prototype.tokenType = "EOF";
+		EOFToken.prototype.toSource = function () {
+			return "";
+		};
+	
+		function DelimToken(code) {
+			this.value = stringFromCode(code);
+			this.text = this.value;
+			return this;
+		}
+		DelimToken.prototype = Object.create(CSSParserToken.prototype);
+		DelimToken.prototype.tokenType = "symbol";
+		DelimToken.prototype.toString = function () {
+			return "DELIM(" + this.value + ")";
+		};
+		DelimToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			return json;
+		};
+		DelimToken.prototype.toSource = function () {
+			if (this.value == "\\") return "\\\n";else return this.value;
+		};
+	
+		function StringValuedToken() {
+			throw "Abstract Base Class";
+		}
+		StringValuedToken.prototype = Object.create(CSSParserToken.prototype);
+		StringValuedToken.prototype.ASCIIMatch = function (str) {
+			return this.value.toLowerCase() == str.toLowerCase();
+		};
+		StringValuedToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			return json;
+		};
+	
+		function IdentToken(val) {
+			this.value = val;
+			this.text = val;
+		}
+		IdentToken.prototype = Object.create(StringValuedToken.prototype);
+		IdentToken.prototype.tokenType = "ident";
+		IdentToken.prototype.toString = function () {
+			return "IDENT(" + this.value + ")";
+		};
+		IdentToken.prototype.toSource = function () {
+			return escapeIdent(this.value);
+		};
+	
+		function FunctionToken(val) {
+			this.value = val;
+			this.text = val;
+			this.mirror = ")";
+		}
+		FunctionToken.prototype = Object.create(StringValuedToken.prototype);
+		FunctionToken.prototype.tokenType = "function";
+		FunctionToken.prototype.toString = function () {
+			return "FUNCTION(" + this.value + ")";
+		};
+		FunctionToken.prototype.toSource = function () {
+			return escapeIdent(this.value) + "(";
+		};
+	
+		function AtKeywordToken(val) {
+			this.value = val;
+			this.text = val;
+		}
+		AtKeywordToken.prototype = Object.create(StringValuedToken.prototype);
+		AtKeywordToken.prototype.tokenType = "at";
+		AtKeywordToken.prototype.toString = function () {
+			return "AT(" + this.value + ")";
+		};
+		AtKeywordToken.prototype.toSource = function () {
+			return "@" + escapeIdent(this.value);
+		};
+	
+		function HashToken(val) {
+			this.value = val;
+			this.text = val;
+			this.type = "unrestricted";
+		}
+		HashToken.prototype = Object.create(StringValuedToken.prototype);
+		HashToken.prototype.tokenType = "hash";
+		HashToken.prototype.toString = function () {
+			return "HASH(" + this.value + ")";
+		};
+		HashToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			json.type = this.type;
+			return json;
+		};
+		HashToken.prototype.toSource = function () {
+			if (this.type == "id") {
+				return "#" + escapeIdent(this.value);
+			} else {
+				return "#" + escapeHash(this.value);
+			}
+		};
+	
+		function StringToken(val) {
+			this.value = val;
+			this.text = val;
+		}
+		StringToken.prototype = Object.create(StringValuedToken.prototype);
+		StringToken.prototype.tokenType = "string";
+		StringToken.prototype.toString = function () {
+			return '"' + escapeString(this.value) + '"';
+		};
+	
+		function CommentToken(val) {
+			this.value = val;
+		}
+		CommentToken.prototype = Object.create(StringValuedToken.prototype);
+		CommentToken.prototype.tokenType = "comment";
+		CommentToken.prototype.toString = function () {
+			return '/*' + this.value + '*/';
+		};
+		CommentToken.prototype.toSource = CommentToken.prototype.toString;
+	
+		function URLToken(val) {
+			this.value = val;
+			this.text = val;
+		}
+		URLToken.prototype = Object.create(StringValuedToken.prototype);
+		URLToken.prototype.tokenType = "url";
+		URLToken.prototype.toString = function () {
+			return "URL(" + this.value + ")";
+		};
+		URLToken.prototype.toSource = function () {
+			return 'url("' + escapeString(this.value) + '")';
+		};
+	
+		function NumberToken() {
+			this.value = null;
+			this.type = "integer";
+			this.repr = "";
+		}
+		NumberToken.prototype = Object.create(CSSParserToken.prototype);
+		NumberToken.prototype.tokenType = "number";
+		NumberToken.prototype.toString = function () {
+			if (this.type == "integer") return "INT(" + this.value + ")";
+			return "NUMBER(" + this.value + ")";
+		};
+		NumberToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			json.type = this.type;
+			json.repr = this.repr;
+			return json;
+		};
+		NumberToken.prototype.toSource = function () {
+			return this.repr;
+		};
+	
+		function PercentageToken() {
+			this.value = null;
+			this.repr = "";
+		}
+		PercentageToken.prototype = Object.create(CSSParserToken.prototype);
+		PercentageToken.prototype.tokenType = "percentage";
+		PercentageToken.prototype.toString = function () {
+			return "PERCENTAGE(" + this.value + ")";
+		};
+		PercentageToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			json.repr = this.repr;
+			return json;
+		};
+		PercentageToken.prototype.toSource = function () {
+			return this.repr + "%";
+		};
+	
+		function DimensionToken() {
+			this.value = null;
+			this.type = "integer";
+			this.repr = "";
+			this.unit = "";
+		}
+		DimensionToken.prototype = Object.create(CSSParserToken.prototype);
+		DimensionToken.prototype.tokenType = "dimension";
+		DimensionToken.prototype.toString = function () {
+			return "DIM(" + this.value + "," + this.unit + ")";
+		};
+		DimensionToken.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.value = this.value;
+			json.type = this.type;
+			json.repr = this.repr;
+			json.unit = this.unit;
+			return json;
+		};
+		DimensionToken.prototype.toSource = function () {
+			var source = this.repr;
+			var unit = escapeIdent(this.unit);
+			if (unit[0].toLowerCase() == "e" && (unit[1] == "-" || between(unit.charCodeAt(1), 0x30, 0x39))) {
+				// Unit is ambiguous with scinot
+				// Remove the leading "e", replace with escape.
+				unit = "\\65 " + unit.slice(1, unit.length);
+			}
+			return source + unit;
+		};
+	
+		function escapeIdent(string) {
+			string = '' + string;
+			var result = '';
+			var firstcode = string.charCodeAt(0);
+			for (var i = 0; i < string.length; i++) {
+				var code = string.charCodeAt(i);
+				if (code === 0x0) {
+					throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+				}
+	
+				if (between(code, 0x1, 0x1f) || code == 0x7f || i === 0 && between(code, 0x30, 0x39) || i == 1 && between(code, 0x30, 0x39) && firstcode == 0x2d) {
+					result += '\\' + code.toString(16) + ' ';
+				} else if (code >= 0x80 || code == 0x2d || code == 0x5f || between(code, 0x30, 0x39) || between(code, 0x41, 0x5a) || between(code, 0x61, 0x7a)) {
+					result += string[i];
 				} else {
-					donothing();
-				}
-			}
-		};
-	
-	
-	
-		var iterationCount = 0;
-		while(!eof(next())) {
-			var token = consumeAToken();
-			if (options.loc) {
-				token.loc = {};
-				token.loc.start = {line:locStart.line, column:locStart.column};
-				token.loc.end = {line:line, column:column};
-			}
-			if (options.offsets) {
-				token.startOffset = offsetStart;
-				token.endOffset = i + 1;
-			}
-			yield token;
-			iterationCount++;
-			if(iterationCount > str.length*2) return "I'm infinite-looping!";
-		}
-	}
-	
-	function CSSParserToken() { throw "Abstract Base Class"; }
-	CSSParserToken.prototype.toJSON = function() {
-		return {token: this.tokenType};
-	};
-	CSSParserToken.prototype.toString = function() { return this.tokenType; };
-	CSSParserToken.prototype.toSource = function() { return ''+this; };
-	
-	function BadStringToken(text) {
-		this.text = text;
-		return this;
-	}
-	BadStringToken.prototype = Object.create(CSSParserToken.prototype);
-	BadStringToken.prototype.tokenType = "bad_string";
-	
-	function BadURLToken() { return this; }
-	BadURLToken.prototype = Object.create(CSSParserToken.prototype);
-	BadURLToken.prototype.tokenType = "bad_url";
-	
-	function WhitespaceToken() { return this; }
-	WhitespaceToken.prototype = Object.create(CSSParserToken.prototype);
-	WhitespaceToken.prototype.tokenType = "whitespace";
-	WhitespaceToken.prototype.toString = function() { return "WS"; };
-	WhitespaceToken.prototype.toSource = function() { return " "; };
-	
-	function CDOToken() { return this; }
-	CDOToken.prototype = Object.create(CSSParserToken.prototype);
-	CDOToken.prototype.tokenType = "htmlcomment";
-	CDOToken.prototype.toSource = function() { return "<!--"; };
-	
-	function CDCToken() { return this; }
-	CDCToken.prototype = Object.create(CSSParserToken.prototype);
-	CDCToken.prototype.tokenType = "htmlcomment";
-	CDCToken.prototype.toSource = function() { return "-->"; };
-	
-	function ColonToken() { return this; }
-	ColonToken.prototype = Object.create(CSSParserToken.prototype);
-	ColonToken.prototype.tokenType = "symbol";
-	ColonToken.prototype.text = ":";
-	
-	function SemicolonToken() { return this; }
-	SemicolonToken.prototype = Object.create(CSSParserToken.prototype);
-	SemicolonToken.prototype.tokenType = "symbol";
-	SemicolonToken.prototype.text = ";";
-	
-	function CommaToken() { return this; }
-	CommaToken.prototype = Object.create(CSSParserToken.prototype);
-	CommaToken.prototype.tokenType = "symbol";
-	CommaToken.prototype.text = ",";
-	
-	function GroupingToken() { throw "Abstract Base Class"; }
-	GroupingToken.prototype = Object.create(CSSParserToken.prototype);
-	
-	function OpenCurlyToken() { this.value = "{"; this.mirror = "}"; return this; }
-	OpenCurlyToken.prototype = Object.create(GroupingToken.prototype);
-	OpenCurlyToken.prototype.tokenType = "symbol";
-	OpenCurlyToken.prototype.text = "{";
-	
-	function CloseCurlyToken() { this.value = "}"; this.mirror = "{"; return this; }
-	CloseCurlyToken.prototype = Object.create(GroupingToken.prototype);
-	CloseCurlyToken.prototype.tokenType = "symbol";
-	CloseCurlyToken.prototype.text = "}";
-	
-	function OpenSquareToken() { this.value = "["; this.mirror = "]"; return this; }
-	OpenSquareToken.prototype = Object.create(GroupingToken.prototype);
-	OpenSquareToken.prototype.tokenType = "symbol";
-	OpenSquareToken.prototype.text = "[";
-	
-	function CloseSquareToken() { this.value = "]"; this.mirror = "["; return this; }
-	CloseSquareToken.prototype = Object.create(GroupingToken.prototype);
-	CloseSquareToken.prototype.tokenType = "symbol";
-	CloseSquareToken.prototype.text = "]";
-	
-	function OpenParenToken() { this.value = "("; this.mirror = ")"; return this; }
-	OpenParenToken.prototype = Object.create(GroupingToken.prototype);
-	OpenParenToken.prototype.tokenType = "symbol";
-	OpenParenToken.prototype.text = "(";
-	
-	function CloseParenToken() { this.value = ")"; this.mirror = "("; return this; }
-	CloseParenToken.prototype = Object.create(GroupingToken.prototype);
-	CloseParenToken.prototype.tokenType = "symbol";
-	CloseParenToken.prototype.text = ")";
-	
-	function IncludeMatchToken() { return this; }
-	IncludeMatchToken.prototype = Object.create(CSSParserToken.prototype);
-	IncludeMatchToken.prototype.tokenType = "includes";
-	
-	function DashMatchToken() { return this; }
-	DashMatchToken.prototype = Object.create(CSSParserToken.prototype);
-	DashMatchToken.prototype.tokenType = "dashmatch";
-	
-	function PrefixMatchToken() { return this; }
-	PrefixMatchToken.prototype = Object.create(CSSParserToken.prototype);
-	PrefixMatchToken.prototype.tokenType = "beginsmatch";
-	
-	function SuffixMatchToken() { return this; }
-	SuffixMatchToken.prototype = Object.create(CSSParserToken.prototype);
-	SuffixMatchToken.prototype.tokenType = "endsmatch";
-	
-	function SubstringMatchToken() { return this; }
-	SubstringMatchToken.prototype = Object.create(CSSParserToken.prototype);
-	SubstringMatchToken.prototype.tokenType = "containsmatch";
-	
-	function ColumnToken() { return this; }
-	ColumnToken.prototype = Object.create(CSSParserToken.prototype);
-	ColumnToken.prototype.tokenType = "||";
-	
-	function EOFToken() { return this; }
-	EOFToken.prototype = Object.create(CSSParserToken.prototype);
-	EOFToken.prototype.tokenType = "EOF";
-	EOFToken.prototype.toSource = function() { return ""; };
-	
-	function DelimToken(code) {
-		this.value = stringFromCode(code);
-		this.text = this.value;
-		return this;
-	}
-	DelimToken.prototype = Object.create(CSSParserToken.prototype);
-	DelimToken.prototype.tokenType = "symbol";
-	DelimToken.prototype.toString = function() { return "DELIM("+this.value+")"; };
-	DelimToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		return json;
-	};
-	DelimToken.prototype.toSource = function() {
-		if(this.value == "\\")
-			return "\\\n";
-		else
-			return this.value;
-	};
-	
-	function StringValuedToken() { throw "Abstract Base Class"; }
-	StringValuedToken.prototype = Object.create(CSSParserToken.prototype);
-	StringValuedToken.prototype.ASCIIMatch = function(str) {
-		return this.value.toLowerCase() == str.toLowerCase();
-	};
-	StringValuedToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		return json;
-	};
-	
-	function IdentToken(val) {
-		this.value = val;
-		this.text = val;
-	}
-	IdentToken.prototype = Object.create(StringValuedToken.prototype);
-	IdentToken.prototype.tokenType = "ident";
-	IdentToken.prototype.toString = function() { return "IDENT("+this.value+")"; };
-	IdentToken.prototype.toSource = function() {
-		return escapeIdent(this.value);
-	};
-	
-	function FunctionToken(val) {
-		this.value = val;
-		this.text = val;
-		this.mirror = ")";
-	}
-	FunctionToken.prototype = Object.create(StringValuedToken.prototype);
-	FunctionToken.prototype.tokenType = "function";
-	FunctionToken.prototype.toString = function() { return "FUNCTION("+this.value+")"; };
-	FunctionToken.prototype.toSource = function() {
-		return escapeIdent(this.value) + "(";
-	};
-	
-	function AtKeywordToken(val) {
-		this.value = val;
-		this.text = val;
-	}
-	AtKeywordToken.prototype = Object.create(StringValuedToken.prototype);
-	AtKeywordToken.prototype.tokenType = "at";
-	AtKeywordToken.prototype.toString = function() { return "AT("+this.value+")"; };
-	AtKeywordToken.prototype.toSource = function() {
-		return "@" + escapeIdent(this.value);
-	};
-	
-	function HashToken(val) {
-		this.value = val;
-		this.text = val;
-		this.type = "unrestricted";
-	}
-	HashToken.prototype = Object.create(StringValuedToken.prototype);
-	HashToken.prototype.tokenType = "hash";
-	HashToken.prototype.toString = function() { return "HASH("+this.value+")"; };
-	HashToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		json.type = this.type;
-		return json;
-	};
-	HashToken.prototype.toSource = function() {
-		if(this.type == "id") {
-			return "#" + escapeIdent(this.value);
-		} else {
-			return "#" + escapeHash(this.value);
-		}
-	};
-	
-	function StringToken(val) {
-		this.value = val;
-		this.text = val;
-	}
-	StringToken.prototype = Object.create(StringValuedToken.prototype);
-	StringToken.prototype.tokenType = "string";
-	StringToken.prototype.toString = function() {
-		return '"' + escapeString(this.value) + '"';
-	};
-	
-	function CommentToken(val) {
-		this.value = val;
-	}
-	CommentToken.prototype = Object.create(StringValuedToken.prototype);
-	CommentToken.prototype.tokenType = "comment";
-	CommentToken.prototype.toString = function() {
-		return '/*' + this.value + '*/';
-	}
-	CommentToken.prototype.toSource = CommentToken.prototype.toString;
-	
-	function URLToken(val) {
-		this.value = val;
-		this.text = val;
-	}
-	URLToken.prototype = Object.create(StringValuedToken.prototype);
-	URLToken.prototype.tokenType = "url";
-	URLToken.prototype.toString = function() { return "URL("+this.value+")"; };
-	URLToken.prototype.toSource = function() {
-		return 'url("' + escapeString(this.value) + '")';
-	};
-	
-	function NumberToken() {
-		this.value = null;
-		this.type = "integer";
-		this.repr = "";
-	}
-	NumberToken.prototype = Object.create(CSSParserToken.prototype);
-	NumberToken.prototype.tokenType = "number";
-	NumberToken.prototype.toString = function() {
-		if(this.type == "integer")
-			return "INT("+this.value+")";
-		return "NUMBER("+this.value+")";
-	};
-	NumberToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		json.type = this.type;
-		json.repr = this.repr;
-		return json;
-	};
-	NumberToken.prototype.toSource = function() { return this.repr; };
-	
-	function PercentageToken() {
-		this.value = null;
-		this.repr = "";
-	}
-	PercentageToken.prototype = Object.create(CSSParserToken.prototype);
-	PercentageToken.prototype.tokenType = "percentage";
-	PercentageToken.prototype.toString = function() { return "PERCENTAGE("+this.value+")"; };
-	PercentageToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		json.repr = this.repr;
-		return json;
-	};
-	PercentageToken.prototype.toSource = function() { return this.repr + "%"; };
-	
-	function DimensionToken() {
-		this.value = null;
-		this.type = "integer";
-		this.repr = "";
-		this.unit = "";
-	}
-	DimensionToken.prototype = Object.create(CSSParserToken.prototype);
-	DimensionToken.prototype.tokenType = "dimension";
-	DimensionToken.prototype.toString = function() { return "DIM("+this.value+","+this.unit+")"; };
-	DimensionToken.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.value = this.value;
-		json.type = this.type;
-		json.repr = this.repr;
-		json.unit = this.unit;
-		return json;
-	};
-	DimensionToken.prototype.toSource = function() {
-		var source = this.repr;
-		var unit = escapeIdent(this.unit);
-		if(unit[0].toLowerCase() == "e" && (unit[1] == "-" || between(unit.charCodeAt(1), 0x30, 0x39))) {
-			// Unit is ambiguous with scinot
-			// Remove the leading "e", replace with escape.
-			unit = "\\65 " + unit.slice(1, unit.length);
-		}
-		return source+unit;
-	};
-	
-	function escapeIdent(string) {
-		string = ''+string;
-		var result = '';
-		var firstcode = string.charCodeAt(0);
-		for(var i = 0; i < string.length; i++) {
-			var code = string.charCodeAt(i);
-			if(code === 0x0) {
-				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
-			}
-	
-			if(
-				between(code, 0x1, 0x1f) || code == 0x7f ||
-				(i === 0 && between(code, 0x30, 0x39)) ||
-				(i == 1 && between(code, 0x30, 0x39) && firstcode == 0x2d)
-			) {
-				result += '\\' + code.toString(16) + ' ';
-			} else if(
-				code >= 0x80 ||
-				code == 0x2d ||
-				code == 0x5f ||
-				between(code, 0x30, 0x39) ||
-				between(code, 0x41, 0x5a) ||
-				between(code, 0x61, 0x7a)
-			) {
-				result += string[i];
-			} else {
-				result += '\\' + string[i];
-			}
-		}
-		return result;
-	}
-	
-	function escapeHash(string) {
-		// Escapes the contents of "unrestricted"-type hash tokens.
-		// Won't preserve the ID-ness of "id"-type hash tokens;
-		// use escapeIdent() for that.
-		string = ''+string;
-		var result = '';
-		for(var i = 0; i < string.length; i++) {
-			var code = string.charCodeAt(i);
-			if(code === 0x0) {
-				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
-			}
-	
-			if(
-				code >= 0x80 ||
-				code == 0x2d ||
-				code == 0x5f ||
-				between(code, 0x30, 0x39) ||
-				between(code, 0x41, 0x5a) ||
-				between(code, 0x61, 0x7a)
-			) {
-				result += string[i];
-			} else {
-				result += '\\' + code.toString(16) + ' ';
-			}
-		}
-		return result;
-	}
-	
-	function escapeString(string) {
-		string = ''+string;
-		var result = '';
-		for(var i = 0; i < string.length; i++) {
-			var code = string.charCodeAt(i);
-	
-			if(code === 0x0) {
-				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
-			}
-	
-			if(between(code, 0x1, 0x1f) || code == 0x7f) {
-				result += '\\' + code.toString(16) + ' ';
-			} else if(code == 0x22 || code == 0x5c) {
-				result += '\\' + string[i];
-			} else {
-				result += string[i];
-			}
-		}
-		return result;
-	}
-	
-	// Exportation.
-	exports.tokenize = tokenize;
-	exports.IdentToken = IdentToken;
-	exports.FunctionToken = FunctionToken;
-	exports.AtKeywordToken = AtKeywordToken;
-	exports.HashToken = HashToken;
-	exports.StringToken = StringToken;
-	exports.BadStringToken = BadStringToken;
-	exports.URLToken = URLToken;
-	exports.BadURLToken = BadURLToken;
-	exports.DelimToken = DelimToken;
-	exports.NumberToken = NumberToken;
-	exports.PercentageToken = PercentageToken;
-	exports.DimensionToken = DimensionToken;
-	exports.IncludeMatchToken = IncludeMatchToken;
-	exports.DashMatchToken = DashMatchToken;
-	exports.PrefixMatchToken = PrefixMatchToken;
-	exports.SuffixMatchToken = SuffixMatchToken;
-	exports.SubstringMatchToken = SubstringMatchToken;
-	exports.ColumnToken = ColumnToken;
-	exports.WhitespaceToken = WhitespaceToken;
-	exports.CDOToken = CDOToken;
-	exports.CDCToken = CDCToken;
-	exports.ColonToken = ColonToken;
-	exports.SemicolonToken = SemicolonToken;
-	exports.CommaToken = CommaToken;
-	exports.OpenParenToken = OpenParenToken;
-	exports.CloseParenToken = CloseParenToken;
-	exports.OpenSquareToken = OpenSquareToken;
-	exports.CloseSquareToken = CloseSquareToken;
-	exports.OpenCurlyToken = OpenCurlyToken;
-	exports.CloseCurlyToken = CloseCurlyToken;
-	exports.EOFToken = EOFToken;
-	exports.CSSParserToken = CSSParserToken;
-	exports.GroupingToken = GroupingToken;
-	
-	function TokenStream(tokens) {
-		// Assume that tokens is a iterator.
-		this.tokens = tokens;
-		this.token = undefined;
-		this.stored = [];
-	}
-	TokenStream.prototype.consume = function(num) {
-		if(num === undefined) num = 1;
-		while (num-- > 0) {
-			if (this.stored.length > 0) {
-				this.token = this.stored.shift();
-			} else {
+					result += '\\' + string[i];
+				}
+			}
+			return result;
+		}
+	
+		function escapeHash(string) {
+			// Escapes the contents of "unrestricted"-type hash tokens.
+			// Won't preserve the ID-ness of "id"-type hash tokens;
+			// use escapeIdent() for that.
+			string = '' + string;
+			var result = '';
+			for (var i = 0; i < string.length; i++) {
+				var code = string.charCodeAt(i);
+				if (code === 0x0) {
+					throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+				}
+	
+				if (code >= 0x80 || code == 0x2d || code == 0x5f || between(code, 0x30, 0x39) || between(code, 0x41, 0x5a) || between(code, 0x61, 0x7a)) {
+					result += string[i];
+				} else {
+					result += '\\' + code.toString(16) + ' ';
+				}
+			}
+			return result;
+		}
+	
+		function escapeString(string) {
+			string = '' + string;
+			var result = '';
+			for (var i = 0; i < string.length; i++) {
+				var code = string.charCodeAt(i);
+	
+				if (code === 0x0) {
+					throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+				}
+	
+				if (between(code, 0x1, 0x1f) || code == 0x7f) {
+					result += '\\' + code.toString(16) + ' ';
+				} else if (code == 0x22 || code == 0x5c) {
+					result += '\\' + string[i];
+				} else {
+					result += string[i];
+				}
+			}
+			return result;
+		}
+	
+		// Exportation.
+		exports.tokenize = tokenize;
+		exports.IdentToken = IdentToken;
+		exports.FunctionToken = FunctionToken;
+		exports.AtKeywordToken = AtKeywordToken;
+		exports.HashToken = HashToken;
+		exports.StringToken = StringToken;
+		exports.BadStringToken = BadStringToken;
+		exports.URLToken = URLToken;
+		exports.BadURLToken = BadURLToken;
+		exports.DelimToken = DelimToken;
+		exports.NumberToken = NumberToken;
+		exports.PercentageToken = PercentageToken;
+		exports.DimensionToken = DimensionToken;
+		exports.IncludeMatchToken = IncludeMatchToken;
+		exports.DashMatchToken = DashMatchToken;
+		exports.PrefixMatchToken = PrefixMatchToken;
+		exports.SuffixMatchToken = SuffixMatchToken;
+		exports.SubstringMatchToken = SubstringMatchToken;
+		exports.ColumnToken = ColumnToken;
+		exports.WhitespaceToken = WhitespaceToken;
+		exports.CDOToken = CDOToken;
+		exports.CDCToken = CDCToken;
+		exports.ColonToken = ColonToken;
+		exports.SemicolonToken = SemicolonToken;
+		exports.CommaToken = CommaToken;
+		exports.OpenParenToken = OpenParenToken;
+		exports.CloseParenToken = CloseParenToken;
+		exports.OpenSquareToken = OpenSquareToken;
+		exports.CloseSquareToken = CloseSquareToken;
+		exports.OpenCurlyToken = OpenCurlyToken;
+		exports.CloseCurlyToken = CloseCurlyToken;
+		exports.EOFToken = EOFToken;
+		exports.CSSParserToken = CSSParserToken;
+		exports.GroupingToken = GroupingToken;
+	
+		function TokenStream(tokens) {
+			// Assume that tokens is a iterator.
+			this.tokens = tokens;
+			this.token = undefined;
+			this.stored = [];
+		}
+		TokenStream.prototype.consume = function (num) {
+			if (num === undefined) num = 1;
+			while (num-- > 0) {
+				if (this.stored.length > 0) {
+					this.token = this.stored.shift();
+				} else {
+					var n = this.tokens.next();
+					while (!n.done && n.value instanceof CommentToken) {
+						n = this.tokens.next();
+					}
+					if (n.done) {
+						this.token = new EOFToken();
+						break;
+					}
+					this.token = n.value;
+				}
+			}
+			//console.log(this.i, this.token);
+			return true;
+		};
+		TokenStream.prototype.next = function () {
+			if (this.stored.length === 0) {
 				var n = this.tokens.next();
 				while (!n.done && n.value instanceof CommentToken) {
 					n = this.tokens.next();
 				}
-				if (n.done) {
-					this.token = new EOFToken();
-					break;
-				}
-				this.token = n.value;
-			}
-		}
-		//console.log(this.i, this.token);
-		return true;
-	};
-	TokenStream.prototype.next = function() {
-		if (this.stored.length === 0) {
-			var n = this.tokens.next();
-			while (!n.done && n.value instanceof CommentToken) {
-				n = this.tokens.next();
-			}
-			if (n.done)
-				return new EOFToken();
-			this.stored.push(n.value);
-		}
-		return this.stored[0];
-	};
-	TokenStream.prototype.reconsume = function() {
-		this.stored.unshift(this.token);
-	};
-	
-	function parseerror(s, msg) {
-		console.log("Parse error at token " + s.i + ": " + s.token + ".\n" + msg);
-		return true;
-	}
-	function donothing(){ return true; }
-	
-	function consumeAListOfRules(s, topLevel) {
-		var rules = [];
-		var rule;
-		while(s.consume()) {
-			if(s.token instanceof WhitespaceToken) {
-				continue;
-			} else if(s.token instanceof EOFToken) {
-				return rules;
-			} else if(s.token instanceof CDOToken || s.token instanceof CDCToken) {
-				if(topLevel == "top-level") continue;
-				s.reconsume();
-				if(rule = consumeAQualifiedRule(s)) rules.push(rule);
-			} else if(s.token instanceof AtKeywordToken) {
-				s.reconsume();
-				if(rule = consumeAnAtRule(s)) rules.push(rule);
-			} else {
-				s.reconsume();
-				if(rule = consumeAQualifiedRule(s)) rules.push(rule);
-			}
-		}
-	}
-	
-	function consumeAnAtRule(s) {
-		s.consume();
-		var rule = new AtRule(s.token.value);
-		while(s.consume()) {
-			if(s.token instanceof SemicolonToken || s.token instanceof EOFToken) {
-				return rule;
-			} else if(s.token instanceof OpenCurlyToken) {
-				rule.value = consumeASimpleBlock(s);
-				return rule;
-			} else {
-				s.reconsume();
-				rule.prelude.push(consumeAComponentValue(s));
-			}
-		}
-	}
-	
-	function consumeAQualifiedRule(s) {
-		var rule = new QualifiedRule();
-		while(s.consume()) {
-			if(s.token instanceof EOFToken) {
-				parseerror(s, "Hit EOF when trying to parse the prelude of a qualified rule.");
-				return;
-			} else if(s.token instanceof OpenCurlyToken) {
-				rule.value = consumeASimpleBlock(s);
-				return rule;
-			} else {
-				s.reconsume();
-				rule.prelude.push(consumeAComponentValue(s));
-			}
-		}
-	}
-	
-	function consumeAListOfDeclarations(s) {
-		var decls = [];
-		while(s.consume()) {
-			if(s.token instanceof WhitespaceToken || s.token instanceof SemicolonToken) {
-				donothing();
-			} else if(s.token instanceof EOFToken) {
-				return decls;
-			} else if(s.token instanceof AtKeywordToken) {
-				s.reconsume();
-				decls.push(consumeAnAtRule(s));
-			} else if(s.token instanceof IdentToken) {
-				var temp = [s.token];
-				while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken))
-					temp.push(consumeAComponentValue(s));
-				var decl;
-				if(decl = consumeADeclaration(new TokenStream(temp))) decls.push(decl);
-			} else {
-				parseerror(s);
-				s.reconsume();
-				while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken))
-					consumeAComponentValue(s);
-			}
-		}
-	}
-	
-	function consumeADeclaration(s) {
-		// Assumes that the next input token will be an ident token.
-		s.consume();
-		var decl = new Declaration(s.token.value);
-		while(s.next() instanceof WhitespaceToken) s.consume();
-		if(!(s.next() instanceof ColonToken)) {
-			parseerror(s);
-			return;
-		} else {
+				if (n.done) return new EOFToken();
+				this.stored.push(n.value);
+			}
+			return this.stored[0];
+		};
+		TokenStream.prototype.reconsume = function () {
+			this.stored.unshift(this.token);
+		};
+	
+		function parseerror(s, msg) {
+			console.log("Parse error at token " + s.i + ": " + s.token + ".\n" + msg);
+			return true;
+		}
+		function donothing() {
+			return true;
+		}
+	
+		function consumeAListOfRules(s, topLevel) {
+			var rules = [];
+			var rule;
+			while (s.consume()) {
+				if (s.token instanceof WhitespaceToken) {
+					continue;
+				} else if (s.token instanceof EOFToken) {
+					return rules;
+				} else if (s.token instanceof CDOToken || s.token instanceof CDCToken) {
+					if (topLevel == "top-level") continue;
+					s.reconsume();
+					if (rule = consumeAQualifiedRule(s)) rules.push(rule);
+				} else if (s.token instanceof AtKeywordToken) {
+					s.reconsume();
+					if (rule = consumeAnAtRule(s)) rules.push(rule);
+				} else {
+					s.reconsume();
+					if (rule = consumeAQualifiedRule(s)) rules.push(rule);
+				}
+			}
+		}
+	
+		function consumeAnAtRule(s) {
 			s.consume();
-		}
-		while(!(s.next() instanceof EOFToken)) {
-			decl.value.push(consumeAComponentValue(s));
-		}
-		var foundImportant = false;
-		for(var i = decl.value.length - 1; i >= 0; i--) {
-			if(decl.value[i] instanceof WhitespaceToken) {
-				continue;
-			} else if(decl.value[i] instanceof IdentToken && decl.value[i].ASCIIMatch("important")) {
-				foundImportant = true;
-			} else if(foundImportant && decl.value[i] instanceof DelimToken && decl.value[i].value == "!") {
-				decl.value.splice(i, decl.value.length);
-				decl.important = true;
-				break;
+			var rule = new AtRule(s.token.value);
+			while (s.consume()) {
+				if (s.token instanceof SemicolonToken || s.token instanceof EOFToken) {
+					return rule;
+				} else if (s.token instanceof OpenCurlyToken) {
+					rule.value = consumeASimpleBlock(s);
+					return rule;
+				} else {
+					s.reconsume();
+					rule.prelude.push(consumeAComponentValue(s));
+				}
+			}
+		}
+	
+		function consumeAQualifiedRule(s) {
+			var rule = new QualifiedRule();
+			while (s.consume()) {
+				if (s.token instanceof EOFToken) {
+					parseerror(s, "Hit EOF when trying to parse the prelude of a qualified rule.");
+					return;
+				} else if (s.token instanceof OpenCurlyToken) {
+					rule.value = consumeASimpleBlock(s);
+					return rule;
+				} else {
+					s.reconsume();
+					rule.prelude.push(consumeAComponentValue(s));
+				}
+			}
+		}
+	
+		function consumeAListOfDeclarations(s) {
+			var decls = [];
+			while (s.consume()) {
+				if (s.token instanceof WhitespaceToken || s.token instanceof SemicolonToken) {
+					donothing();
+				} else if (s.token instanceof EOFToken) {
+					return decls;
+				} else if (s.token instanceof AtKeywordToken) {
+					s.reconsume();
+					decls.push(consumeAnAtRule(s));
+				} else if (s.token instanceof IdentToken) {
+					var temp = [s.token];
+					while (!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken)) {
+						temp.push(consumeAComponentValue(s));
+					}var decl;
+					if (decl = consumeADeclaration(new TokenStream(temp))) decls.push(decl);
+				} else {
+					parseerror(s);
+					s.reconsume();
+					while (!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken)) {
+						consumeAComponentValue(s);
+					}
+				}
+			}
+		}
+	
+		function consumeADeclaration(s) {
+			// Assumes that the next input token will be an ident token.
+			s.consume();
+			var decl = new Declaration(s.token.value);
+			while (s.next() instanceof WhitespaceToken) {
+				s.consume();
+			}if (!(s.next() instanceof ColonToken)) {
+				parseerror(s);
+				return;
 			} else {
-				break;
-			}
-		}
-		return decl;
-	}
-	
-	function consumeAComponentValue(s) {
-		s.consume();
-		if(s.token instanceof OpenCurlyToken || s.token instanceof OpenSquareToken || s.token instanceof OpenParenToken)
-			return consumeASimpleBlock(s);
-		if(s.token instanceof FunctionToken)
-			return consumeAFunction(s);
-		return s.token;
-	}
-	
-	function consumeASimpleBlock(s) {
-		var mirror = s.token.mirror;
-		var block = new SimpleBlock(s.token.value);
-		block.startToken = s.token;
-		while(s.consume()) {
-			if(s.token instanceof EOFToken || (s.token instanceof GroupingToken && s.token.value == mirror))
-				return block;
-			else {
-				s.reconsume();
-				block.value.push(consumeAComponentValue(s));
-			}
-		}
-	}
-	
-	function consumeAFunction(s) {
-		var func = new Func(s.token.value);
-		while(s.consume()) {
-			if(s.token instanceof EOFToken || s.token instanceof CloseParenToken)
-				return func;
-			else {
-				s.reconsume();
-				func.value.push(consumeAComponentValue(s));
-			}
-		}
-	}
-	
-	function normalizeInput(input) {
-		if(typeof input == "string")
-			return new TokenStream(tokenize(input));
-		if(input instanceof TokenStream)
-			return input;
-		if(typeof (input.next) == "function")
-			return new TokenStream(input);
-		if(input.length !== undefined)
-			return new TokenStream(input[Symbol.iterator]());
-		else throw SyntaxError(input);
-	}
-	
-	function parseAStylesheet(s) {
-		s = normalizeInput(s);
-		var sheet = new Stylesheet();
-		sheet.value = consumeAListOfRules(s, "top-level");
-		return sheet;
-	}
-	
-	function parseAListOfRules(s) {
-		s = normalizeInput(s);
-		return consumeAListOfRules(s);
-	}
-	
-	function parseARule(s) {
-		s = normalizeInput(s);
-		while(s.next() instanceof WhitespaceToken) s.consume();
-		if(s.next() instanceof EOFToken) throw SyntaxError();
-		var rule;
-		var startToken = s.next();
-		if(startToken instanceof AtKeywordToken) {
-			rule = consumeAnAtRule(s);
-		} else {
-			rule = consumeAQualifiedRule(s);
-			if(!rule) throw SyntaxError();
-		}
-		rule.startToken = startToken;
-		rule.endToken = s.token;
-		return rule;
-	}
-	
-	function parseADeclaration(s) {
-		s = normalizeInput(s);
-		while(s.next() instanceof WhitespaceToken) s.consume();
-		if(!(s.next() instanceof IdentToken)) throw SyntaxError();
-		var decl = consumeADeclaration(s);
-		if(decl)
-			return decl;
-		else
-			throw SyntaxError();
-	}
-	
-	function parseAListOfDeclarations(s) {
-		s = normalizeInput(s);
-		return consumeAListOfDeclarations(s);
-	}
-	
-	function parseAComponentValue(s) {
-		s = normalizeInput(s);
-		while(s.next() instanceof WhitespaceToken) s.consume();
-		if(s.next() instanceof EOFToken) throw SyntaxError();
-		var val = consumeAComponentValue(s);
-		if(!val) throw SyntaxError();
-		while(s.next() instanceof WhitespaceToken) s.consume();
-		if(s.next() instanceof EOFToken)
-			return val;
-		throw SyntaxError();
-	}
-	
-	function parseAListOfComponentValues(s) {
-		s = normalizeInput(s);
-		var vals = [];
-		while(true) {
-			var val = consumeAComponentValue(s);
-			if(val instanceof EOFToken)
-				return vals;
-			else
-				vals.push(val);
-		}
-	}
-	
-	function parseACommaSeparatedListOfComponentValues(s) {
-		s = normalizeInput(s);
-		var listOfCVLs = [];
-		while(true) {
-			var vals = [];
-			while(true) {
-				var val = consumeAComponentValue(s);
-				if(val instanceof EOFToken) {
-					listOfCVLs.push(vals);
-					return listOfCVLs;
-				} else if(val instanceof CommaToken) {
-					listOfCVLs.push(vals);
+				s.consume();
+			}
+			while (!(s.next() instanceof EOFToken)) {
+				decl.value.push(consumeAComponentValue(s));
+			}
+			var foundImportant = false;
+			for (var i = decl.value.length - 1; i >= 0; i--) {
+				if (decl.value[i] instanceof WhitespaceToken) {
+					continue;
+				} else if (decl.value[i] instanceof IdentToken && decl.value[i].ASCIIMatch("important")) {
+					foundImportant = true;
+				} else if (foundImportant && decl.value[i] instanceof DelimToken && decl.value[i].value == "!") {
+					decl.value.splice(i, decl.value.length);
+					decl.important = true;
 					break;
 				} else {
-					vals.push(val);
-				}
-			}
-		}
-	}
-	
-	
-	function CSSParserRule() { throw "Abstract Base Class"; }
-	CSSParserRule.prototype.toString = function(indent) {
-		return JSON.stringify(this,null,indent);
-	};
-	CSSParserRule.prototype.toJSON = function() {
-		return {type:this.type, value:this.value};
-	};
-	
-	function Stylesheet() {
-		this.value = [];
-		return this;
-	}
-	Stylesheet.prototype = Object.create(CSSParserRule.prototype);
-	Stylesheet.prototype.type = "STYLESHEET";
-	
-	function AtRule(name) {
-		this.name = name;
-		this.prelude = [];
-		this.value = null;
-		return this;
-	}
-	AtRule.prototype = Object.create(CSSParserRule.prototype);
-	AtRule.prototype.type = "AT-RULE";
-	AtRule.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.name = this.name;
-		json.prelude = this.prelude;
-		return json;
-	};
-	
-	function QualifiedRule() {
-		this.prelude = [];
-		this.value = [];
-		return this;
-	}
-	QualifiedRule.prototype = Object.create(CSSParserRule.prototype);
-	QualifiedRule.prototype.type = "QUALIFIED-RULE";
-	QualifiedRule.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.prelude = this.prelude;
-		return json;
-	};
-	
-	function Declaration(name) {
-		this.name = name;
-		this.value = [];
-		this.important = false;
-		return this;
-	}
-	Declaration.prototype = Object.create(CSSParserRule.prototype);
-	Declaration.prototype.type = "DECLARATION";
-	Declaration.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.name = this.name;
-		json.important = this.important;
-		return json;
-	};
-	
-	function SimpleBlock(type) {
-		this.name = type;
-		this.value = [];
-		return this;
-	}
-	SimpleBlock.prototype = Object.create(CSSParserRule.prototype);
-	SimpleBlock.prototype.type = "BLOCK";
-	SimpleBlock.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.name = this.name;
-		return json;
-	};
-	
-	function Func(name) {
-		this.name = name;
-		this.value = [];
-		return this;
-	}
-	Func.prototype = Object.create(CSSParserRule.prototype);
-	Func.prototype.type = "FUNCTION";
-	Func.prototype.toJSON = function() {
-		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
-		json.name = this.name;
-		return json;
-	};
-	
-	function CSSLexer(text) {
-		this.stream = tokenize(text, {
-			loc: true,
-			offsets: true,
-			keepComments: true
-		});
-		this.lineNumber = 0;
-		this.columnNumber = 0;
-		return this;
-	}
-	
-	CSSLexer.prototype.performEOFFixup = function(input, preserveBackslash) {
-		// Just lie for now.
-		return "";
-	};
-	
-	CSSLexer.prototype.nextToken = function() {
-		if (!this.stream) {
-			return null;
-		}
-		let v = this.stream.next();
-		if (v.done || v.value.tokenType === "EOF") {
-			this.stream = null;
-			return null;
-		}
-		this.lineNumber = v.value.loc.start.line;
-		this.columnNumber = v.value.loc.start.column;
-		return v.value;
-	};
-	
-	// Exportation.
-	exports.CSSParserRule = CSSParserRule;
-	exports.Stylesheet = Stylesheet;
-	exports.AtRule = AtRule;
-	exports.QualifiedRule = QualifiedRule;
-	exports.Declaration = Declaration;
-	exports.SimpleBlock = SimpleBlock;
-	exports.Func = Func;
-	exports.parseAStylesheet = parseAStylesheet;
-	exports.parseAListOfRules = parseAListOfRules;
-	exports.parseARule = parseARule;
-	exports.parseADeclaration = parseADeclaration;
-	exports.parseAListOfDeclarations = parseAListOfDeclarations;
-	exports.parseAComponentValue = parseAComponentValue;
-	exports.parseAListOfComponentValues = parseAListOfComponentValues;
-	exports.parseACommaSeparatedListOfComponentValues = parseACommaSeparatedListOfComponentValues;
-	exports.CSSLexer = CSSLexer;
-	
-	}));
-
-
-/***/ },
-/* 31 */
+					break;
+				}
+			}
+			return decl;
+		}
+	
+		function consumeAComponentValue(s) {
+			s.consume();
+			if (s.token instanceof OpenCurlyToken || s.token instanceof OpenSquareToken || s.token instanceof OpenParenToken) return consumeASimpleBlock(s);
+			if (s.token instanceof FunctionToken) return consumeAFunction(s);
+			return s.token;
+		}
+	
+		function consumeASimpleBlock(s) {
+			var mirror = s.token.mirror;
+			var block = new SimpleBlock(s.token.value);
+			block.startToken = s.token;
+			while (s.consume()) {
+				if (s.token instanceof EOFToken || s.token instanceof GroupingToken && s.token.value == mirror) return block;else {
+					s.reconsume();
+					block.value.push(consumeAComponentValue(s));
+				}
+			}
+		}
+	
+		function consumeAFunction(s) {
+			var func = new Func(s.token.value);
+			while (s.consume()) {
+				if (s.token instanceof EOFToken || s.token instanceof CloseParenToken) return func;else {
+					s.reconsume();
+					func.value.push(consumeAComponentValue(s));
+				}
+			}
+		}
+	
+		function normalizeInput(input) {
+			if (typeof input == "string") return new TokenStream(tokenize(input));
+			if (input instanceof TokenStream) return input;
+			if (typeof input.next == "function") return new TokenStream(input);
+			if (input.length !== undefined) return new TokenStream(input[Symbol.iterator]());else throw SyntaxError(input);
+		}
+	
+		function parseAStylesheet(s) {
+			s = normalizeInput(s);
+			var sheet = new Stylesheet();
+			sheet.value = consumeAListOfRules(s, "top-level");
+			return sheet;
+		}
+	
+		function parseAListOfRules(s) {
+			s = normalizeInput(s);
+			return consumeAListOfRules(s);
+		}
+	
+		function parseARule(s) {
+			s = normalizeInput(s);
+			while (s.next() instanceof WhitespaceToken) {
+				s.consume();
+			}if (s.next() instanceof EOFToken) throw SyntaxError();
+			var rule;
+			var startToken = s.next();
+			if (startToken instanceof AtKeywordToken) {
+				rule = consumeAnAtRule(s);
+			} else {
+				rule = consumeAQualifiedRule(s);
+				if (!rule) throw SyntaxError();
+			}
+			rule.startToken = startToken;
+			rule.endToken = s.token;
+			return rule;
+		}
+	
+		function parseADeclaration(s) {
+			s = normalizeInput(s);
+			while (s.next() instanceof WhitespaceToken) {
+				s.consume();
+			}if (!(s.next() instanceof IdentToken)) throw SyntaxError();
+			var decl = consumeADeclaration(s);
+			if (decl) return decl;else throw SyntaxError();
+		}
+	
+		function parseAListOfDeclarations(s) {
+			s = normalizeInput(s);
+			return consumeAListOfDeclarations(s);
+		}
+	
+		function parseAComponentValue(s) {
+			s = normalizeInput(s);
+			while (s.next() instanceof WhitespaceToken) {
+				s.consume();
+			}if (s.next() instanceof EOFToken) throw SyntaxError();
+			var val = consumeAComponentValue(s);
+			if (!val) throw SyntaxError();
+			while (s.next() instanceof WhitespaceToken) {
+				s.consume();
+			}if (s.next() instanceof EOFToken) return val;
+			throw SyntaxError();
+		}
+	
+		function parseAListOfComponentValues(s) {
+			s = normalizeInput(s);
+			var vals = [];
+			while (true) {
+				var val = consumeAComponentValue(s);
+				if (val instanceof EOFToken) return vals;else vals.push(val);
+			}
+		}
+	
+		function parseACommaSeparatedListOfComponentValues(s) {
+			s = normalizeInput(s);
+			var listOfCVLs = [];
+			while (true) {
+				var vals = [];
+				while (true) {
+					var val = consumeAComponentValue(s);
+					if (val instanceof EOFToken) {
+						listOfCVLs.push(vals);
+						return listOfCVLs;
+					} else if (val instanceof CommaToken) {
+						listOfCVLs.push(vals);
+						break;
+					} else {
+						vals.push(val);
+					}
+				}
+			}
+		}
+	
+		function CSSParserRule() {
+			throw "Abstract Base Class";
+		}
+		CSSParserRule.prototype.toString = function (indent) {
+			return JSON.stringify(this, null, indent);
+		};
+		CSSParserRule.prototype.toJSON = function () {
+			return { type: this.type, value: this.value };
+		};
+	
+		function Stylesheet() {
+			this.value = [];
+			return this;
+		}
+		Stylesheet.prototype = Object.create(CSSParserRule.prototype);
+		Stylesheet.prototype.type = "STYLESHEET";
+	
+		function AtRule(name) {
+			this.name = name;
+			this.prelude = [];
+			this.value = null;
+			return this;
+		}
+		AtRule.prototype = Object.create(CSSParserRule.prototype);
+		AtRule.prototype.type = "AT-RULE";
+		AtRule.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.name = this.name;
+			json.prelude = this.prelude;
+			return json;
+		};
+	
+		function QualifiedRule() {
+			this.prelude = [];
+			this.value = [];
+			return this;
+		}
+		QualifiedRule.prototype = Object.create(CSSParserRule.prototype);
+		QualifiedRule.prototype.type = "QUALIFIED-RULE";
+		QualifiedRule.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.prelude = this.prelude;
+			return json;
+		};
+	
+		function Declaration(name) {
+			this.name = name;
+			this.value = [];
+			this.important = false;
+			return this;
+		}
+		Declaration.prototype = Object.create(CSSParserRule.prototype);
+		Declaration.prototype.type = "DECLARATION";
+		Declaration.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.name = this.name;
+			json.important = this.important;
+			return json;
+		};
+	
+		function SimpleBlock(type) {
+			this.name = type;
+			this.value = [];
+			return this;
+		}
+		SimpleBlock.prototype = Object.create(CSSParserRule.prototype);
+		SimpleBlock.prototype.type = "BLOCK";
+		SimpleBlock.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.name = this.name;
+			return json;
+		};
+	
+		function Func(name) {
+			this.name = name;
+			this.value = [];
+			return this;
+		}
+		Func.prototype = Object.create(CSSParserRule.prototype);
+		Func.prototype.type = "FUNCTION";
+		Func.prototype.toJSON = function () {
+			var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+			json.name = this.name;
+			return json;
+		};
+	
+		function CSSLexer(text) {
+			this.stream = tokenize(text, {
+				loc: true,
+				offsets: true,
+				keepComments: true
+			});
+			this.lineNumber = 0;
+			this.columnNumber = 0;
+			return this;
+		}
+	
+		CSSLexer.prototype.performEOFFixup = function (input, preserveBackslash) {
+			// Just lie for now.
+			return "";
+		};
+	
+		CSSLexer.prototype.nextToken = function () {
+			if (!this.stream) {
+				return null;
+			}
+			var v = this.stream.next();
+			if (v.done || v.value.tokenType === "EOF") {
+				this.stream = null;
+				return null;
+			}
+			this.lineNumber = v.value.loc.start.line;
+			this.columnNumber = v.value.loc.start.column;
+			return v.value;
+		};
+	
+		// Exportation.
+		exports.CSSParserRule = CSSParserRule;
+		exports.Stylesheet = Stylesheet;
+		exports.AtRule = AtRule;
+		exports.QualifiedRule = QualifiedRule;
+		exports.Declaration = Declaration;
+		exports.SimpleBlock = SimpleBlock;
+		exports.Func = Func;
+		exports.parseAStylesheet = parseAStylesheet;
+		exports.parseAListOfRules = parseAListOfRules;
+		exports.parseARule = parseARule;
+		exports.parseADeclaration = parseADeclaration;
+		exports.parseAListOfDeclarations = parseAListOfDeclarations;
+		exports.parseAComponentValue = parseAComponentValue;
+		exports.parseAListOfComponentValues = parseAListOfComponentValues;
+		exports.parseACommaSeparatedListOfComponentValues = parseACommaSeparatedListOfComponentValues;
+		exports.CSSLexer = CSSLexer;
+	});
+
+/***/ },
+/* 64 */
 /***/ function(module, exports) {
 
 	// auto-generated from nsColorNameList.h
 	var cssColors = {
 	  aliceblue: [240, 248, 255],
 	  antiquewhite: [250, 235, 215],
 	  aqua: [0, 255, 255],
 	  aquamarine: [127, 255, 212],
@@ -4464,3348 +7454,1754 @@ var Debugger =
 	  thistle: [216, 191, 216],
 	  tomato: [255, 99, 71],
 	  turquoise: [64, 224, 208],
 	  violet: [238, 130, 238],
 	  wheat: [245, 222, 179],
 	  white: [255, 255, 255],
 	  whitesmoke: [245, 245, 245],
 	  yellow: [255, 255, 0],
-	  yellowgreen: [154, 205, 50],
+	  yellowgreen: [154, 205, 50]
 	};
 	module.exports = { cssColors };
 
-
-/***/ },
-/* 32 */
+/***/ },
+/* 65 */
 /***/ function(module, exports) {
 
 	// auto-generated by means you would rather not know
-	var cssProperties = {
-	  "-moz-appearance": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-small", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window", ],
-	  },
-	  "-moz-outline-radius-topleft": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-outline-radius-topright": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-outline-radius-bottomright": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-outline-radius-bottomleft": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-tab-size": {
-	    inherited: true,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "animation-delay": {
-	    inherited: false,
-	    supports: 64,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "animation-direction": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset", ],
-	  },
-	  "animation-duration": {
-	    inherited: false,
-	    supports: 64,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "animation-fill-mode": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["backwards", "both", "forwards", "inherit", "initial", "none", "unset", ],
-	  },
-	  "animation-iteration-count": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["infinite", "inherit", "initial", "unset", ],
-	  },
-	  "animation-name": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "none", "unset", ],
-	  },
-	  "animation-play-state": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "paused", "running", "unset", ],
-	  },
-	  "animation-timing-function": {
-	    inherited: false,
-	    supports: 256,
-	    values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ],
-	  },
-	  "background-attachment": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["fixed", "inherit", "initial", "local", "scroll", "unset", ],
-	  },
-	  "background-clip": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
-	  },
-	  "background-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "background-image": {
-	    inherited: false,
-	    supports: 648,
-	    values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ],
-	  },
-	  "background-blend-mode": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ],
-	  },
-	  "background-origin": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
-	  },
-	  "background-position": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "background-repeat": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "unset", ],
-	  },
-	  "background-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-binding": {
-	    inherited: false,
-	    supports: 8,
-	    values: ["inherit", "initial", "none", "unset", "url", ],
-	  },
-	  "block-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "border-block-end-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "border-block-end-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-block-end-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-block-start-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "border-block-start-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-block-start-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-bottom-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-border-bottom-colors": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-bottom-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-bottom-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-collapse": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["collapse", "inherit", "initial", "separate", "unset", ],
-	  },
-	  "border-image-source": {
-	    inherited: false,
-	    supports: 648,
-	    values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ],
-	  },
-	  "border-image-slice": {
-	    inherited: false,
-	    supports: 1026,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-image-width": {
-	    inherited: false,
-	    supports: 1027,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-image-outset": {
-	    inherited: false,
-	    supports: 1025,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-image-repeat": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-inline-end-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "border-inline-end-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-inline-end-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-inline-start-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "border-inline-start-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-inline-start-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-left-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-border-left-colors": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-left-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-left-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-right-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-border-right-colors": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-right-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-right-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-spacing": {
-	    inherited: true,
-	    supports: 1,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-top-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-border-top-colors": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-top-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "border-top-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "border-top-left-radius": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-top-right-radius": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-bottom-right-radius": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "border-bottom-left-radius": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "bottom": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "box-decoration-break": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["clone", "inherit", "initial", "slice", "unset", ],
-	  },
-	  "box-shadow": {
-	    inherited: false,
-	    supports: 5,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "box-sizing": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
-	  },
-	  "caption-side": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset", ],
-	  },
-	  "clear": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ],
-	  },
-	  "clip": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "color": {
-	    inherited: true,
-	    supports: 4,
-	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-column-count": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["auto", "inherit", "initial", "unset", ],
-	  },
-	  "-moz-column-fill": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["auto", "balance", "inherit", "initial", "unset", ],
-	  },
-	  "-moz-column-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "-moz-column-gap": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
-	  },
-	  "-moz-column-rule-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
-	  },
-	  "-moz-column-rule-style": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
-	  },
-	  "-moz-column-rule-width": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
-	  },
-	  "contain": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "layout", "none", "paint", "strict", "style", "unset", ],
-	  },
-	  "content": {
-	    inherited: false,
-	    supports: 8,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-control-character-visibility": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["hidden", "inherit", "initial", "unset", "visible", ],
-	  },
-	  "counter-increment": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "counter-reset": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "cursor": {
-	    inherited: true,
-	    supports: 8,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "direction": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "ltr", "rtl", "unset", ],
-	  },
-	  "display": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset", ],
-	  },
-	  "empty-cells": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["hide", "inherit", "initial", "show", "unset", ],
-	  },
-	  "align-content": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "align-items": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "align-self": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "flex-basis": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "flex-direction": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset", ],
-	  },
-	  "flex-grow": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "flex-shrink": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "flex-wrap": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse", ],
-	  },
-	  "order": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "justify-content": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "justify-items": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "justify-self": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "float": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ],
-	  },
-	  "-moz-float-edge": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["content-box", "inherit", "initial", "margin-box", "unset", ],
-	  },
-	  "font-family": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-feature-settings": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-kerning": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["auto", "inherit", "initial", "none", "normal", "unset", ],
-	  },
-	  "font-language-override": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "normal", "unset", ],
-	  },
-	  "font-size": {
-	    inherited: true,
-	    supports: 3,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small", ],
-	  },
-	  "font-size-adjust": {
-	    inherited: true,
-	    supports: 1024,
-	    values: ["inherit", "initial", "none", "unset", ],
-	  },
-	  "font-stretch": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset", ],
-	  },
-	  "font-style": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "italic", "normal", "oblique", "unset", ],
-	  },
-	  "font-synthesis": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-variant-alternates": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-variant-caps": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset", ],
-	  },
-	  "font-variant-east-asian": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-variant-ligatures": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-variant-numeric": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "font-variant-position": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "normal", "sub", "super", "unset", ],
-	  },
-	  "font-weight": {
-	    inherited: true,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-force-broken-image-icon": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-auto-flow": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-auto-columns": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-auto-rows": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-template-areas": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-template-columns": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-template-rows": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-column-start": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-column-end": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-row-start": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-row-end": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "grid-column-gap": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "grid-row-gap": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "height": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "image-orientation": {
-	    inherited: true,
-	    supports: 16,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-image-region": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "ime-mode": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset", ],
-	  },
-	  "inline-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "left": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "letter-spacing": {
-	    inherited: true,
-	    supports: 1,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
-	  },
-	  "line-height": {
-	    inherited: true,
-	    supports: 1027,
-	    values: ["-moz-block-height", "inherit", "initial", "normal", "unset", ],
-	  },
-	  "list-style-image": {
-	    inherited: true,
-	    supports: 8,
-	    values: ["inherit", "initial", "none", "unset", "url", ],
-	  },
-	  "list-style-position": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "inside", "outside", "unset", ],
-	  },
-	  "list-style-type": {
-	    inherited: true,
-	    supports: 0,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "margin-block-end": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-block-start": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-bottom": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-inline-end": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-inline-start": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-left": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-right": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "margin-top": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "marker-offset": {
-	    inherited: false,
-	    supports: 1,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "max-block-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "calc", "inherit", "initial", "none", "unset", ],
-	  },
-	  "max-height": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
-	  },
-	  "max-inline-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
-	  },
-	  "max-width": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
-	  },
-	  "min-height": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "min-block-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "min-inline-size": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "min-width": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "mix-blend-mode": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ],
-	  },
-	  "isolation": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["auto", "inherit", "initial", "isolate", "unset", ],
-	  },
-	  "object-fit": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset", ],
-	  },
-	  "object-position": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "offset-block-end": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "offset-block-start": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "offset-inline-end": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "offset-inline-start": {
-	    inherited: false,
-	    supports: 3,
-	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
-	  },
-	  "opacity": {
-	    inherited: false,
-	    supports: 1024,
-	    values: ["inherit", "initial", "unset", ],
-	  },
-	  "-moz-orient": {
-	    inherited: false,
-	    supports: 0,
-	    values: ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical", ],
-	  },
-	  "outline-color": {
-	    inherited: false,
-	    supports: 4,
-	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen&qu