Bug 1325401 - Start using Reps bundle behind a flag. r=bgrins
☠☠ backed out by f03d25dd8af0 ☠ ☠
authorJason Laster <jason.laster.11@gmail.com>
Wed, 11 Jan 2017 09:21:00 -0500
changeset 374122 8091269b852c0452661da4e34b203d004b3f1781
parent 374121 ca2fd69cb777b9eae0950f997aeb188ebd9c2fd8
child 374123 ddb6c3191d11308531624d0fd4049792b16d730c
push id6996
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 20:48:21 +0000
treeherdermozilla-beta@d89512dab048 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbgrins
bugs1325401
milestone53.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1325401 - Start using Reps bundle behind a flag. r=bgrins
browser/base/content/test/general/browser_parsable_css.js
devtools/client/preferences/devtools.js
devtools/client/shared/components/moz.build
devtools/client/shared/components/reps.css
devtools/client/shared/components/reps.js
devtools/client/webconsole/new-console-output/components/grip-message-body.js
--- a/browser/base/content/test/general/browser_parsable_css.js
+++ b/browser/base/content/test/general/browser_parsable_css.js
@@ -11,16 +11,19 @@
  * failure. */
 let whitelist = [
   // CodeMirror is imported as-is, see bug 1004423.
   {sourceName: /codemirror\.css$/i,
    isFromDevTools: true},
   // The debugger uses cross-browser CSS.
   {sourceName: /devtools\/client\/debugger\/new\/styles.css/i,
    isFromDevTools: true},
+  // reps  uses cross-browser CSS.
+  {sourceName: /devtools\/client\/shared\/components\/reps.css/i,
+   isFromDevTools: true},
   // PDFjs is futureproofing its pseudoselectors, and those rules are dropped.
   {sourceName: /web\/viewer\.css$/i,
    errorMessage: /Unknown pseudo-class.*(fullscreen|selection)/i,
    isFromDevTools: false},
   // PDFjs rules needed for compat with other UAs.
   {sourceName: /web\/viewer\.css$/i,
    errorMessage: /Unknown property.*appearance/i,
    isFromDevTools: false},
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -319,16 +319,19 @@ pref("devtools.webconsole.autoMultiline"
 
 // Enable the experimental webconsole frontend
 #if defined(NIGHTLY_BUILD)
 pref("devtools.webconsole.new-frontend-enabled", true);
 #else
 pref("devtools.webconsole.new-frontend-enabled", false);
 #endif
 
+// Enable loading reps from a bundle
+pref("devtools.webconsole.use-reps-bundle", false);
+
 // Enable the experimental support for source maps in console (work in progress)
 pref("devtools.sourcemap.locations.enabled", false);
 
 // The number of lines that are displayed in the web console.
 pref("devtools.hud.loglimit", 1000);
 
 // The number of lines that are displayed in the web console for the Net,
 // CSS, JS and Web Developer categories. These defaults should be kept in sync
--- a/devtools/client/shared/components/moz.build
+++ b/devtools/client/shared/components/moz.build
@@ -11,16 +11,18 @@ DIRS += [
     'tree'
 ]
 
 DevToolsModules(
     'frame.js',
     'h-split-box.js',
     'notification-box.css',
     'notification-box.js',
+    'reps.css',
+    'reps.js',
     'search-box.js',
     'sidebar-toggle.css',
     'sidebar-toggle.js',
     'stack-trace.js',
     'tree.js',
 )
 
 MOCHITEST_CHROME_MANIFESTS += ['test/mochitest/chrome.ini']
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/reps.css
@@ -0,0 +1,533 @@
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* 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/. */
+
+.theme-dark,
+.theme-light {
+  --number-color: var(--theme-highlight-green);
+  --string-color: var(--theme-highlight-orange);
+  --null-color: var(--theme-comment);
+  --object-color: var(--theme-body-color);
+  --caption-color: var(--theme-highlight-blue);
+  --location-color: var(--theme-content-color1);
+  --source-link-color: var(--theme-highlight-blue);
+  --node-color: var(--theme-highlight-bluegrey);
+  --reference-color: var(--theme-highlight-purple);
+}
+
+.theme-firebug {
+  --number-color: #000088;
+  --string-color: #FF0000;
+  --null-color: #787878;
+  --object-color: DarkGreen;
+  --caption-color: #444444;
+  --location-color: #555555;
+  --source-link-color: blue;
+  --node-color: rgb(0, 0, 136);
+  --reference-color: rgb(102, 102, 255);
+}
+
+/******************************************************************************/
+
+.objectLink:hover {
+  cursor: pointer;
+  text-decoration: underline;
+}
+
+.inline {
+  display: inline;
+  white-space: normal;
+}
+
+.objectBox-object {
+  font-weight: bold;
+  color: var(--object-color);
+  white-space: pre-wrap;
+}
+
+.objectBox-string,
+.objectBox-text,
+.objectLink-textNode,
+.objectBox-table {
+  white-space: pre-wrap;
+}
+
+.objectBox-number,
+.objectLink-styleRule,
+.objectLink-element,
+.objectLink-textNode,
+.objectBox-array > .length {
+  color: var(--number-color);
+}
+
+.objectBox-string {
+  color: var(--string-color);
+}
+
+.objectLink-function,
+.objectBox-stackTrace,
+.objectLink-profile {
+  color: var(--object-color);
+}
+
+.objectLink-Location {
+  font-style: italic;
+  color: var(--location-color);
+}
+
+.objectBox-null,
+.objectBox-undefined,
+.objectBox-hint,
+.logRowHint {
+  font-style: italic;
+  color: var(--null-color);
+}
+
+.objectLink-sourceLink {
+  position: absolute;
+  right: 4px;
+  top: 2px;
+  padding-left: 8px;
+  font-weight: bold;
+  color: var(--source-link-color);
+}
+
+/******************************************************************************/
+
+.objectLink-event,
+.objectLink-eventLog,
+.objectLink-regexp,
+.objectLink-object,
+.objectLink-Date {
+  font-weight: bold;
+  color: var(--object-color);
+  white-space: pre-wrap;
+}
+
+/******************************************************************************/
+
+.objectLink-object .nodeName,
+.objectLink-NamedNodeMap .nodeName,
+.objectLink-NamedNodeMap .objectEqual,
+.objectLink-NamedNodeMap .arrayLeftBracket,
+.objectLink-NamedNodeMap .arrayRightBracket,
+.objectLink-Attr .attrEqual,
+.objectLink-Attr .attrTitle {
+  color: var(--node-color);
+}
+
+.objectLink-object .nodeName {
+  font-weight: normal;
+}
+
+/******************************************************************************/
+
+.objectLeftBrace,
+.objectRightBrace,
+.arrayLeftBracket,
+.arrayRightBracket {
+  cursor: pointer;
+  font-weight: bold;
+}
+
+.objectLeftBrace,
+.arrayLeftBracket {
+  margin-right: 4px;
+}
+
+.objectRightBrace,
+.arrayRightBracket {
+  margin-left: 4px;
+}
+
+/******************************************************************************/
+/* Cycle reference*/
+
+.objectLink-Reference {
+  font-weight: bold;
+  color: var(--reference-color);
+}
+
+.objectBox-array > .objectTitle {
+  font-weight: bold;
+  color: var(--object-color);
+}
+
+.caption {
+  font-weight: bold;
+  color:  var(--caption-color);
+}
+
+/******************************************************************************/
+/* Themes */
+
+.theme-dark .objectBox-null,
+.theme-dark .objectBox-undefined,
+.theme-light .objectBox-null,
+.theme-light .objectBox-undefined {
+  font-style: normal;
+}
+
+.theme-dark .objectBox-object,
+.theme-light .objectBox-object {
+  font-weight: normal;
+  white-space: pre-wrap;
+}
+
+.theme-dark .caption,
+.theme-light .caption {
+  font-weight: normal;
+}
+:root.theme-light,
+:root .theme-light {
+  --theme-search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
+}
+
+* {
+  box-sizing: border-box;
+}
+
+html,
+body {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+}
+
+#mount {
+  display: flex;
+  height: 100%;
+}
+
+::-webkit-scrollbar {
+  width: 8px;
+  height: 8px;
+  background: transparent;
+}
+
+::-webkit-scrollbar-track {
+  border-radius: 8px;
+  background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+  border-radius: 8px;
+  background: rgba(113, 113, 113, 0.5);
+}
+
+:root.theme-dark .CodeMirror-scrollbar-filler {
+  background: transparent;
+}
+.landing-page {
+  flex: 1;
+  display: flex;
+  width: 100vw;
+  height: 100vh;
+  flex-direction: row;
+  align-items: stretch;
+  /* Customs properties */
+  --title-font-size: 24px;
+  --ui-element-font-size: 16px;
+  --primary-line-height: 30px;
+  --secondary-line-height: 25px;
+  --base-spacing: 20px;
+  --base-transition: all 0.25s ease;
+}
+
+.landing-page .sidebar {
+  display: flex;
+  background-color: var(--theme-tab-toolbar-background);
+  width: 200px;
+  flex-direction: column;
+  border-right: 1px solid var(--theme-splitter-color);
+}
+
+.landing-page .sidebar h1 {
+  color: var(--theme-body-color);
+  font-size: var(--title-font-size);
+  margin: 0;
+  line-height: var(--primary-line-height);
+  font-weight: normal;
+  padding: calc(2 * var(--base-spacing)) var(--base-spacing);
+}
+
+.landing-page .sidebar ul {
+  list-style: none;
+  padding: 0;
+  line-height: var(--primary-line-height);
+  font-size: var(--ui-element-font-size);
+}
+
+.landing-page .sidebar li {
+  padding: calc(var(--base-spacing) / 4) var(--base-spacing);
+}
+
+.landing-page .sidebar li a {
+  color: var(--theme-body-color);
+}
+
+.landing-page .sidebar li.selected {
+  background: var(--theme-highlight-bluegrey);
+  color: var(--theme-selection-color);
+  transition: var(--base-transition);
+}
+
+.landing-page .sidebar li.selected a {
+  color: inherit;
+}
+
+.landing-page .sidebar li:hover,
+.landing-page .sidebar li:focus {
+  background: var(--theme-selection-background);
+  color: var(--theme-selection-color);
+  cursor: pointer;
+}
+
+.landing-page .sidebar li:hover a,
+.landing-page .sidebar li:focus a {
+  color: inherit;
+}
+
+.landing-page .panel {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.landing-page .panel header {
+  display: flex;
+  align-items: baseline;
+  margin: calc(2 * var(--base-spacing)) 0 0;
+  padding-bottom: var(--base-spacing);
+}
+
+.landing-page .panel header input {
+  flex: 1;
+  color: var(--theme-body-color);
+  font-size: var(--ui-element-font-size);
+  border: 1px solid var(--theme-splitter-color);
+  padding: calc(var(--base-spacing) / 2);
+  margin: 0 var(--base-spacing);
+  transition: var(--base-transition);
+}
+
+.landing-page .panel header input:focus {
+  border: 1px solid var(--theme-selection-background);
+}
+
+.landing-page .panel .center-message {
+  font-size: var(--ui-element-font-size);
+  line-height: var(--secondary-line-height);
+  padding: calc(var(--base-spacing) / 2);
+}
+
+.landing-page .center a {
+  color: var(--theme-highlight-bluegrey);
+  text-decoration: none;
+}
+
+.landing-page .tab-group {
+  flex: 1;
+  overflow-y: auto;
+}
+
+.landing-page .tab-list {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+
+.landing-page .tab {
+  border-bottom: 1px solid var(--theme-splitter-color);
+  padding: calc(var(--base-spacing) / 2) var(--base-spacing);
+  font-family: sans-serif;
+}
+
+.landing-page .tab-title {
+  line-height: var(--secondary-line-height);
+  font-size: var(--ui-element-font-size);
+  color: var(--theme-highlight-bluegrey);
+  word-break: break-all;
+}
+
+.landing-page .tab-url {
+  color: var(--theme-comment);
+  word-break: break-all;
+}
+
+.landing-page .tab:focus,
+.landing-page .tab.active {
+  background: var(--theme-selection-background);
+  color: var(--theme-selection-color);
+  cursor: pointer;
+  transition: var(--base-transition);
+}
+
+.landing-page .tab:focus .tab-title,
+.landing-page .tab.active .tab-title {
+  color: inherit;
+}
+
+.landing-page .tab:focus .tab-url,
+.landing-page .tab.active .tab-url {
+  color: var(--theme-highlight-gray);
+}
+
+.landing-page .panel .footer-note {
+  padding: var(--base-spacing) 0;
+  text-align: center;
+  font-size: 14px;
+  color: var(--theme-comment);
+}
+.quick-links {
+  display: flex;
+  justify-content: center;
+  flex-wrap: wrap;
+  background: rgba(255,255,255,0.25);
+  padding: 0.5rem 1rem;
+}
+
+.quick-links button {
+  font-size: 1.2rem;
+  background: none;
+  border: none;
+  color: white;
+  margin: 0.5rem 0.25rem;
+  cursor: pointer;
+}
+.console-header {
+  background: var(--theme-highlight-pink);
+  color: white;
+  margin: 0;
+}
+
+.console-header form {
+  display: flex;
+  padding: 1rem;
+}
+
+.console-header h1 {
+  font-size: 14px;
+  font-weight: 100;
+  color: white;
+}
+
+.console-header input {
+  background-color: var(--theme-highlight-pink);
+  flex: 1;
+  border: 1px solid white;
+  color: white;
+  font-size: 1.25rem;
+  padding: 0.25rem;
+  line-height: 2rem;
+  padding-left: 1rem;
+  margin: 0 1rem;
+}
+
+.console-header ::-webkit-input-placeholder {
+  color: white;
+  font-size: 1rem;
+  line-height: 2rem;
+  margin: 0;
+}
+
+.console-header .clear-button {
+  background: rgba(255,255,255,0.25);
+  border: 1px solid rgba(255,255,255,0.25);
+  color: white;
+  font-size: 1.2rem;
+}
+main {
+  --default-border: 1px solid var(--theme-splitter-color);
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.expressions {
+  padding: 2em 1em;
+  flex: 1;
+  overflow-y: auto;
+}
+
+.rep-row {
+  border: var(--default-border);
+  margin-bottom: 1em;
+}
+
+.rep-input {
+  font-family: monospace;
+  background-color: var(--theme-toolbar-background-alt);
+  color: var(--theme-body-color);
+  padding: 0.5rem;
+}
+
+.rep-input:before {
+  content: "\279C   ";
+}
+
+.reps {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 1rem;
+  margin-bottom: 0.5rem;
+}
+
+.rep-element + .rep-element {
+  margin-left: 0.5rem;
+}
+
+.rep-element::before {
+  content: attr(data-mode) ":";
+  background-color: var(--theme-toolbar-background);;
+  font-family: monospace;
+  display: inline-block;
+  font-size: 0.75rem;
+  padding: 0.1rem 0.25rem;
+  margin-right: 0.25rem;
+  border-radius: 0.25rem;
+}
+
+.packet header {
+  display: flex;
+  background-color: var(--theme-toolbar-background-alt);
+  border-top: var(--default-border);
+  color: var(--theme-body-color);
+  padding: 0.5rem;
+}
+
+.packet header::before {
+  display: inline-block;
+  padding-right: 0.5rem;
+}
+
+.packet header.packet-expanded::before {
+  content: "\2212";
+}
+
+.packet header.packet-collapsed::before {
+  content: "+";
+}
+
+.copy-packet-button {
+  margin-left: auto;
+  margin-right: 0.5rem;
+}
+
+.packet .packet-rep {
+  padding: 1rem;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+html, body {
+  margin: 0;
+  padding: 0;
+}
+
+/*# sourceMappingURL=bundle.css.map*/
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/reps.js
@@ -0,0 +1,35193 @@
+module.exports =
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// SingleModulePlugin
+/******/ 		const smpCache = this.smpCache = this.smpCache || {};
+/******/ 		const smpMap = this.smpMap = this.smpMap || new Map();
+/******/ 		function sanitizeString(text) {
+/******/ 		   return text.replace(/__webpack_require__\(\d+\)/g,"");
+/******/ 		}
+/******/ 		function getModuleBody(id) {
+/******/ 		  if (smpCache.hasOwnProperty(id)) {
+/******/ 		    return smpCache[id];
+/******/ 		  }
+/******/
+/******/ 		  const body = sanitizeString(String(modules[id]));
+/******/ 		  smpCache[id] = body;
+/******/ 		  return body;
+/******/ 		}
+/******/ 		if (!installedModules[moduleId]) {
+/******/ 			const body = getModuleBody(moduleId);
+/******/ 			if (smpMap.has(body)) {
+/******/ 				installedModules[moduleId] = installedModules[smpMap.get(body)];
+/******/ 			}
+/******/ 			else {
+/******/ 				smpMap.set(body, moduleId)
+/******/ 			}
+/******/ 		}
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+/******/
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "/assets/build";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+	module.exports = __webpack_require__(1);
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// require("./webconsole.css")
+	__webpack_require__(2);
+
+	const React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const { createFactory } = React;
+
+	const { bootstrap, L10N } = __webpack_require__(9);
+	const { isFirefoxPanel } = __webpack_require__(102);
+
+	if (!isFirefoxPanel()) {
+	  const { Provider } = __webpack_require__(29);
+
+	  const RepsConsole = createFactory(__webpack_require__(255));
+	  const { configureStore } = __webpack_require__(306);
+
+	  __webpack_require__(311);
+	  L10N.setBundle(__webpack_require__(313));
+	  window.l10n = L10N;
+
+	  function onConnect({ client } = {}) {
+	    if (!client) {
+	      return;
+	    }
+
+	    let store = configureStore({
+	      makeThunkArgs: (args, state) => {
+	        return Object.assign({}, args, { client });
+	      }
+	    });
+
+	    ReactDOM.render(React.createElement(Provider, { store }, RepsConsole({ client })), root);
+	  }
+
+	  let root = document.createElement("div");
+	  root.innerText = "Waiting for connection";
+
+	  bootstrap(React, ReactDOM, root).then(onConnect, e => console.error("An error occured during the connection", e)).catch(e => console.error("An error occured in the onConnect function", e));
+	} else {
+	  const { MODE } = __webpack_require__(266);
+	  const Rep = createFactory(__webpack_require__(267));
+	  const Grip = __webpack_require__(278);
+	  const repUtils = __webpack_require__(305);
+
+	  module.exports = {
+	    Rep,
+	    Grip,
+	    repUtils,
+	    MODE
+	  };
+	}
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+	// removed by extract-text-webpack-plugin
+
+/***/ },
+/* 3 */,
+/* 4 */,
+/* 5 */,
+/* 6 */
+/***/ function(module, exports) {
+
+	module.exports = require("devtools/client/shared/vendor/react");
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	module.exports = __webpack_require__(8);
+
+
+/***/ },
+/* 8 */
+/***/ function(module, exports) {
+
+	module.exports = require("devtools/client/shared/vendor/react-dom");
+
+/***/ },
+/* 9 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* global window, document, DebuggerConfig */
+
+	const { bindActionCreators, combineReducers } = __webpack_require__(10);
+	const { Provider } = __webpack_require__(29);
+
+	const { DevToolsUtils, AppConstants } = __webpack_require__(38);
+	const { debugGlobal } = __webpack_require__(101);
+	const { setConfig, isEnabled, getValue, isDevelopment } = __webpack_require__(102);
+	const L10N = __webpack_require__(150);
+
+	setConfig(({"title":"Reps","hotReloading":true,"environment":"development","theme":"light","firefox":{"proxyHost":"localhost:9000","webSocketConnection":false,"websocketHost":"localhost:6080","mcPath":"./firefox"},"development":{"serverPort":8000}}));
+
+	// Set various flags before requiring app code.
+	if (isEnabled("logging.client")) {
+	  DevToolsUtils.dumpn.wantLogging = true;
+	}
+
+	const { getClient, firefox, chrome, startDebugging } = __webpack_require__(151);
+	const Root = __webpack_require__(220);
+
+	// 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) {
+	  const 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 }`);
+	}
+
+	function initApp() {
+	  const configureStore = __webpack_require__(224);
+	  const reducers = __webpack_require__(235);
+	  const LaunchpadApp = __webpack_require__(240);
+
+	  const createStore = configureStore({
+	    log: getValue("logging.actions"),
+	    makeThunkArgs: (args, state) => {
+	      return Object.assign({}, args, { client: getClient(state) });
+	    }
+	  });
+
+	  const store = createStore(combineReducers(reducers));
+	  const actions = bindActionCreators(__webpack_require__(253), store.dispatch);
+
+	  debugGlobal("launchpadStore", store);
+
+	  if (isDevelopment()) {
+	    AppConstants.DEBUG_JS_MODULES = true;
+	  }
+
+	  return { store, actions, LaunchpadApp };
+	}
+
+	function renderRoot(_React, _ReactDOM, component, _store) {
+	  const { createElement } = _React;
+	  const mount = document.querySelector("#mount");
+
+	  // bail in test environments that do not have a mount
+	  if (!mount) {
+	    return;
+	  }
+
+	  const root = Root();
+	  mount.appendChild(root);
+
+	  if (component.props || component.propTypes) {
+	    _ReactDOM.render(createElement(Provider, { store: _store }, createElement(component)), root);
+	  } else {
+	    root.appendChild(component);
+	  }
+	}
+
+	function getTargetFromQuery() {
+	  const href = window.location.href;
+	  const nodeMatch = href.match(/node-tab=([^&#]*)/);
+	  const firefoxMatch = href.match(/firefox-tab=([^&#]*)/);
+	  const 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) {
+	  const connTarget = getTargetFromQuery();
+	  if (connTarget) {
+	    return startDebugging(connTarget, appActions).then(({ tab, client }) => {
+	      debugGlobal("client", client.clientCommands);
+	      renderRoot(React, ReactDOM, App, appStore);
+	      return { tab, connTarget, client };
+	    });
+	  }
+
+	  const { store, actions, LaunchpadApp } = initApp();
+	  renderRoot(React, ReactDOM, LaunchpadApp, store);
+	  chrome.connectClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  }).catch(e => {
+	    console.log("Connect to chrome:");
+	    console.log("https://github.com/devtools-html/debugger.html/blob/master/CONTRIBUTING.md#chrome");
+	  });
+
+	  chrome.connectNodeClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  });
+
+	  return firefox.connectClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  });
+	}
+
+	module.exports = {
+	  bootstrap,
+	  renderRoot,
+	  debugGlobal,
+	  L10N
+	};
+
+/***/ },
+/* 10 */
+/***/ 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__(11);
+
+	var _createStore2 = _interopRequireDefault(_createStore);
+
+	var _combineReducers = __webpack_require__(24);
+
+	var _combineReducers2 = _interopRequireDefault(_combineReducers);
+
+	var _bindActionCreators = __webpack_require__(26);
+
+	var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);
+
+	var _applyMiddleware = __webpack_require__(27);
+
+	var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);
+
+	var _compose = __webpack_require__(28);
+
+	var _compose2 = _interopRequireDefault(_compose);
+
+	var _warning = __webpack_require__(25);
+
+	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.
+	*/
+	function isCrushed() {}
+
+	if (false) {
+	  (0, _warning2["default"])('You are currently using minified code outside of NODE_ENV === \'production\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');
+	}
+
+	exports.createStore = _createStore2["default"];
+	exports.combineReducers = _combineReducers2["default"];
+	exports.bindActionCreators = _bindActionCreators2["default"];
+	exports.applyMiddleware = _applyMiddleware2["default"];
+	exports.compose = _compose2["default"];
+
+/***/ },
+/* 11 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports.ActionTypes = undefined;
+	exports["default"] = createStore;
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _symbolObservable = __webpack_require__(22);
+
+	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.
+	 * If the current state is undefined, you must return the initial state.
+	 * Do not reference these action types directly in your code.
+	 */
+	var ActionTypes = exports.ActionTypes = {
+	  INIT: '@@redux/INIT'
+	};
+
+	/**
+	 * Creates a Redux store that holds the state tree.
+	 * The only way to change the data in the store is to call `dispatch()` on it.
+	 *
+	 * There should only be a single store in your app. To specify how different
+	 * parts of the state tree respond to actions, you may combine several reducers
+	 * into a single reducer function by using `combineReducers`.
+	 *
+	 * @param {Function} reducer A function that returns the next state tree, given
+	 * the current state tree and the action to handle.
+	 *
+	 * @param {any} [initialState] The initial state. You may optionally specify it
+	 * to hydrate the state from the server in universal apps, or to restore a
+	 * previously serialized user session.
+	 * If you use `combineReducers` to produce the root reducer function, this must be
+	 * an object with the same shape as `combineReducers` keys.
+	 *
+	 * @param {Function} enhancer The store enhancer. You may optionally specify it
+	 * to enhance the store with third-party capabilities such as middleware,
+	 * time travel, persistence, etc. The only store enhancer that ships with Redux
+	 * is `applyMiddleware()`.
+	 *
+	 * @returns {Store} A Redux store that lets you read the state, dispatch actions
+	 * and subscribe to changes.
+	 */
+	function createStore(reducer, initialState, enhancer) {
+	  var _ref2;
+
+	  if (typeof initialState === 'function' && typeof enhancer === 'undefined') {
+	    enhancer = initialState;
+	    initialState = undefined;
+	  }
+
+	  if (typeof enhancer !== 'undefined') {
+	    if (typeof enhancer !== 'function') {
+	      throw new Error('Expected the enhancer to be a function.');
+	    }
+
+	    return enhancer(createStore)(reducer, initialState);
+	  }
+
+	  if (typeof reducer !== 'function') {
+	    throw new Error('Expected the reducer to be a function.');
+	  }
+
+	  var currentReducer = reducer;
+	  var currentState = initialState;
+	  var currentListeners = [];
+	  var nextListeners = currentListeners;
+	  var isDispatching = false;
+
+	  function ensureCanMutateNextListeners() {
+	    if (nextListeners === currentListeners) {
+	      nextListeners = currentListeners.slice();
+	    }
+	  }
+
+	  /**
+	   * Reads the state tree managed by the store.
+	   *
+	   * @returns {any} The current state tree of your application.
+	   */
+	  function getState() {
+	    return currentState;
+	  }
+
+	  /**
+	   * Adds a change listener. It will be called any time an action is dispatched,
+	   * and some part of the state tree may potentially have changed. You may then
+	   * call `getState()` to read the current state tree inside the callback.
+	   *
+	   * You may call `dispatch()` from a change listener, with the following
+	   * caveats:
+	   *
+	   * 1. The subscriptions are snapshotted just before every `dispatch()` call.
+	   * If you subscribe or unsubscribe while the listeners are being invoked, this
+	   * will not have any effect on the `dispatch()` that is currently in progress.
+	   * However, the next `dispatch()` call, whether nested or not, will use a more
+	   * recent snapshot of the subscription list.
+	   *
+	   * 2. The listener should not expect to see all state changes, as the state
+	   * might have been updated multiple times during a nested `dispatch()` before
+	   * the listener is called. It is, however, guaranteed that all subscribers
+	   * registered before the `dispatch()` started will be called with the latest
+	   * state by the time it exits.
+	   *
+	   * @param {Function} listener A callback to be invoked on every dispatch.
+	   * @returns {Function} A function to remove this change listener.
+	   */
+	  function subscribe(listener) {
+	    if (typeof listener !== 'function') {
+	      throw new Error('Expected listener to be a function.');
+	    }
+
+	    var isSubscribed = true;
+
+	    ensureCanMutateNextListeners();
+	    nextListeners.push(listener);
+
+	    return function unsubscribe() {
+	      if (!isSubscribed) {
+	        return;
+	      }
+
+	      isSubscribed = false;
+
+	      ensureCanMutateNextListeners();
+	      var index = nextListeners.indexOf(listener);
+	      nextListeners.splice(index, 1);
+	    };
+	  }
+
+	  /**
+	   * Dispatches an action. It is the only way to trigger a state change.
+	   *
+	   * The `reducer` function, used to create the store, will be called with the
+	   * current state tree and the given `action`. Its return value will
+	   * be considered the **next** state of the tree, and the change listeners
+	   * will be notified.
+	   *
+	   * The base implementation only supports plain object actions. If you want to
+	   * dispatch a Promise, an Observable, a thunk, or something else, you need to
+	   * wrap your store creating function into the corresponding middleware. For
+	   * example, see the documentation for the `redux-thunk` package. Even the
+	   * middleware will eventually dispatch plain object actions using this method.
+	   *
+	   * @param {Object} action A plain object representing “what changed”. It is
+	   * a good idea to keep actions serializable so you can record and replay user
+	   * sessions, or use the time travelling `redux-devtools`. An action must have
+	   * a `type` property which may not be `undefined`. It is a good idea to use
+	   * string constants for action types.
+	   *
+	   * @returns {Object} For convenience, the same action object you dispatched.
+	   *
+	   * Note that, if you use a custom middleware, it may wrap `dispatch()` to
+	   * return something else (for example, a Promise you can await).
+	   */
+	  function dispatch(action) {
+	    if (!(0, _isPlainObject2["default"])(action)) {
+	      throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
+	    }
+
+	    if (typeof action.type === 'undefined') {
+	      throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
+	    }
+
+	    if (isDispatching) {
+	      throw new Error('Reducers may not dispatch actions.');
+	    }
+
+	    try {
+	      isDispatching = true;
+	      currentState = currentReducer(currentState, action);
+	    } finally {
+	      isDispatching = false;
+	    }
+
+	    var listeners = currentListeners = nextListeners;
+	    for (var i = 0; i < listeners.length; i++) {
+	      listeners[i]();
+	    }
+
+	    return action;
+	  }
+
+	  /**
+	   * Replaces the reducer currently used by the store to calculate the state.
+	   *
+	   * You might need this if your app implements code splitting and you want to
+	   * load some of the reducers dynamically. You might also need this if you
+	   * implement a hot reloading mechanism for Redux.
+	   *
+	   * @param {Function} nextReducer The reducer for the store to use instead.
+	   * @returns {void}
+	   */
+	  function replaceReducer(nextReducer) {
+	    if (typeof nextReducer !== 'function') {
+	      throw new Error('Expected the nextReducer to be a function.');
+	    }
+
+	    currentReducer = nextReducer;
+	    dispatch({ type: ActionTypes.INIT });
+	  }
+
+	  /**
+	   * Interoperability point for observable/reactive libraries.
+	   * @returns {observable} A minimal observable of state changes.
+	   * For more information, see the observable proposal:
+	   * https://github.com/zenparsing/es-observable
+	   */
+	  function observable() {
+	    var _ref;
+
+	    var outerSubscribe = subscribe;
+	    return _ref = {
+	      /**
+	       * The minimal observable subscription method.
+	       * @param {Object} observer Any object that can be used as an observer.
+	       * The observer object should have a `next` method.
+	       * @returns {subscription} An object with an `unsubscribe` method that can
+	       * be used to unsubscribe the observable from the store, and prevent further
+	       * emission of values from the observable.
+	       */
+
+	      subscribe: function subscribe(observer) {
+	        if (typeof observer !== 'object') {
+	          throw new TypeError('Expected the observer to be an object.');
+	        }
+
+	        function observeState() {
+	          if (observer.next) {
+	            observer.next(getState());
+	          }
+	        }
+
+	        observeState();
+	        var unsubscribe = outerSubscribe(observeState);
+	        return { unsubscribe: unsubscribe };
+	      }
+	    }, _ref[_symbolObservable2["default"]] = function () {
+	      return this;
+	    }, _ref;
+	  }
+
+	  // When a store is created, an "INIT" action is dispatched so that every
+	  // reducer returns their initial state. This effectively populates
+	  // the initial state tree.
+	  dispatch({ type: ActionTypes.INIT });
+
+	  return _ref2 = {
+	    dispatch: dispatch,
+	    subscribe: subscribe,
+	    getState: getState,
+	    replaceReducer: replaceReducer
+	  }, _ref2[_symbolObservable2["default"]] = observable, _ref2;
+	}
+
+/***/ },
+/* 12 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var baseGetTag = __webpack_require__(13),
+	    getPrototype = __webpack_require__(19),
+	    isObjectLike = __webpack_require__(21);
+
+	/** `Object#toString` result references. */
+	var objectTag = '[object Object]';
+
+	/** Used for built-in method references. */
+	var funcProto = Function.prototype,
+	    objectProto = Object.prototype;
+
+	/** Used to resolve the decompiled source of functions. */
+	var funcToString = funcProto.toString;
+
+	/** Used to check objects for own properties. */
+	var hasOwnProperty = objectProto.hasOwnProperty;
+
+	/** Used to infer the `Object` constructor. */
+	var objectCtorString = funcToString.call(Object);
+
+	/**
+	 * Checks if `value` is a plain object, that is, an object created by the
+	 * `Object` constructor or one with a `[[Prototype]]` of `null`.
+	 *
+	 * @static
+	 * @memberOf _
+	 * @since 0.8.0
+	 * @category Lang
+	 * @param {*} value The value to check.
+	 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+	 * @example
+	 *
+	 * function Foo() {
+	 *   this.a = 1;
+	 * }
+	 *
+	 * _.isPlainObject(new Foo);
+	 * // => false
+	 *
+	 * _.isPlainObject([1, 2, 3]);
+	 * // => false
+	 *
+	 * _.isPlainObject({ 'x': 0, 'y': 0 });
+	 * // => true
+	 *
+	 * _.isPlainObject(Object.create(null));
+	 * // => true
+	 */
+	function isPlainObject(value) {
+	  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+	    return false;
+	  }
+	  var proto = getPrototype(value);
+	  if (proto === null) {
+	    return true;
+	  }
+	  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+	  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+	    funcToString.call(Ctor) == objectCtorString;
+	}
+
+	module.exports = isPlainObject;
+
+
+/***/ },
+/* 13 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var Symbol = __webpack_require__(14),
+	    getRawTag = __webpack_require__(17),
+	    objectToString = __webpack_require__(18);
+
+	/** `Object#toString` result references. */
+	var nullTag = '[object Null]',
+	    undefinedTag = '[object Undefined]';
+
+	/** Built-in value references. */
+	var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+	/**
+	 * The base implementation of `getTag` without fallbacks for buggy environments.
+	 *
+	 * @private
+	 * @param {*} value The value to query.
+	 * @returns {string} Returns the `toStringTag`.
+	 */
+	function baseGetTag(value) {
+	  if (value == null) {
+	    return value === undefined ? undefinedTag : nullTag;
+	  }
+	  value = Object(value);
+	  return (symToStringTag && symToStringTag in value)
+	    ? getRawTag(value)
+	    : objectToString(value);
+	}
+
+	module.exports = baseGetTag;
+
+
+/***/ },
+/* 14 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var root = __webpack_require__(15);
+
+	/** Built-in value references. */
+	var Symbol = root.Symbol;
+
+	module.exports = Symbol;
+
+
+/***/ },
+/* 15 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var freeGlobal = __webpack_require__(16);
+
+	/** Detect free variable `self`. */
+	var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+	/** Used as a reference to the global object. */
+	var root = freeGlobal || freeSelf || Function('return this')();
+
+	module.exports = root;
+
+
+/***/ },
+/* 16 */
+/***/ function(module, exports) {
+
+	/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
+	var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+	module.exports = freeGlobal;
+
+	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
+
+/***/ },
+/* 17 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var Symbol = __webpack_require__(14);
+
+	/** Used for built-in method references. */
+	var objectProto = Object.prototype;
+
+	/** Used to check objects for own properties. */
+	var hasOwnProperty = objectProto.hasOwnProperty;
+
+	/**
+	 * Used to resolve the
+	 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+	 * of values.
+	 */
+	var nativeObjectToString = objectProto.toString;
+
+	/** Built-in value references. */
+	var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+	/**
+	 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+	 *
+	 * @private
+	 * @param {*} value The value to query.
+	 * @returns {string} Returns the raw `toStringTag`.
+	 */
+	function getRawTag(value) {
+	  var isOwn = hasOwnProperty.call(value, symToStringTag),
+	      tag = value[symToStringTag];
+
+	  try {
+	    value[symToStringTag] = undefined;
+	    var unmasked = true;
+	  } catch (e) {}
+
+	  var result = nativeObjectToString.call(value);
+	  if (unmasked) {
+	    if (isOwn) {
+	      value[symToStringTag] = tag;
+	    } else {
+	      delete value[symToStringTag];
+	    }
+	  }
+	  return result;
+	}
+
+	module.exports = getRawTag;
+
+
+/***/ },
+/* 18 */
+/***/ function(module, exports) {
+
+	/** Used for built-in method references. */
+	var objectProto = Object.prototype;
+
+	/**
+	 * Used to resolve the
+	 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+	 * of values.
+	 */
+	var nativeObjectToString = objectProto.toString;
+
+	/**
+	 * Converts `value` to a string using `Object.prototype.toString`.
+	 *
+	 * @private
+	 * @param {*} value The value to convert.
+	 * @returns {string} Returns the converted string.
+	 */
+	function objectToString(value) {
+	  return nativeObjectToString.call(value);
+	}
+
+	module.exports = objectToString;
+
+
+/***/ },
+/* 19 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var overArg = __webpack_require__(20);
+
+	/** Built-in value references. */
+	var getPrototype = overArg(Object.getPrototypeOf, Object);
+
+	module.exports = getPrototype;
+
+
+/***/ },
+/* 20 */
+/***/ 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.
+	 * @returns {Function} Returns the new function.
+	 */
+	function overArg(func, transform) {
+	  return function(arg) {
+	    return func(transform(arg));
+	  };
+	}
+
+	module.exports = overArg;
+
+
+/***/ },
+/* 21 */
+/***/ 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 _
+	 * @since 4.0.0
+	 * @category Lang
+	 * @param {*} value The value to check.
+	 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+	 * @example
+	 *
+	 * _.isObjectLike({});
+	 * // => true
+	 *
+	 * _.isObjectLike([1, 2, 3]);
+	 * // => true
+	 *
+	 * _.isObjectLike(_.noop);
+	 * // => false
+	 *
+	 * _.isObjectLike(null);
+	 * // => false
+	 */
+	function isObjectLike(value) {
+	  return value != null && typeof value == 'object';
+	}
+
+	module.exports = isObjectLike;
+
+
+/***/ },
+/* 22 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* WEBPACK VAR INJECTION */(function(global) {/* global window */
+	'use strict';
+
+	module.exports = __webpack_require__(23)(global || window || this);
+
+	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
+
+/***/ },
+/* 23 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	module.exports = function symbolObservablePonyfill(root) {
+		var result;
+		var Symbol = root.Symbol;
+
+		if (typeof Symbol === 'function') {
+			if (Symbol.observable) {
+				result = Symbol.observable;
+			} else {
+				result = Symbol('observable');
+				Symbol.observable = result;
+			}
+		} else {
+			result = '@@observable';
+		}
+
+		return result;
+	};
+
+
+/***/ },
+/* 24 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = combineReducers;
+
+	var _createStore = __webpack_require__(11);
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _warning = __webpack_require__(25);
+
+	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';
+
+	  return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state.';
+	}
+
+	function getUnexpectedStateShapeWarningMessage(inputState, reducers, action) {
+	  var reducerKeys = Object.keys(reducers);
+	  var argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'initialState argument passed to createStore' : 'previous state received by the reducer';
+
+	  if (reducerKeys.length === 0) {
+	    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';
+	  }
+
+	  if (!(0, _isPlainObject2["default"])(inputState)) {
+	    return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"');
+	  }
+
+	  var unexpectedKeys = Object.keys(inputState).filter(function (key) {
+	    return !reducers.hasOwnProperty(key);
+	  });
+
+	  if (unexpectedKeys.length > 0) {
+	    return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.');
+	  }
+	}
+
+	function assertReducerSanity(reducers) {
+	  Object.keys(reducers).forEach(function (key) {
+	    var reducer = reducers[key];
+	    var initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT });
+
+	    if (typeof initialState === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.');
+	    }
+
+	    var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');
+	    if (typeof reducer(undefined, { type: type }) === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.');
+	    }
+	  });
+	}
+
+	/**
+	 * Turns an object whose values are different reducer functions, into a single
+	 * reducer function. It will call every child reducer, and gather their results
+	 * into a single state object, whose keys correspond to the keys of the passed
+	 * reducer functions.
+	 *
+	 * @param {Object} reducers An object whose values correspond to different
+	 * reducer functions that need to be combined into one. One handy way to obtain
+	 * it is to use ES6 `import * as reducers` syntax. The reducers may never return
+	 * undefined for any action. Instead, they should return their initial state
+	 * if the state passed to them was undefined, and the current state for any
+	 * unrecognized action.
+	 *
+	 * @returns {Function} A reducer function that invokes every reducer inside the
+	 * passed object, and builds a state object with the same shape.
+	 */
+	function combineReducers(reducers) {
+	  var reducerKeys = Object.keys(reducers);
+	  var finalReducers = {};
+	  for (var i = 0; i < reducerKeys.length; i++) {
+	    var key = reducerKeys[i];
+	    if (typeof reducers[key] === 'function') {
+	      finalReducers[key] = reducers[key];
+	    }
+	  }
+	  var finalReducerKeys = Object.keys(finalReducers);
+
+	  var sanityError;
+	  try {
+	    assertReducerSanity(finalReducers);
+	  } catch (e) {
+	    sanityError = e;
+	  }
+
+	  return function combination() {
+	    var state = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
+	    var action = arguments[1];
+
+	    if (sanityError) {
+	      throw sanityError;
+	    }
+
+	    if (false) {
+	      var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action);
+	      if (warningMessage) {
+	        (0, _warning2["default"])(warningMessage);
+	      }
+	    }
+
+	    var hasChanged = false;
+	    var nextState = {};
+	    for (var i = 0; i < finalReducerKeys.length; i++) {
+	      var key = finalReducerKeys[i];
+	      var reducer = finalReducers[key];
+	      var previousStateForKey = state[key];
+	      var nextStateForKey = reducer(previousStateForKey, action);
+	      if (typeof nextStateForKey === 'undefined') {
+	        var errorMessage = getUndefinedStateErrorMessage(key, action);
+	        throw new Error(errorMessage);
+	      }
+	      nextState[key] = nextStateForKey;
+	      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
+	    }
+	    return hasChanged ? nextState : state;
+	  };
+	}
+
+/***/ },
+/* 25 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = warning;
+	/**
+	 * Prints a warning in the console if it exists.
+	 *
+	 * @param {String} message The warning message.
+	 * @returns {void}
+	 */
+	function warning(message) {
+	  /* eslint-disable no-console */
+	  if (typeof console !== 'undefined' && typeof console.error === 'function') {
+	    console.error(message);
+	  }
+	  /* eslint-enable no-console */
+	  try {
+	    // This error was thrown as a convenience so that if you enable
+	    // "break on all exceptions" in your console,
+	    // it would pause the execution at this line.
+	    throw new Error(message);
+	    /* eslint-disable no-empty */
+	  } catch (e) {}
+	  /* eslint-enable no-empty */
+	}
+
+/***/ },
+/* 26 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = bindActionCreators;
+	function bindActionCreator(actionCreator, dispatch) {
+	  return function () {
+	    return dispatch(actionCreator.apply(undefined, arguments));
+	  };
+	}
+
+	/**
+	 * Turns an object whose values are action creators, into an object with the
+	 * same keys, but with every function wrapped into a `dispatch` call so they
+	 * may be invoked directly. This is just a convenience method, as you can call
+	 * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
+	 *
+	 * For convenience, you can also pass a single function as the first argument,
+	 * and get a function in return.
+	 *
+	 * @param {Function|Object} actionCreators An object whose values are action
+	 * creator functions. One handy way to obtain it is to use ES6 `import * as`
+	 * syntax. You may also pass a single function.
+	 *
+	 * @param {Function} dispatch The `dispatch` function available on your Redux
+	 * store.
+	 *
+	 * @returns {Function|Object} The object mimicking the original object, but with
+	 * every action creator wrapped into the `dispatch` call. If you passed a
+	 * function as `actionCreators`, the return value will also be a single
+	 * function.
+	 */
+	function bindActionCreators(actionCreators, dispatch) {
+	  if (typeof actionCreators === 'function') {
+	    return bindActionCreator(actionCreators, dispatch);
+	  }
+
+	  if (typeof actionCreators !== 'object' || actionCreators === null) {
+	    throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');
+	  }
+
+	  var keys = Object.keys(actionCreators);
+	  var boundActionCreators = {};
+	  for (var i = 0; i < keys.length; i++) {
+	    var key = keys[i];
+	    var actionCreator = actionCreators[key];
+	    if (typeof actionCreator === 'function') {
+	      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
+	    }
+	  }
+	  return boundActionCreators;
+	}
+
+/***/ },
+/* 27 */
+/***/ 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__(28);
+
+	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
+	 * asynchronous actions in a concise manner, or logging every action payload.
+	 *
+	 * See `redux-thunk` package as an example of the Redux middleware.
+	 *
+	 * Because middleware is potentially asynchronous, this should be the first
+	 * store enhancer in the composition chain.
+	 *
+	 * Note that each middleware will be given the `dispatch` and `getState` functions
+	 * as named arguments.
+	 *
+	 * @param {...Function} middlewares The middleware chain to be applied.
+	 * @returns {Function} A store enhancer applying the middleware.
+	 */
+	function applyMiddleware() {
+	  for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
+	    middlewares[_key] = arguments[_key];
+	  }
+
+	  return function (createStore) {
+	    return function (reducer, initialState, enhancer) {
+	      var store = createStore(reducer, initialState, enhancer);
+	      var _dispatch = store.dispatch;
+	      var chain = [];
+
+	      var middlewareAPI = {
+	        getState: store.getState,
+	        dispatch: function dispatch(action) {
+	          return _dispatch(action);
+	        }
+	      };
+	      chain = middlewares.map(function (middleware) {
+	        return middleware(middlewareAPI);
+	      });
+	      _dispatch = _compose2["default"].apply(undefined, chain)(store.dispatch);
+
+	      return _extends({}, store, {
+	        dispatch: _dispatch
+	      });
+	    };
+	  };
+	}
+
+/***/ },
+/* 28 */
+/***/ function(module, exports) {
+
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = compose;
+	/**
+	 * Composes single-argument functions from right to left. The rightmost
+	 * function can take multiple arguments as it provides the signature for
+	 * the resulting composite function.
+	 *
+	 * @param {...Function} funcs The functions to compose.
+	 * @returns {Function} A function obtained by composing the argument functions
+	 * from right to left. For example, compose(f, g, h) is identical to doing
+	 * (...args) => f(g(h(...args))).
+	 */
+
+	function compose() {
+	  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
+	    funcs[_key] = arguments[_key];
+	  }
+
+	  if (funcs.length === 0) {
+	    return function (arg) {
+	      return arg;
+	    };
+	  } else {
+	    var _ret = function () {
+	      var last = funcs[funcs.length - 1];
+	      var rest = funcs.slice(0, -1);
+	      return {
+	        v: function v() {
+	          return rest.reduceRight(function (composed, f) {
+	            return f(composed);
+	          }, last.apply(undefined, arguments));
+	        }
+	      };
+	    }();
+
+	    if (typeof _ret === "object") return _ret.v;
+	  }
+	}
+
+/***/ },
+/* 29 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports.connect = exports.Provider = undefined;
+
+	var _Provider = __webpack_require__(30);
+
+	var _Provider2 = _interopRequireDefault(_Provider);
+
+	var _connect = __webpack_require__(33);
+
+	var _connect2 = _interopRequireDefault(_connect);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	exports.Provider = _Provider2["default"];
+	exports.connect = _connect2["default"];
+
+/***/ },
+/* 30 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = undefined;
+
+	var _react = __webpack_require__(6);
+
+	var _storeShape = __webpack_require__(31);
+
+	var _storeShape2 = _interopRequireDefault(_storeShape);
+
+	var _warning = __webpack_require__(32);
+
+	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; }
+
+	function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+	var didWarnAboutReceivingStore = false;
+	function warnAboutReceivingStore() {
+	  if (didWarnAboutReceivingStore) {
+	    return;
+	  }
+	  didWarnAboutReceivingStore = true;
+
+	  (0, _warning2["default"])('<Provider> does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reactjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.');
+	}
+
+	var Provider = function (_Component) {
+	  _inherits(Provider, _Component);
+
+	  Provider.prototype.getChildContext = function getChildContext() {
+	    return { store: this.store };
+	  };
+
+	  function Provider(props, context) {
+	    _classCallCheck(this, Provider);
+
+	    var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
+
+	    _this.store = props.store;
+	    return _this;
+	  }
+
+	  Provider.prototype.render = function render() {
+	    var children = this.props.children;
+
+	    return _react.Children.only(children);
+	  };
+
+	  return Provider;
+	}(_react.Component);
+
+	exports["default"] = Provider;
+
+	if (false) {
+	  Provider.prototype.componentWillReceiveProps = function (nextProps) {
+	    var store = this.store;
+	    var nextStore = nextProps.store;
+
+	    if (store !== nextStore) {
+	      warnAboutReceivingStore();
+	    }
+	  };
+	}
+
+	Provider.propTypes = {
+	  store: _storeShape2["default"].isRequired,
+	  children: _react.PropTypes.element.isRequired
+	};
+	Provider.childContextTypes = {
+	  store: _storeShape2["default"].isRequired
+	};
+
+/***/ },
+/* 31 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+
+	var _react = __webpack_require__(6);
+
+	exports["default"] = _react.PropTypes.shape({
+	  subscribe: _react.PropTypes.func.isRequired,
+	  dispatch: _react.PropTypes.func.isRequired,
+	  getState: _react.PropTypes.func.isRequired
+	});
+
+/***/ },
+/* 32 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = warning;
+	/**
+	 * Prints a warning in the console if it exists.
+	 *
+	 * @param {String} message The warning message.
+	 * @returns {void}
+	 */
+	function warning(message) {
+	  /* eslint-disable no-console */
+	  if (typeof console !== 'undefined' && typeof console.error === 'function') {
+	    console.error(message);
+	  }
+	  /* eslint-enable no-console */
+	  try {
+	    // This error was thrown as a convenience so that you can use this stack
+	    // to find the callsite that caused this warning to fire.
+	    throw new Error(message);
+	    /* eslint-disable no-empty */
+	  } catch (e) {}
+	  /* eslint-enable no-empty */
+	}
+
+/***/ },
+/* 33 */
+/***/ 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__(6);
+
+	var _storeShape = __webpack_require__(31);
+
+	var _storeShape2 = _interopRequireDefault(_storeShape);
+
+	var _shallowEqual = __webpack_require__(34);
+
+	var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
+
+	var _wrapActionCreators = __webpack_require__(35);
+
+	var _wrapActionCreators2 = _interopRequireDefault(_wrapActionCreators);
+
+	var _warning = __webpack_require__(32);
+
+	var _warning2 = _interopRequireDefault(_warning);
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _hoistNonReactStatics = __webpack_require__(36);
+
+	var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
+
+	var _invariant = __webpack_require__(37);
+
+	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; }
+
+	function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+	var defaultMapStateToProps = function defaultMapStateToProps(state) {
+	  return {};
+	}; // eslint-disable-line no-unused-vars
+	var defaultMapDispatchToProps = function defaultMapDispatchToProps(dispatch) {
+	  return { dispatch: dispatch };
+	};
+	var defaultMergeProps = function defaultMergeProps(stateProps, dispatchProps, parentProps) {
+	  return _extends({}, parentProps, stateProps, dispatchProps);
+	};
+
+	function getDisplayName(WrappedComponent) {
+	  return WrappedComponent.displayName || WrappedComponent.name || 'Component';
+	}
+
+	var errorObject = { value: null };
+	function tryCatch(fn, ctx) {
+	  try {
+	    return fn.apply(ctx);
+	  } catch (e) {
+	    errorObject.value = e;
+	    return errorObject;
+	  }
+	}
+
+	// Helps track hot reloading.
+	var nextVersion = 0;
+
+	function connect(mapStateToProps, mapDispatchToProps, mergeProps) {
+	  var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+
+	  var shouldSubscribe = Boolean(mapStateToProps);
+	  var mapState = mapStateToProps || defaultMapStateToProps;
+
+	  var mapDispatch = undefined;
+	  if (typeof mapDispatchToProps === 'function') {
+	    mapDispatch = mapDispatchToProps;
+	  } else if (!mapDispatchToProps) {
+	    mapDispatch = defaultMapDispatchToProps;
+	  } else {
+	    mapDispatch = (0, _wrapActionCreators2["default"])(mapDispatchToProps);
+	  }
+
+	  var finalMergeProps = mergeProps || defaultMergeProps;
+	  var _options$pure = options.pure;
+	  var pure = _options$pure === undefined ? true : _options$pure;
+	  var _options$withRef = options.withRef;
+	  var withRef = _options$withRef === undefined ? false : _options$withRef;
+
+	  var checkMergedEquals = pure && finalMergeProps !== defaultMergeProps;
+
+	  // Helps track hot reloading.
+	  var version = nextVersion++;
+
+	  return function wrapWithConnect(WrappedComponent) {
+	    var connectDisplayName = 'Connect(' + getDisplayName(WrappedComponent) + ')';
+
+	    function checkStateShape(props, methodName) {
+	      if (!(0, _isPlainObject2["default"])(props)) {
+	        (0, _warning2["default"])(methodName + '() in ' + connectDisplayName + ' must return a plain object. ' + ('Instead received ' + props + '.'));
+	      }
+	    }
+
+	    function computeMergedProps(stateProps, dispatchProps, parentProps) {
+	      var mergedProps = finalMergeProps(stateProps, dispatchProps, parentProps);
+	      if (false) {
+	        checkStateShape(mergedProps, 'mergeProps');
+	      }
+	      return mergedProps;
+	    }
+
+	    var Connect = function (_Component) {
+	      _inherits(Connect, _Component);
+
+	      Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate() {
+	        return !pure || this.haveOwnPropsChanged || this.hasStoreStateChanged;
+	      };
+
+	      function Connect(props, context) {
+	        _classCallCheck(this, Connect);
+
+	        var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
+
+	        _this.version = version;
+	        _this.store = props.store || context.store;
+
+	        (0, _invariant2["default"])(_this.store, 'Could not find "store" in either the context or ' + ('props of "' + connectDisplayName + '". ') + 'Either wrap the root component in a <Provider>, ' + ('or explicitly pass "store" as a prop to "' + connectDisplayName + '".'));
+
+	        var storeState = _this.store.getState();
+	        _this.state = { storeState: storeState };
+	        _this.clearCache();
+	        return _this;
+	      }
+
+	      Connect.prototype.computeStateProps = function computeStateProps(store, props) {
+	        if (!this.finalMapStateToProps) {
+	          return this.configureFinalMapState(store, props);
+	        }
+
+	        var state = store.getState();
+	        var stateProps = this.doStatePropsDependOnOwnProps ? this.finalMapStateToProps(state, props) : this.finalMapStateToProps(state);
+
+	        if (false) {
+	          checkStateShape(stateProps, 'mapStateToProps');
+	        }
+	        return stateProps;
+	      };
+
+	      Connect.prototype.configureFinalMapState = function configureFinalMapState(store, props) {
+	        var mappedState = mapState(store.getState(), props);
+	        var isFactory = typeof mappedState === 'function';
+
+	        this.finalMapStateToProps = isFactory ? mappedState : mapState;
+	        this.doStatePropsDependOnOwnProps = this.finalMapStateToProps.length !== 1;
+
+	        if (isFactory) {
+	          return this.computeStateProps(store, props);
+	        }
+
+	        if (false) {
+	          checkStateShape(mappedState, 'mapStateToProps');
+	        }
+	        return mappedState;
+	      };
+
+	      Connect.prototype.computeDispatchProps = function computeDispatchProps(store, props) {
+	        if (!this.finalMapDispatchToProps) {
+	          return this.configureFinalMapDispatch(store, props);
+	        }
+
+	        var dispatch = store.dispatch;
+
+	        var dispatchProps = this.doDispatchPropsDependOnOwnProps ? this.finalMapDispatchToProps(dispatch, props) : this.finalMapDispatchToProps(dispatch);
+
+	        if (false) {
+	          checkStateShape(dispatchProps, 'mapDispatchToProps');
+	        }
+	        return dispatchProps;
+	      };
+
+	      Connect.prototype.configureFinalMapDispatch = function configureFinalMapDispatch(store, props) {
+	        var mappedDispatch = mapDispatch(store.dispatch, props);
+	        var isFactory = typeof mappedDispatch === 'function';
+
+	        this.finalMapDispatchToProps = isFactory ? mappedDispatch : mapDispatch;
+	        this.doDispatchPropsDependOnOwnProps = this.finalMapDispatchToProps.length !== 1;
+
+	        if (isFactory) {
+	          return this.computeDispatchProps(store, props);
+	        }
+
+	        if (false) {
+	          checkStateShape(mappedDispatch, 'mapDispatchToProps');
+	        }
+	        return mappedDispatch;
+	      };
+
+	      Connect.prototype.updateStatePropsIfNeeded = function updateStatePropsIfNeeded() {
+	        var nextStateProps = this.computeStateProps(this.store, this.props);
+	        if (this.stateProps && (0, _shallowEqual2["default"])(nextStateProps, this.stateProps)) {
+	          return false;
+	        }
+
+	        this.stateProps = nextStateProps;
+	        return true;
+	      };
+
+	      Connect.prototype.updateDispatchPropsIfNeeded = function updateDispatchPropsIfNeeded() {
+	        var nextDispatchProps = this.computeDispatchProps(this.store, this.props);
+	        if (this.dispatchProps && (0, _shallowEqual2["default"])(nextDispatchProps, this.dispatchProps)) {
+	          return false;
+	        }
+
+	        this.dispatchProps = nextDispatchProps;
+	        return true;
+	      };
+
+	      Connect.prototype.updateMergedPropsIfNeeded = function updateMergedPropsIfNeeded() {
+	        var nextMergedProps = computeMergedProps(this.stateProps, this.dispatchProps, this.props);
+	        if (this.mergedProps && checkMergedEquals && (0, _shallowEqual2["default"])(nextMergedProps, this.mergedProps)) {
+	          return false;
+	        }
+
+	        this.mergedProps = nextMergedProps;
+	        return true;
+	      };
+
+	      Connect.prototype.isSubscribed = function isSubscribed() {
+	        return typeof this.unsubscribe === 'function';
+	      };
+
+	      Connect.prototype.trySubscribe = function trySubscribe() {
+	        if (shouldSubscribe && !this.unsubscribe) {
+	          this.unsubscribe = this.store.subscribe(this.handleChange.bind(this));
+	          this.handleChange();
+	        }
+	      };
+
+	      Connect.prototype.tryUnsubscribe = function tryUnsubscribe() {
+	        if (this.unsubscribe) {
+	          this.unsubscribe();
+	          this.unsubscribe = null;
+	        }
+	      };
+
+	      Connect.prototype.componentDidMount = function componentDidMount() {
+	        this.trySubscribe();
+	      };
+
+	      Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
+	        if (!pure || !(0, _shallowEqual2["default"])(nextProps, this.props)) {
+	          this.haveOwnPropsChanged = true;
+	        }
+	      };
+
+	      Connect.prototype.componentWillUnmount = function componentWillUnmount() {
+	        this.tryUnsubscribe();
+	        this.clearCache();
+	      };
+
+	      Connect.prototype.clearCache = function clearCache() {
+	        this.dispatchProps = null;
+	        this.stateProps = null;
+	        this.mergedProps = null;
+	        this.haveOwnPropsChanged = true;
+	        this.hasStoreStateChanged = true;
+	        this.haveStatePropsBeenPrecalculated = false;
+	        this.statePropsPrecalculationError = null;
+	        this.renderedElement = null;
+	        this.finalMapDispatchToProps = null;
+	        this.finalMapStateToProps = null;
+	      };
+
+	      Connect.prototype.handleChange = function handleChange() {
+	        if (!this.unsubscribe) {
+	          return;
+	        }
+
+	        var storeState = this.store.getState();
+	        var prevStoreState = this.state.storeState;
+	        if (pure && prevStoreState === storeState) {
+	          return;
+	        }
+
+	        if (pure && !this.doStatePropsDependOnOwnProps) {
+	          var haveStatePropsChanged = tryCatch(this.updateStatePropsIfNeeded, this);
+	          if (!haveStatePropsChanged) {
+	            return;
+	          }
+	          if (haveStatePropsChanged === errorObject) {
+	            this.statePropsPrecalculationError = errorObject.value;
+	          }
+	          this.haveStatePropsBeenPrecalculated = true;
+	        }
+
+	        this.hasStoreStateChanged = true;
+	        this.setState({ storeState: storeState });
+	      };
+
+	      Connect.prototype.getWrappedInstance = function getWrappedInstance() {
+	        (0, _invariant2["default"])(withRef, 'To access the wrapped instance, you need to specify ' + '{ withRef: true } as the fourth argument of the connect() call.');
+
+	        return this.refs.wrappedInstance;
+	      };
+
+	      Connect.prototype.render = function render() {
+	        var haveOwnPropsChanged = this.haveOwnPropsChanged;
+	        var hasStoreStateChanged = this.hasStoreStateChanged;
+	        var haveStatePropsBeenPrecalculated = this.haveStatePropsBeenPrecalculated;
+	        var statePropsPrecalculationError = this.statePropsPrecalculationError;
+	        var renderedElement = this.renderedElement;
+
+	        this.haveOwnPropsChanged = false;
+	        this.hasStoreStateChanged = false;
+	        this.haveStatePropsBeenPrecalculated = false;
+	        this.statePropsPrecalculationError = null;
+
+	        if (statePropsPrecalculationError) {
+	          throw statePropsPrecalculationError;
+	        }
+
+	        var shouldUpdateStateProps = true;
+	        var shouldUpdateDispatchProps = true;
+	        if (pure && renderedElement) {
+	          shouldUpdateStateProps = hasStoreStateChanged || haveOwnPropsChanged && this.doStatePropsDependOnOwnProps;
+	          shouldUpdateDispatchProps = haveOwnPropsChanged && this.doDispatchPropsDependOnOwnProps;
+	        }
+
+	        var haveStatePropsChanged = false;
+	        var haveDispatchPropsChanged = false;
+	        if (haveStatePropsBeenPrecalculated) {
+	          haveStatePropsChanged = true;
+	        } else if (shouldUpdateStateProps) {
+	          haveStatePropsChanged = this.updateStatePropsIfNeeded();
+	        }
+	        if (shouldUpdateDispatchProps) {
+	          haveDispatchPropsChanged = this.updateDispatchPropsIfNeeded();
+	        }
+
+	        var haveMergedPropsChanged = true;
+	        if (haveStatePropsChanged || haveDispatchPropsChanged || haveOwnPropsChanged) {
+	          haveMergedPropsChanged = this.updateMergedPropsIfNeeded();
+	        } else {
+	          haveMergedPropsChanged = false;
+	        }
+
+	        if (!haveMergedPropsChanged && renderedElement) {
+	          return renderedElement;
+	        }
+
+	        if (withRef) {
+	          this.renderedElement = (0, _react.createElement)(WrappedComponent, _extends({}, this.mergedProps, {
+	            ref: 'wrappedInstance'
+	          }));
+	        } else {
+	          this.renderedElement = (0, _react.createElement)(WrappedComponent, this.mergedProps);
+	        }
+
+	        return this.renderedElement;
+	      };
+
+	      return Connect;
+	    }(_react.Component);
+
+	    Connect.displayName = connectDisplayName;
+	    Connect.WrappedComponent = WrappedComponent;
+	    Connect.contextTypes = {
+	      store: _storeShape2["default"]
+	    };
+	    Connect.propTypes = {
+	      store: _storeShape2["default"]
+	    };
+
+	    if (false) {
+	      Connect.prototype.componentWillUpdate = function componentWillUpdate() {
+	        if (this.version === version) {
+	          return;
+	        }
+
+	        // We are hot reloading!
+	        this.version = version;
+	        this.trySubscribe();
+	        this.clearCache();
+	      };
+	    }
+
+	    return (0, _hoistNonReactStatics2["default"])(Connect, WrappedComponent);
+	  };
+	}
+
+/***/ },
+/* 34 */
+/***/ function(module, exports) {
+
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = shallowEqual;
+	function shallowEqual(objA, objB) {
+	  if (objA === objB) {
+	    return true;
+	  }
+
+	  var keysA = Object.keys(objA);
+	  var keysB = Object.keys(objB);
+
+	  if (keysA.length !== keysB.length) {
+	    return false;
+	  }
+
+	  // Test for A's keys different from B.
+	  var hasOwn = Object.prototype.hasOwnProperty;
+	  for (var i = 0; i < keysA.length; i++) {
+	    if (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {
+	      return false;
+	    }
+	  }
+
+	  return true;
+	}
+
+/***/ },
+/* 35 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = wrapActionCreators;
+
+	var _redux = __webpack_require__(10);
+
+	function wrapActionCreators(actionCreators) {
+	  return function (dispatch) {
+	    return (0, _redux.bindActionCreators)(actionCreators, dispatch);
+	  };
+	}
+
+/***/ },
+/* 36 */
+/***/ function(module, exports) {
+
+	/**
+	 * Copyright 2015, Yahoo! Inc.
+	 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
+	 */
+	'use strict';
+
+	var REACT_STATICS = {
+	    childContextTypes: true,
+	    contextTypes: true,
+	    defaultProps: true,
+	    displayName: true,
+	    getDefaultProps: true,
+	    mixins: true,
+	    propTypes: true,
+	    type: true
+	};
+
+	var KNOWN_STATICS = {
+	    name: true,
+	    length: true,
+	    prototype: true,
+	    caller: true,
+	    arguments: true,
+	    arity: true
+	};
+
+	var isGetOwnPropertySymbolsAvailable = typeof Object.getOwnPropertySymbols === 'function';
+
+	module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, customStatics) {
+	    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components
+	        var keys = Object.getOwnPropertyNames(sourceComponent);
+
+	        /* istanbul ignore else */
+	        if (isGetOwnPropertySymbolsAvailable) {
+	            keys = keys.concat(Object.getOwnPropertySymbols(sourceComponent));
+	        }
+
+	        for (var i = 0; i < keys.length; ++i) {
+	            if (!REACT_STATICS[keys[i]] && !KNOWN_STATICS[keys[i]] && (!customStatics || !customStatics[keys[i]])) {
+	                try {
+	                    targetComponent[keys[i]] = sourceComponent[keys[i]];
+	                } catch (error) {
+
+	                }
+	            }
+	        }
+	    }
+
+	    return targetComponent;
+	};
+
+
+/***/ },
+/* 37 */
+/***/ 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
+	 * of patent rights can be found in the PATENTS file in the same directory.
+	 */
+
+	'use strict';
+
+	/**
+	 * Use invariant() to assert state which your program assumes to be true.
+	 *
+	 * Provide sprintf-style format (only %s is supported) and arguments
+	 * to provide information about what broke and what you were
+	 * expecting.
+	 *
+	 * The invariant message will be stripped in production, but the invariant
+	 * will remain to ensure logic does not differ in production.
+	 */
+
+	var invariant = function(condition, format, a, b, c, d, e, f) {
+	  if (false) {
+	    if (format === undefined) {
+	      throw new Error('invariant requires an error message argument');
+	    }
+	  }
+
+	  if (!condition) {
+	    var error;
+	    if (format === undefined) {
+	      error = new Error(
+	        'Minified exception occurred; use the non-minified dev environment ' +
+	        'for the full error message and additional helpful warnings.'
+	      );
+	    } else {
+	      var args = [a, b, c, d, e, f];
+	      var argIndex = 0;
+	      error = new Error(
+	        format.replace(/%s/g, function() { return args[argIndex++]; })
+	      );
+	      error.name = 'Invariant Violation';
+	    }
+
+	    error.framesToPop = 1; // we don't care about invariant's own frame
+	    throw error;
+	  }
+	};
+
+	module.exports = invariant;
+
+
+/***/ },
+/* 38 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const { KeyShortcuts } = __webpack_require__(39);
+	const { DebuggerTransport } = __webpack_require__(77);
+	const { DebuggerClient } = __webpack_require__(89);
+	const PrefsHelper = __webpack_require__(93).PrefsHelper;
+	const { TargetFactory } = __webpack_require__(94);
+	const DevToolsUtils = __webpack_require__(78);
+	const AppConstants = __webpack_require__(80);
+	const EventEmitter = __webpack_require__(70);
+	const WebsocketTransport = __webpack_require__(95);
+	const Menu = __webpack_require__(96);
+	const MenuItem = __webpack_require__(97);
+	const Tree = __webpack_require__(98);
+	const sourceUtils = __webpack_require__(99);
+	const frame = __webpack_require__(100);
+
+	module.exports = {
+	  KeyShortcuts,
+	  PrefsHelper,
+	  DebuggerClient,
+	  DebuggerTransport,
+	  TargetFactory,
+	  DevToolsUtils,
+	  AppConstants,
+	  EventEmitter,
+	  WebsocketTransport,
+	  Menu,
+	  MenuItem,
+	  Tree,
+	  sourceUtils,
+	  frame
+	};
+
+
+/***/ },
+/* 39 */
+/***/ 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/. */
+
+	const { Services: { appinfo }} = __webpack_require__(40);
+	const EventEmitter = __webpack_require__(70);
+	const isOSX = appinfo.OS === "Darwin";
+	"use strict";
+
+	// List of electron keys mapped to DOM API (DOM_VK_*) key code
+	const 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({ window, 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) {
+	  let modifiers = str.split("+");
+	  let key = modifiers.pop();
+
+	  let shortcut = {
+	    ctrl: false,
+	    meta: false,
+	    alt: false,
+	    shift: false,
+	    // Set for character keys
+	    key: undefined,
+	    // Set for non-character keys
+	    keyCode: undefined,
+	  };
+	  for (let 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) {
+	  let 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");
+	  }
+	  let key;
+	  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.
+	    let 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 (let [key, shortcut] of this.keys) {
+	      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)) {
+	      let 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;
+
+
+/***/ },
+/* 40 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const Services = __webpack_require__(41);
+	const SplitBox = __webpack_require__(42);
+	// const SplitBoxCSS = require("./client/shared/components/splitter/SplitBox.css")
+	const Rep = __webpack_require__(44).Rep;
+	const repUtils = __webpack_require__(45);
+	const StringRep = __webpack_require__(48).StringRep;
+
+	// const repCSS = require("./client/shared/components/reps/reps.css");
+	const Grip = __webpack_require__(54).Grip;
+	const sprintf = __webpack_require__(69).sprintf;
+
+	module.exports = {
+	  Services,
+	  SplitBox,
+	  // SplitBoxCSS,
+	  Rep,
+	  repUtils,
+	  StringRep,
+	  // repCSS,
+	  Grip,
+	  sprintf
+	};
+
+
+/***/ },
+/* 41 */
+/***/ function(module, exports) {
+
+	module.exports = require("Services");
+
+/***/ },
+/* 42 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const Draggable = React.createFactory(
+	  __webpack_require__(43));
+	const { DOM: dom, PropTypes } = React;
+
+	/**
+	 * This component represents a Splitter. The splitter supports vertical
+	 * as well as horizontal mode.
+	 */
+	const 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,
+	    // Left/top panel collapse state.
+	    startPanelCollapsed: PropTypes.bool,
+	    // Min panel size.
+	    minSize: PropTypes.any,
+	    // Max panel size.
+	    maxSize: PropTypes.any,
+	    // Right/bottom panel
+	    endPanel: PropTypes.any,
+	    // Right/bottom panel collapse state.
+	    endPanelCollapsed: PropTypes.bool,
+	    // 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,
+	      endPanelCollapsed: false,
+	      startPanelCollapsed: 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
+	    };
+	  },
+
+	  componentWillReceiveProps(nextProps) {
+	    if (this.props.vert !== nextProps.vert) {
+	      this.setState({ vert: nextProps.vert });
+	    }
+	  },
+
+	  // 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() {
+	    const splitBox = ReactDOM.findDOMNode(this);
+	    const doc = splitBox.ownerDocument;
+	    let 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() {
+	    const splitBox = ReactDOM.findDOMNode(this);
+	    const doc = splitBox.ownerDocument;
+	    doc.documentElement.style.cursor = this.state.defaultCursor;
+
+	    splitBox.classList.remove("dragging");
+	  },
+
+	  screenX() {
+	    const borderWidth = (window.outerWidth - window.innerWidth) / 2;
+	    return window.screenX + borderWidth;
+	  },
+
+	  screenY() {
+	    const 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) {
+	    const node = ReactDOM.findDOMNode(this);
+	    const doc = node.ownerDocument;
+	    const win = doc.defaultView;
+
+	    let size;
+	    let { endPanelControl } = this.props;
+
+	    if (this.state.vert) {
+	      // Switch the control flag in case of RTL. Note that RTL
+	      // has impact on vertical splitter only.
+	      let dir = win.getComputedStyle(doc.documentElement).direction;
+	      if (dir == "rtl") {
+	        endPanelControl = !endPanelControl;
+	      }
+
+	      let innerOffset = x - this.screenX();
+	      size = endPanelControl ?
+	        (node.offsetLeft + node.offsetWidth) - innerOffset :
+	        innerOffset - node.offsetLeft;
+
+	      this.setState({
+	        width: size
+	      });
+	    } else {
+	      let innerOffset = y - this.screenY();
+	      size = endPanelControl ?
+	        (node.offsetTop + node.offsetHeight) - innerOffset :
+	        innerOffset - node.offsetTop;
+
+	      this.setState({
+	        height: size
+	      });
+	    }
+	  },
+
+	  // Rendering
+	  preparePanelStyles() {
+	    const vert = this.state.vert;
+	    const {
+	      minSize, maxSize, startPanelCollapsed, endPanelControl,
+	      endPanelCollapsed } = this.props;
+	    let leftPanelStyle, rightPanelStyle;
+
+	    // Set proper size for panels depending on the current state.
+	    if (vert) {
+	      let startWidth = endPanelControl ? null : this.state.width,
+	        endWidth = endPanelControl ? this.state.width : null;
+
+	      leftPanelStyle = {
+	        maxWidth: endPanelControl ? null : maxSize,
+	        minWidth: endPanelControl ? null : minSize,
+	        width: startPanelCollapsed ? 0 : startWidth
+	      };
+	      rightPanelStyle = {
+	        maxWidth: endPanelControl ? maxSize : null,
+	        minWidth: endPanelControl ? minSize : null,
+	        width: endPanelCollapsed ? 0 : endWidth
+	      };
+	    } 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
+	      };
+	    }
+
+	    return { leftPanelStyle, rightPanelStyle };
+	  },
+
+	  render() {
+	    const vert = this.state.vert;
+	    const { startPanel, endPanel, endPanelControl, splitterSize } = this.props;
+
+	    let style = Object.assign({}, this.props.style);
+
+	    // Calculate class names list.
+	    let classNames = ["split-box"];
+	    classNames.push(vert ? "vert" : "horz");
+	    if (this.props.className) {
+	      classNames = classNames.concat(this.props.className.split(" "));
+	    }
+
+	    const { leftPanelStyle, rightPanelStyle } = this.preparePanelStyles();
+
+	    // Calculate splitter size
+	    let 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;
+
+
+/***/ },
+/* 43 */
+/***/ 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/. */
+	
+	const React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const { DOM: dom, PropTypes } = React;
+	
+	const 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();
+	    const 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();
+	    const 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;
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Load all existing rep templates
+	  const { Undefined } = __webpack_require__(46);
+	  const { Null } = __webpack_require__(47);
+	  const { StringRep } = __webpack_require__(48);
+	  const { Number } = __webpack_require__(49);
+	  const { ArrayRep } = __webpack_require__(50);
+	  const { Obj } = __webpack_require__(52);
+	  const { SymbolRep } = __webpack_require__(55);
+
+	  // DOM types (grips)
+	  const { Attribute } = __webpack_require__(56);
+	  const { DateTime } = __webpack_require__(57);
+	  const { Document } = __webpack_require__(58);
+	  const { Event } = __webpack_require__(59);
+	  const { Func } = __webpack_require__(60);
+	  const { RegExp } = __webpack_require__(61);
+	  const { StyleSheet } = __webpack_require__(62);
+	  const { TextNode } = __webpack_require__(63);
+	  const { Window } = __webpack_require__(64);
+	  const { ObjectWithText } = __webpack_require__(65);
+	  const { ObjectWithURL } = __webpack_require__(66);
+	  const { GripArray } = __webpack_require__(67);
+	  const { GripMap } = __webpack_require__(68);
+	  const { Grip } = __webpack_require__(54);
+
+	  // List of all registered template.
+	  // XXX there should be a way for extensions to register a new
+	  // or modify an existing rep.
+	  let 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.
+	   */
+	  const Rep = React.createClass({
+	    displayName: "Rep",
+
+	    propTypes: {
+	      object: React.PropTypes.any,
+	      defaultRep: React.PropTypes.object,
+	      mode: React.PropTypes.string
+	    },
+
+	    render: function () {
+	      let 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, defaultRep = Obj) {
+	    let 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 (let i = 0; i < reps.length; i++) {
+	      let 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__));
+
+
+/***/ },
+/* 45 */
+/***/ 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
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  /**
+	   * Create React factories for given arguments.
+	   * Example:
+	   *   const { Rep } = createFactories(require("./rep"));
+	   */
+	  function createFactories(args) {
+	    let result = {};
+	    for (let 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 + "";
+
+	    // Replace all non-printable characters, except of
+	    // (horizontal) tab (HT: \x09) and newline (LF: \x0A, CR: \x0D),
+	    // with unicode replacement character (u+fffd).
+	    // eslint-disable-next-line no-control-regex
+	    let re = new RegExp("[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]", "g");
+	    text = text.replace(re, "\ufffd");
+
+	    // 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;
+	    }
+
+	    let 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) {
+	    let params = [];
+
+	    // In case the text is empty just return the empty parameters
+	    if (text == "") {
+	      return params;
+	    }
+
+	    let searchParams = new URLSearchParams(text);
+	    let entries = [...searchParams.entries()];
+	    return entries.map(entry => {
+	      return {
+	        name: entry[0],
+	        value: entry[1]
+	      };
+	    });
+	  }
+
+	  function getFileName(url) {
+	    let 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) {
+	    const reSplitFile = /(.*?):\/{2,3}([^\/]*)(.*?)([^\/]*?)($|\?.*)/;
+	    let 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders undefined value
+	   */
+	  const 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders null value
+	   */
+	  const 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+	  const { cropMultipleLines } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a string. String value is enclosed within quotes.
+	   */
+	  const StringRep = React.createClass({
+	    displayName: "StringRep",
+
+	    propTypes: {
+	      useQuotes: React.PropTypes.bool,
+	    },
+
+	    getDefaultProps: function () {
+	      return {
+	        useQuotes: true,
+	      };
+	    },
+
+	    render: function () {
+	      let text = this.props.object;
+	      let member = this.props.member;
+	      if (member && member.open) {
+	        return (
+	          span({className: "objectBox objectBox-string"},
+	            "\"" + text + "\""
+	          )
+	        );
+	      }
+
+	      let croppedString = this.props.cropLimit ?
+	        cropMultipleLines(text, this.props.cropLimit) : cropMultipleLines(text);
+
+	      let 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a number
+	   */
+	  const Number = React.createClass({
+	    displayName: "Number",
+
+	    stringify: function (object) {
+	      let isNegativeZero = Object.is(object, -0) ||
+	        (object.type && object.type == "-0");
+
+	      return (isNegativeZero ? "-0" : String(object));
+	    },
+
+	    render: function () {
+	      let 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+
+	  // Shortcuts
+	  const 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.
+	   */
+	  let ArrayRep = React.createClass({
+	    displayName: "ArrayRep",
+
+	    getTitle: function (object, context) {
+	      return "[" + object.length + "]";
+	    },
+
+	    arrayIterator: function (array, max) {
+	      let items = [];
+	      let delim;
+
+	      for (let i = 0; i < array.length && i < max; i++) {
+	        try {
+	          let 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) {
+	        let 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) {
+	        let y = parseInt(x, 10);
+	        if (isNaN(y)) {
+	          return false;
+	        }
+	        return x === y.toString();
+	      }
+
+	      let props = Object.getOwnPropertyNames(array);
+	      for (let i = 0; i < props.length; i++) {
+	        let 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 () {
+	      let mode = this.props.mode || "short";
+	      let object = this.props.object;
+	      let items;
+	      let brackets;
+	      let needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]"} : { left: "[", right: "]"};
+	      };
+
+	      if (mode == "tiny") {
+	        let isEmpty = object.length === 0;
+	        items = DOM.span({className: "length"}, isEmpty ? "" : object.length);
+	        brackets = needSpace(false);
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+
+	      let 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.
+	   */
+	  let ItemRep = React.createFactory(React.createClass({
+	    displayName: "ItemRep",
+
+	    render: function () {
+	      const { Rep } = createFactories(__webpack_require__(44));
+
+	      let object = this.props.object;
+	      let delim = this.props.delim;
+	      let 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+	  const 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.
+	   */
+	  const 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  /**
+	   * Renders an object. An object is represented by a list of its
+	   * properties enclosed in curly brackets.
+	   */
+	  const Obj = React.createClass({
+	    displayName: "Obj",
+
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string,
+	    },
+
+	    getTitle: function (object) {
+	      let 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) {
+	      let 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.
+	      let 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();
+	        let 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) {
+	      let props = [];
+
+	      max = max || 3;
+	      if (!object) {
+	        return props;
+	      }
+
+	      // Hardcode tiny mode to avoid recursive handling.
+	      let mode = "tiny";
+
+	      try {
+	        for (let name in object) {
+	          if (props.length > max) {
+	            return props;
+	          }
+
+	          let value;
+	          try {
+	            value = object[name];
+	          } catch (exc) {
+	            continue;
+	          }
+
+	          let 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 () {
+	      let object = this.props.object;
+	      let props = this.safePropIterator(object);
+	      let 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__));
+
+
+/***/ },
+/* 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) {
+	  const React = __webpack_require__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { span } = React.DOM;
+
+	  /**
+	   * 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.
+	   */
+	  let 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 () {
+	      const { Grip } = __webpack_require__(54);
+	      let { Rep } = createFactories(__webpack_require__(44));
+
+	      let key;
+	      // 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__));
+
+
+/***/ },
+/* 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
+	  const React = __webpack_require__(6);
+	  // Dependencies
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders generic grip. Grip is client representation
+	   * of remote JS object and is used as an input object
+	   * for this rep component.
+	   */
+	  const 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.
+	      let isInterestingProp = this.props.isInterestingProp || ((type, value) => {
+	        return (
+	          type == "boolean" ||
+	          type == "number" ||
+	          (type == "string" && value.length != 0)
+	        );
+	      });
+
+	      let ownProperties = object.preview ? object.preview.ownProperties : [];
+	      let 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);
+	          })
+	        );
+	      }
+
+	      let props = this.getProps(ownProperties, indexes);
+	      if (props.length < object.ownPropertyLength) {
+	        // There are some undisplayed props. Then display "more...".
+	        let 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
+	        let 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) {
+	      let props = [];
+
+	      if (!ownProperties || ownProperties.length == 0) {
+	        return props;
+	      }
+
+	      // Make indexes ordered by ascending.
+	      indexes.sort(function (a, b) {
+	        return a - b;
+	      });
+
+	      indexes.forEach((i) => {
+	        let name = Object.keys(ownProperties)[i];
+	        let prop = ownProperties[name];
+	        let 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) {
+	      let indexes = [];
+
+	      try {
+	        let i = 0;
+	        for (let name in ownProperties) {
+	          if (indexes.length >= max) {
+	            return indexes;
+	          }
+
+	          let prop = ownProperties[name];
+	          let value = prop.value !== undefined ? prop.value : prop;
+
+	          // Type is specified in grip's "class" field and for primitive
+	          // values use typeof.
+	          let 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 () {
+	      let object = this.props.object;
+	      let props = this.safePropIterator(object,
+	        (this.props.mode == "long") ? 100 : 3);
+
+	      let 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);
+	  }
+
+	  let 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__));
+
+
+/***/ },
+/* 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) {
+	  // Dependencies
+	  const React = __webpack_require__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a symbol.
+	   */
+	  const SymbolRep = React.createClass({
+	    displayName: "SymbolRep",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    render: function () {
+	      let {object} = this.props;
+	      let {name} = object;
+
+	      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__));
+
+
+/***/ },
+/* 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { StringRep } = __webpack_require__(48);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  const { rep: StringRepFactory } = createFactories(StringRep);
+
+	  /**
+	   * Renders DOM attribute
+	   */
+	  let Attribute = React.createClass({
+	    displayName: "Attr",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    getTitle: function (grip) {
+	      return grip.preview.nodeName;
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      let value = grip.preview.value;
+	      let 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__));
+
+
+/***/ },
+/* 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) {
+	  // ReactJS
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Used to render JS built-in Date() object.
+	   */
+	  let 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 () {
+	      let 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__));
+
+
+/***/ },
+/* 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
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // ReactJS
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders DOM document object.
+	   */
+	  let Document = React.createClass({
+	    displayName: "Document",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    getLocation: function (grip) {
+	      let 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 () {
+	      let 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__));
+
+
+/***/ },
+/* 59 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { rep } = createFactories(__webpack_require__(54).Grip);
+
+	  /**
+	   * Renders DOM event objects.
+	   */
+	  let 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.
+	      let 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");
+	          };
+	          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__));
+
+
+/***/ },
+/* 60 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, cropString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * This component represents a template for Function objects.
+	   */
+	  let 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) {
+	      let name = grip.userDisplayName || grip.displayName || grip.name || "function";
+	      return cropString(name + "()", 100);
+	    },
+
+	    render: function () {
+	      let 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__));
+
+
+/***/ },
+/* 61 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with regular expression.
+	   */
+	  let RegExp = React.createClass({
+	    displayName: "regexp",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getSource: function (grip) {
+	      return grip.displayString;
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      let 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__));
+
+
+/***/ },
+/* 62 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const DOM = React.DOM;
+
+	  /**
+	   * Renders a grip representing CSSStyleSheet
+	   */
+	  let StyleSheet = React.createClass({
+	    displayName: "object",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getTitle: function (grip) {
+	      let 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.
+	      let url = grip.preview ? grip.preview.url : "";
+	      return url ? getURLDisplayString(url) : "";
+	    },
+
+	    render: function () {
+	      let 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__));
+
+
+/***/ },
+/* 63 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, cropMultipleLines } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const DOM = React.DOM;
+
+	  /**
+	   * Renders DOM #text node.
+	   */
+	  let 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 () {
+	      let grip = this.props.object;
+	      let mode = this.props.mode || "short";
+
+	      if (mode == "short" || mode == "tiny") {
+	        return (
+	          DOM.span({className: "objectBox objectBox-textNode"},
+	            this.getTitle(grip),
+	            "\"" + this.getTextContent(grip) + "\""
+	          )
+	        );
+	      }
+
+	      let 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__));
+
+
+/***/ },
+/* 64 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const DOM = React.DOM;
+
+	  /**
+	   * Renders a grip representing a window.
+	   */
+	  let 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 {
+	        return this.getLocation(grip);
+	      }
+	    },
+
+	    render: function () {
+	      let 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__));
+
+
+/***/ },
+/* 65 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with textual data.
+	   */
+	  let 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 () {
+	      let 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__));
+
+
+/***/ },
+/* 66 */
+/***/ 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
+	  const React = __webpack_require__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with URL data.
+	   */
+	  let 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 () {
+	      let 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__));
+
+
+/***/ },
+/* 67 */
+/***/ 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
+	  const React = __webpack_require__(6);
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+
+	  // Shortcuts
+	  const { span } = 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.
+	   */
+	  let 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) {
+	      let objectLink = this.props.objectLink || span;
+	      if (this.props.mode != "tiny") {
+	        return objectLink({
+	          object: object
+	        }, object.class + " ");
+	      }
+	      return "";
+	    },
+
+	    arrayIterator: function (grip, max) {
+	      let items = [];
+
+	      if (!grip.preview || !grip.preview.length) {
+	        return items;
+	      }
+
+	      let array = grip.preview.items;
+	      if (!array) {
+	        return items;
+	      }
+
+	      let delim;
+	      // number of grip.preview.items is limited to 10, but we may have more
+	      // items in grip-array
+	      let delimMax = grip.preview.length > array.length ?
+	        array.length : array.length - 1;
+	      let provider = this.props.provider;
+
+	      for (let i = 0; i < array.length && i < max; i++) {
+	        try {
+	          let itemGrip = array[i];
+	          let 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) {
+	        let objectLink = this.props.objectLink || span;
+	        let 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 () {
+	      let mode = this.props.mode || "short";
+	      let object = this.props.object;
+
+	      let items;
+	      let brackets;
+	      let needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]"} : { left: "[", right: "]"};
+	      };
+
+	      if (mode == "tiny") {
+	        let objectLength = this.getLength(object);
+	        let isEmpty = objectLength === 0;
+	        items = span({className: "length"}, isEmpty ? "" : objectLength);
+	        brackets = needSpace(false);
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+
+	      let objectLink = this.props.objectLink || span;
+	      let 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).
+	   */
+	  let GripArrayItem = React.createFactory(React.createClass({
+	    displayName: "GripArrayItem",
+
+	    propTypes: {
+	      delim: React.PropTypes.string,
+	    },
+
+	    render: function () {
+	      let { Rep } = createFactories(__webpack_require__(44));
+
+	      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__));
+
+
+/***/ },
+/* 68 */
+/***/ 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
+	  const React = __webpack_require__(6);
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  /**
+	   * Renders an map. A map is represented by a list of its
+	   * entries enclosed in curly brackets.
+	   */
+	  const GripMap = React.createClass({
+	    displayName: "GripMap",
+
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string,
+	    },
+
+	    getTitle: function (object) {
+	      let 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.
+	      let isInterestingEntry = this.props.isInterestingEntry || ((type, value) => {
+	        return (
+	          type == "boolean" ||
+	          type == "number" ||
+	          (type == "string" && value.length != 0)
+	        );
+	      });
+
+	      let mapEntries = object.preview && object.preview.entries
+	        ? object.preview.entries : [];
+
+	      let 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);
+	          })
+	        );
+	      }
+
+	      let entries = this.getEntries(mapEntries, indexes);
+	      if (entries.length < mapEntries.length) {
+	        // There are some undisplayed entries. Then display "more…".
+	        let 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) => {
+	        let [key, entryValue] = entries[index];
+	        let 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, [key, entry], i) => {
+	          if (indexes.length < max) {
+	            let value = (entry && entry.value !== undefined) ? entry.value : entry;
+	            // Type is specified in grip's "class" field and for primitive
+	            // values use typeof.
+	            let type = (value && value.class ? value.class : typeof value).toLowerCase();
+
+	            if (filter(type, value, key)) {
+	              indexes.push(i);
+	            }
+	          }
+
+	          return indexes;
+	        }, []);
+	    },
+
+	    render: function () {
+	      let object = this.props.object;
+	      let props = this.safeEntriesIterator(object,
+	        (this.props.mode == "long") ? 100 : 3);
+
+	      let 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__));
+
+
+/***/ },
+/* 69 */
+/***/ 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);
+
+
+/***/ },
+/* 70 */
+/***/ 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;
+
+	const { Cu } = __webpack_require__(71);
+	const promise = __webpack_require__(76);
+
+	/**
+	 * 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) {
+	  let 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) {
+	    let deferred = promise.defer();
+
+	    let handler = (aEvent, aFirstArg, ...aRest) => {
+	      this.off(aEvent, handler);
+	      if (aListener) {
+	        aListener.apply(null, [aEvent, aFirstArg, ...aRest]);
+	      }
+	      deferred.resolve(aFirstArg);
+	    };
+
+	    handler._originalListener = aListener;
+	    this.on(aEvent, handler);
+
+	    return deferred.promise;
+	  },
+
+	  /**
+	   * 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;
+	    let 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) {
+	    if (!this._eventEmitterListeners || !this._eventEmitterListeners.has(aEvent)) {
+	      return;
+	    }
+
+	    let originalListeners = this._eventEmitterListeners.get(aEvent);
+	    for (let listener of this._eventEmitterListeners.get(aEvent)) {
+	      // If the object was destroyed during event emission, stop
+	      // emitting.
+	      if (!this._eventEmitterListeners) {
+	        break;
+	      }
+
+	      // If listeners were removed during emission, make sure the
+	      // event handler we're going to fire wasn't removed.
+	      if (originalListeners === this._eventEmitterListeners.get(aEvent) ||
+	          this._eventEmitterListeners.get(aEvent).some(l => l === listener)) {
+	        try {
+	          listener.apply(null, arguments);
+	        }
+	        catch (ex) {
+	          // Prevent a bad listener from interfering with the others.
+	          let msg = ex + ": " + ex.stack;
+	          //console.error(msg);
+	          console.log(msg);
+	        }
+	      }
+	    }
+	  },
+	};
+
+
+/***/ },
+/* 71 */
+/***/ 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__(72);
+
+	var ourServices = {
+	  inIDOMUtils: inDOMUtils,
+	  nsIClipboardHelper: {
+	    copyString: () => {}
+	  },
+	  nsIXULChromeRegistry: {
+	    isLocaleRTL: () => {return false;}
+	  },
+	  nsIDOMParser: {
+
+	  },
+	};
+
+	module.exports = {
+	  Cc: name => {
+	    if(typeof console !== "undefined") {
+	      console.log('Cc sham for', name);
+	    }
+	    return {
+	      getService: (name) => ourServices[name],
+	      createInstance: (iface) => ourServices[iface],
+	    };
+	  },
+	  CC: (name, iface, method) => {
+	    if(typeof console !== "undefined") {
+	      console.log('CC sham for', name, iface, method);
+	    }
+	    return {
+	    };
+	  },
+	  Ci: {
+	    nsIThread: {
+	      "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},
+	    inIDOMUtils: "inIDOMUtils",
+	    nsIClipboardHelper: "nsIClipboardHelper",
+	    nsIXULChromeRegistry: "nsIXULChromeRegistry",
+	  },
+	  Cu: {
+	    reportError: msg => { (typeof console !== "undefined") ? console.error(msg) : dump(msg) },
+	    callFunctionWithAsyncStack: fn => fn(),
+	  },
+	  Cr: {},
+	  components: {
+	    isSuccessCode: () => (returnCode & 0x80000000) === 0,
+	  }
+	};
+
+
+/***/ },
+/* 72 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// A sham for inDOMUtils.
+
+	"use strict";
+
+	var { CSSLexer } = __webpack_require__(73);
+	var { cssColors } = __webpack_require__(74);
+	var { cssProperties } = __webpack_require__(75);
+
+	var cssRGBMap;
+
+	// From inIDOMUtils.idl.
+	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;
+	var TYPE_TIMING_FUNCTION = 8;
+	var TYPE_IMAGE_RECT = 9;
+	var TYPE_NUMBER = 10;
+
+	function getCSSLexer(text) {
+	  return new CSSLexer(text);
+	}
+
+	function rgbToColorName(r, g, b) {
+	  if (!cssRGBMap) {
+	    cssRGBMap = new Map();
+	    for (let name in cssColors) {
+	      cssRGBMap.set(JSON.stringify(cssColors[name]), name);
+	    }
+	  }
+	  let 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) {
+	  if (hue > 6.0) {
+	    hue -= 6.0;
+	  } else if (hue < 0.0) {
+	    hue += 6.0;
+	  }
+	  var val;
+	  if (hue < 1.0) {
+	    val = n1 + (n2 - n1) * hue;
+	  } else if (hue < 3.0) {
+	    val = n2;
+	  } else if (hue < 4.0) {
+	    val = n1 + (n2 - n1) * (4.0 - hue);
+	  } else {
+	    val = n1;
+	  }
+	  return val;
+	}
+
+	// Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js
+	// and then modified.
+	function hslToRGB([hue, saturation, lightness]) {
+	  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;
+	    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];
+	}
+
+	function colorToRGBA(name) {
+	  name = name.trim().toLowerCase();
+	  if (name in cssColors) {
+	    return cssColors[name];
+	  }
+
+	  if (name === "transparent") {
+	    return [0, 0, 0, 0];
+	  }
+
+	  let lexer = getCSSLexer(name);
+
+	  let getToken = function() {
+	    while (true) {
+	      let token = lexer.nextToken();
+	      if (!token || token.tokenType !== "comment" ||
+	          token.tokenType !== "whitespace") {
+	        return token;
+	      }
+	    }
+	  };
+
+	  let requireComma = function(token) {
+	    if (token.tokenType !== "symbol" || token.text !== ",") {
+	      return null;
+	    }
+	    return getToken();
+	  };
+
+	  let func = getToken();
+	  if (!func || func.tokenType !== "function") {
+	    return null;
+	  }
+	  let 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();
+	    if (i > 0) {
+	      token = requireComma(token);
+	    }
+	    if (token.tokenType !== "number" || !token.isInteger) {
+	      return null;
+	    }
+	    let 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") {
+	      return null;
+	    }
+	    let 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 !== ")") {
+	    return null;
+	  }
+	  if (getToken() !== null) {
+	    return null;
+	  }
+
+	  return vals;
+	}
+
+	function isValidCSSColor(name) {
+	  return colorToRGBA(name) !== null;
+	}
+
+	function isVariable(name) {
+	  return name.startsWith("--");
+	}
+
+	function cssPropertyIsShorthand(name) {
+	  if (isVariable(name)) {
+	    return false;
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  return !!cssProperties[name].subproperties;
+	}
+
+	function getSubpropertiesForCSSProperty(name) {
+	  if (isVariable(name)) {
+	    return [name];
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  if ("subproperties" in cssProperties[name]) {
+	    return cssProperties[name].subproperties.slice();
+	  }
+	  return [name];
+	}
+
+	function getCSSValuesForProperty(name) {
+	  if (isVariable(name)) {
+	    return ["initial", "inherit", "unset"];
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  return cssProperties[name].values.slice();
+	}
+
+	function getCSSPropertyNames(flags) {
+	  let names = Object.keys(cssProperties);
+	  if ((flags & EXCLUDE_SHORTHANDS) !== 0) {
+	    names = names.filter((name) => cssProperties[name].subproperties);
+	  }
+	  if ((flags & INCLUDE_ALIASES) === 0) {
+	    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;
+	}
+
+	function isInheritedProperty(name) {
+	  if (isVariable(name)) {
+	    return true;
+	  }
+	  if (!(name in cssProperties)) {
+	    return false;
+	  }
+	  return cssProperties[name].inherited;
+	}
+
+	function cssPropertyIsValid(name, value) {
+	  if (isVariable(name)) {
+	    return true;
+	  }
+	  if (!(name in cssProperties)) {
+	    return false;
+	  }
+	  let elt = document.createElement("div");
+	  elt.style = name + ":" + value;
+	  return elt.style.length > 0;
+	}
+
+	exports.inDOMUtils = {
+	  getCSSLexer,
+	  rgbToColorName,
+	  colorToRGBA,
+	  isValidCSSColor,
+	  cssPropertyIsShorthand,
+	  getSubpropertiesForCSSProperty,
+	  getCSSValuesForProperty,
+	  getCSSPropertyNames,
+	  cssPropertySupportsType,
+	  isInheritedProperty,
+	  cssPropertyIsValid,
+
+	  // Constants.
+	  EXCLUDE_SHORTHANDS,
+	  INCLUDE_ALIASES,
+	  TYPE_LENGTH,
+	  TYPE_PERCENTAGE,
+	  TYPE_COLOR,
+	  TYPE_URL,
+	  TYPE_ANGLE,
+	  TYPE_FREQUENCY,
+	  TYPE_TIME,
+	  TYPE_GRADIENT,
+	  TYPE_TIMING_FUNCTION,
+	  TYPE_IMAGE_RECT,
+	  TYPE_NUMBER,
+	};
+
+
+/***/ },
+/* 73 */
+/***/ 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) {
+					++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);
+				}
+			}
+			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(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) {
+				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.
+					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 if(code == 0x5c) {
+					if(startsWithAValidEscape()) {
+						token.value += stringFromCode(consumeEscape());
+					} else {
+						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 {
+						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;
+		};
+		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 {
+				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);
+			}
+			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())) {
+					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);
+				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 {
+				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)
+				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 {
+			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 {
+				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;
+		}
+		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;
+
+	}));
+
+
+/***/ },
+/* 74 */
+/***/ 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],
+	  azure: [240, 255, 255],
+	  beige: [245, 245, 220],
+	  bisque: [255, 228, 196],
+	  black: [0, 0, 0],
+	  blanchedalmond: [255, 235, 205],
+	  blue: [0, 0, 255],
+	  blueviolet: [138, 43, 226],
+	  brown: [165, 42, 42],
+	  burlywood: [222, 184, 135],
+	  cadetblue: [95, 158, 160],
+	  chartreuse: [127, 255, 0],
+	  chocolate: [210, 105, 30],
+	  coral: [255, 127, 80],
+	  cornflowerblue: [100, 149, 237],
+	  cornsilk: [255, 248, 220],
+	  crimson: [220, 20, 60],
+	  cyan: [0, 255, 255],
+	  darkblue: [0, 0, 139],
+	  darkcyan: [0, 139, 139],
+	  darkgoldenrod: [184, 134, 11],
+	  darkgray: [169, 169, 169],
+	  darkgreen: [0, 100, 0],
+	  darkgrey: [169, 169, 169],
+	  darkkhaki: [189, 183, 107],
+	  darkmagenta: [139, 0, 139],
+	  darkolivegreen: [85, 107, 47],
+	  darkorange: [255, 140, 0],
+	  darkorchid: [153, 50, 204],
+	  darkred: [139, 0, 0],
+	  darksalmon: [233, 150, 122],
+	  darkseagreen: [143, 188, 143],
+	  darkslateblue: [72, 61, 139],
+	  darkslategray: [47, 79, 79],
+	  darkslategrey: [47, 79, 79],
+	  darkturquoise: [0, 206, 209],
+	  darkviolet: [148, 0, 211],
+	  deeppink: [255, 20, 147],
+	  deepskyblue: [0, 191, 255],
+	  dimgray: [105, 105, 105],
+	  dimgrey: [105, 105, 105],
+	  dodgerblue: [30, 144, 255],
+	  firebrick: [178, 34, 34],
+	  floralwhite: [255, 250, 240],
+	  forestgreen: [34, 139, 34],
+	  fuchsia: [255, 0, 255],
+	  gainsboro: [220, 220, 220],
+	  ghostwhite: [248, 248, 255],
+	  gold: [255, 215, 0],
+	  goldenrod: [218, 165, 32],
+	  gray: [128, 128, 128],
+	  grey: [128, 128, 128],
+	  green: [0, 128, 0],
+	  greenyellow: [173, 255, 47],
+	  honeydew: [240, 255, 240],
+	  hotpink: [255, 105, 180],
+	  indianred: [205, 92, 92],
+	  indigo: [75, 0, 130],
+	  ivory: [255, 255, 240],
+	  khaki: [240, 230, 140],
+	  lavender: [230, 230, 250],
+	  lavenderblush: [255, 240, 245],
+	  lawngreen: [124, 252, 0],
+	  lemonchiffon: [255, 250, 205],
+	  lightblue: [173, 216, 230],
+	  lightcoral: [240, 128, 128],
+	  lightcyan: [224, 255, 255],
+	  lightgoldenrodyellow: [250, 250, 210],
+	  lightgray: [211, 211, 211],
+	  lightgreen: [144, 238, 144],
+	  lightgrey: [211, 211, 211],
+	  lightpink: [255, 182, 193],
+	  lightsalmon: [255, 160, 122],
+	  lightseagreen: [32, 178, 170],
+	  lightskyblue: [135, 206, 250],
+	  lightslategray: [119, 136, 153],
+	  lightslategrey: [119, 136, 153],
+	  lightsteelblue: [176, 196, 222],
+	  lightyellow: [255, 255, 224],
+	  lime: [0, 255, 0],
+	  limegreen: [50, 205, 50],
+	  linen: [250, 240, 230],
+	  magenta: [255, 0, 255],
+	  maroon: [128, 0, 0],
+	  mediumaquamarine: [102, 205, 170],
+	  mediumblue: [0, 0, 205],
+	  mediumorchid: [186, 85, 211],
+	  mediumpurple: [147, 112, 219],
+	  mediumseagreen: [60, 179, 113],
+	  mediumslateblue: [123, 104, 238],
+	  mediumspringgreen: [0, 250, 154],
+	  mediumturquoise: [72, 209, 204],
+	  mediumvioletred: [199, 21, 133],
+	  midnightblue: [25, 25, 112],
+	  mintcream: [245, 255, 250],
+	  mistyrose: [255, 228, 225],
+	  moccasin: [255, 228, 181],
+	  navajowhite: [255, 222, 173],
+	  navy: [0, 0, 128],
+	  oldlace: [253, 245, 230],
+	  olive: [128, 128, 0],
+	  olivedrab: [107, 142, 35],
+	  orange: [255, 165, 0],
+	  orangered: [255, 69, 0],
+	  orchid: [218, 112, 214],
+	  palegoldenrod: [238, 232, 170],
+	  palegreen: [152, 251, 152],
+	  paleturquoise: [175, 238, 238],
+	  palevioletred: [219, 112, 147],
+	  papayawhip: [255, 239, 213],
+	  peachpuff: [255, 218, 185],
+	  peru: [205, 133, 63],
+	  pink: [255, 192, 203],
+	  plum: [221, 160, 221],
+	  powderblue: [176, 224, 230],
+	  purple: [128, 0, 128],
+	  rebeccapurple: [102, 51, 153],
+	  red: [255, 0, 0],
+	  rosybrown: [188, 143, 143],
+	  royalblue: [65, 105, 225],
+	  saddlebrown: [139, 69, 19],
+	  salmon: [250, 128, 114],
+	  sandybrown: [244, 164, 96],
+	  seagreen: [46, 139, 87],
+	  seashell: [255, 245, 238],
+	  sienna: [160, 82, 45],
+	  silver: [192, 192, 192],
+	  skyblue: [135, 206, 235],
+	  slateblue: [106, 90, 205],
+	  slategray: [112, 128, 144],
+	  slategrey: [112, 128, 144],
+	  snow: [255, 250, 250],
+	  springgreen: [0, 255, 127],
+	  steelblue: [70, 130, 180],
+	  tan: [210, 180, 140],
+	  teal: [0, 128, 128],
+	  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],
+	};
+	module.exports = { cssColors };
+
+
+/***/ },
+/* 75 */
+/***/ 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", "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", ],
+	  },
+	  "outline-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "outline-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "outline-offset": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "overflow-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ],
+	  },
+	  "overflow-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ],
+	  },
+	  "padding-block-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-block-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-bottom": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-inline-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-inline-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-left": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-right": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-top": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "page-break-after": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ],
+	  },
+	  "page-break-before": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ],
+	  },
+	  "page-break-inside": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "avoid", "inherit", "initial", "unset", ],
+	  },
+	  "paint-order": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "pointer-events": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke", ],
+	  },
+	  "position": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset", ],
+	  },
+	  "quotes": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "resize": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical", ],
+	  },
+	  "right": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "ruby-align": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["center", "inherit", "initial", "space-around", "space-between", "start", "unset", ],
+	  },
+	  "ruby-position": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "over", "under", "unset", ],
+	  },
+	  "scroll-behavior": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "smooth", "unset", ],
+	  },
+	  "scroll-snap-coordinate": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-destination": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-points-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-points-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-type-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ],
+	  },
+	  "scroll-snap-type-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ],
+	  },
+	  "table-layout": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "fixed", "inherit", "initial", "unset", ],
+	  },
+	  "text-align": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ],
+	  },
+	  "-moz-text-align-last": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ],
+	  },
+	  "text-decoration-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", ],
+	  },
+	  "text-decoration-line": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "text-decoration-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy", ],
+	  },
+	  "text-indent": {
+	    inherited: true,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "text-orientation": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright", ],
+	  },
+	  "text-overflow": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "text-shadow": {
+	    inherited: true,
+	    supports: 5,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-text-size-adjust": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "none", "unset", ],
+	  },
+	  "text-transform": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase", ],
+	  },
+	  "transform": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transform-box": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["border-box", "fill-box", "inherit", "initial", "unset", "view-box", ],
+	  },
+	  "transform-origin": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "perspective-origin": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "perspective": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["inherit", "initial", "none", "unset", ],
+	  },
+	  "transform-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["flat", "inherit", "initial", "preserve-3d", "unset", ],
+	  },
+	  "backface-visibility": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["hidden", "inherit", "initial", "unset", "visible", ],
+	  },
+	  "top": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "transition-delay": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transition-duration": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transition-property": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["all", "inherit", "initial", "none", "unset", ],
+	  },
+	  "transition-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", ],
+	  },
+	  "unicode-bidi": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "-moz-user-focus": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset", ],
+	  },
+	  "-moz-user-input": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset", ],
+	  },
+	  "-moz-user-modify": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "read-only", "read-write", "unset", "write-only", ],
+	  },
+	  "-moz-user-select": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset", ],
+	  },
+	  "vertical-align": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset", ],
+	  },
+	  "visibility": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["collapse", "hidden", "inherit", "initial", "unset", "visible", ],
+	  },
+	  "white-space": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset", ],
+	  },
+	  "width": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-window-dragging": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["drag", "inherit", "initial", "no-drag", "unset", ],
+	  },
+	  "word-break": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["break-all", "inherit", "initial", "keep-all", "normal", "unset", ],
+	  },
+	  "word-spacing": {
+	    inherited: true,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "word-wrap": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["break-word", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "hyphens": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "manual", "none", "unset", ],
+	  },
+	  "writing-mode": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl", ],
+	  },
+	  "z-index": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["auto", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-box-align": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset", ],
+	  },
+	  "-moz-box-direction": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "normal", "reverse", "unset", ],
+	  },
+	  "-moz-box-flex": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-box-orient": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical", ],
+	  },
+	  "-moz-box-pack": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["center", "end", "inherit", "initial", "justify", "start", "unset", ],
+	  },
+	  "-moz-box-ordinal-group": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-stack-sizing": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["ignore", "inherit", "initial", "stretch-to-fit", "unset", ],
+	  },
+	  "clip-path": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "clip-rule": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["evenodd", "inherit", "initial", "nonzero", "unset", ],
+	  },
+	  "color-interpolation": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ],
+	  },
+	  "color-interpolation-filters": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ],
+	  },
+	  "dominant-baseline": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script", ],
+	  },
+	  "fill": {
+	    inherited: true,
+	    supports: 12,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "fill-opacity": {
+	    inherited: true,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "fill-rule": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["evenodd", "inherit", "initial", "nonzero", "unset", ],
+	  },
+	  "filter": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "flood-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", ],
+	  },
+	  "flood-opacity": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "image-rendering": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset", ],
+	  },
+	  "lighting-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", "po