merge mozilla-central to autoland. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sun, 03 Sep 2017 10:55:23 +0200
changeset 427988 0991b275888d200772a54f624a814f0c6060d394
parent 427987 7cec07add03a1e79d3da1cad2953c8afcec2ddf5 (current diff)
parent 427984 37824bf5c5b08afa7e689fceb935b8f457ebd9eb (diff)
child 427989 3d3f96564e3ef6761ea216c103e748089e35a764
push id7761
push userjlund@mozilla.com
push dateFri, 15 Sep 2017 00:19:52 +0000
treeherdermozilla-beta@c38455951db4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone57.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
merge mozilla-central to autoland. r=merge a=merge
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -7,17 +7,17 @@
   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;
+  --primary-line-height: 22px;
   --secondary-line-height: 25px;
   --base-spacing: 20px;
   --base-transition: all 0.25s ease;
 }
 
 .landing-popup {
   min-width: 0;
 }
@@ -50,24 +50,25 @@
 .landing-page .panel .hero {
   height: 100%;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
 }
 
-.landing-page .panel input[type=button] {
+.landing-page button {
   background-color: var(--theme-tab-toolbar-background);
   color: var(--theme-comment);
   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);
+  cursor: pointer;
 }
 
 .landing-page .panel header h1 {
   color: var(--theme-body-color);
   font-size: var(--title-font-size);
   margin: 0;
   line-height: var(--primary-line-height);
   font-weight: normal;
@@ -98,16 +99,37 @@
 }
 
 .landing-page .panel .footer-note {
   padding: var(--base-spacing) 0;
   text-align: center;
   font-size: 14px;
   color: var(--theme-comment);
 }
+
+.landing-page .panel .launch-action-container {
+  text-align: center;
+}
+
+.landing-page .panel .under-construction {
+  display: flex;
+  width: 417px;
+  color: var(--theme-comment);
+  font-size: calc(var(--ui-element-font-size) / 1);
+  margin: var(--base-spacing) auto;
+  line-height: 1.4em;
+}
+
+.landing-page .panel .under-construction .under-construction-message {
+  max-width: 350px;
+}
+
+.landing-page .panel .under-construction .github-link {
+  display: block;
+}
 /* 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/. */
 
 .landing-page .tab-group {
   flex: 1;
   overflow-y: auto;
 }
@@ -165,30 +187,31 @@
 .landing-page .tab.active .tab-url {
   color: var(--theme-highlight-gray);
 }
 /* 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/. */
 
 .landing-page .sidebar {
+  --sidebar-width: 200px;
   display: flex;
   background-color: var(--theme-tab-toolbar-background);
-  width: 200px;
+  width: var(--sidebar-width);
   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);
+  font-weight: bold;
+  padding: 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);
 }
@@ -217,16 +240,45 @@
   color: var(--theme-selection-color);
   cursor: pointer;
 }
 
 .landing-page .sidebar li:hover a,
 .landing-page .sidebar li:focus a {
   color: inherit;
 }
+
+.landing-page .sidebar li:last-child {
+  border-top: 2px solid var(--theme-splitter-color);
+  margin: 2px;
+}
+
+.landing-page .sidebar .title-wrapper .launchpad-container {
+  padding-left: var(--base-spacing);
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container .launchpad-container-icon {
+  display: inline-block;
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container svg {
+  width: 24px;
+  height: 24px;
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container svg path {
+  width: 24px;
+  height: 24px;
+  fill: var(--theme-body-color);
+}
+
+.landing-page .sidebar .title-wrapper .launchpad-container .launchpad-container-title {
+  display: inline;
+  padding-left: 3px;
+}
 /* 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/. */
 
 menu {
   display: inline;
   padding: 0;
 }
@@ -434,21 +486,21 @@ menuitem {
   user-select: none;
 }
 
 menuitem:hover {
   background: #3780fb;
   color: white;
 }
 
-menuitem[disabled=true] {
+menuitem[disabled="true"] {
   color: #cccccc;
 }
 
-menuitem[disabled=true]:hover {
+menuitem[disabled="true"]:hover {
   background-color: transparent;
   cursor: default;
 }
 
 menuseparator {
   border-bottom: 1px solid #cacdd3;
   width: 100%;
   height: 5px;
@@ -1001,23 +1053,24 @@ html[dir="rtl"] .managed-tree .tree .nod
 .search-field .search-nav-buttons .nav-btn path {
   fill: var(--theme-comment);
 }
 .project-text-search {
   flex-grow: 1;
   display: flex;
   flex-direction: column;
   overflow-y: hidden;
+  height: 100%;
 }
 
 .project-text-search .result {
   display: flex;
   cursor: default;
-  margin-bottom: 1px;
   padding: 4px 0 4px 30px;
+  line-height: 16px;
   font-size: 10px;
 }
 
 .project-text-search .matches-summary {
   margin-left: 5px;
 }
 
 .project-text-search .result {
@@ -1044,18 +1097,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   margin-right: 1em;
   width: 2em;
 }
 
 .project-text-search .file-result {
   font-weight: bold;
   line-height: 20px;
   cursor: default;
-  margin: 2px 0;
-  padding: 3px 0 3px 5px;
+  padding: 2px 0 2px 5px;
   font-size: 12px;
 }
 
 .project-text-search .file-result .arrow {
   margin: 2px 0 2px 0;
 }
 
 .project-text-search .file-result.focused {
@@ -1070,16 +1122,21 @@ html[dir="rtl"] .managed-tree .tree .nod
 .project-text-search .search-field {
   display: flex;
   align-self: stretch;
   flex-grow: 1;
 }
 
 .project-text-search .managed-tree {
   overflow-y: auto;
+  height: calc(100% - 81px);
+}
+
+.project-text-search .managed-tree .tree {
+  height: 100%;
 }
 .autocomplete {
   position: relative;
   width: 100%;
   height: 100%;
 }
 
 .autocomplete .no-result-msg {
@@ -1127,17 +1184,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   border-color: var(--theme-selection-background);
 }
 
 .result-list.small li.selected {
   background-color: var(--theme-selection-background);
   color: white;
 }
 
-.theme-dark  .result-list.small li.selected {
+.theme-dark .result-list.small li.selected {
   background-color: var(--theme-body-background);
 }
 
 .result-list li .title {
   line-height: 1.5em;
   word-break: break-all;
 }
 
@@ -1319,17 +1376,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   border: 1px solid transparent;
   border-bottom-left-radius: 2px;
   border-bottom-right-radius: 2px;
   display: inline-flex;
   position: relative;
   transition: all 0.25s ease;
   overflow: hidden;
   padding: 5px;
-  margin-bottom: 4px;
+  margin-bottom: 0px;
   margin-top: -1px;
 }
 
 .source-footer .tab:hover {
   background-color: var(--theme-toolbar-background-alt);
   border-color: var(--theme-splitter-color);
 }
 
@@ -1920,17 +1977,17 @@ html[dir="rtl"] .arrow svg,
 }
 
 .bracket-arrow {
   position: absolute;
 }
 
 .bracket-arrow::before,
 .bracket-arrow::after {
-  content: '';
+  content: "";
   height: 0;
   width: 0;
   position: absolute;
   border: 7px solid transparent;
 }
 
 .bracket-arrow.up::before {
   border-bottom-color: var(--theme-splitter-color);
@@ -1965,93 +2022,97 @@ html[dir="rtl"] .arrow svg,
   position: fixed;
   z-index: 100;
 }
 
 .popover .gap {
   height: 5px;
   padding-top: 5px;
 }
-.popover .preview {
+.popover .preview-popup {
   background: var(--theme-body-background);
   width: 350px;
   min-height: 80px;
   border: 1px solid var(--theme-splitter-color);
   padding: 10px;
   height: auto;
   min-height: inherit;
   max-height: 200px;
   overflow: auto;
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
-.theme-dark .popover .preview {
+.theme-dark .popover .preview-popup {
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
-.popover .preview .header {
+.popover .preview-popup .header {
   width: 100%;
   line-height: 20px;
   border-bottom: 1px solid #cccccc;
   display: flex;
   flex-direction: column;
 }
 
-.popover .preview .header .link {
+.popover .preview-popup .header .link {
   align-self: flex-end;
   color: var(--theme-highlight-blue);
   text-decoration: underline;
 }
 
-.selection,
-.debug-expression.selection {
+.preview-selection:hover {
+  cursor: default;
+}
+
+.preview-selection,
+.debug-expression.preview-selection {
   background-color: var(--theme-highlight-yellow);
 }
 
-.theme-dark .selection,
-.theme-dark .debug-expression.selection {
+.theme-dark .preview-selection,
+.theme-dark .debug-expression.preview-selection {
   background-color: #743884;
 }
 
-.theme-dark .cm-s-mozilla .selection,
-.theme-dark .cm-s-mozilla .debug-expression.selection {
+.theme-dark .cm-s-mozilla .preview-selection,
+.theme-dark .cm-s-mozilla .debug-expression.preview-selection {
   color: #e7ebee;
 }
 
-.popover .preview .function-signature {
+.popover .preview-popup .function-signature {
   padding-top: 10px;
 }
 
-.theme-dark .popover .preview {
+.theme-dark .popover .preview-popup {
   border-color: var(--theme-body-color);
 }
 
-.theme-dark .popover .preview .arrow svg {
+.theme-dark .popover .preview-popup .arrow svg {
   fill: var(--theme-content-color3);
 }
 
 .tooltip {
   position: fixed;
   z-index: 100;
 }
 
-.tooltip .preview {
+.tooltip .preview-popup {
   background: var(--theme-toolbar-background);
   max-width: inherit;
   min-height: 80px;
   border: 1px solid var(--theme-splitter-color);
   box-shadow: 1px 2px 4px 1px var(--theme-toolbar-background-alt);
   padding: 5px;
   height: auto;
   min-height: inherit;
   max-height: 200px;
   overflow: auto;
 }
 
-.theme-dark .tooltip .preview {
+.theme-dark .tooltip .preview-popup {
   border-color: var(--theme-body-color);
 }
 
 .tooltip .gap {
   height: 4px;
   padding-top: 4px;
 }
 
@@ -2123,16 +2184,19 @@ html[dir="rtl"] .arrow svg,
 
 .theme-dark .call-site-bp {
   background-color: #4b3f3f;
 }
 
 .theme-dark .call-site-bp::before {
   border-bottom-color: #dd4d4d;
 }
+.empty-line .CodeMirror-linenumber {
+  opacity: 0.5;
+}
 .editor-wrapper {
   --debug-line-border: rgb(145, 188, 219);
   --debug-expression-background: rgba(202, 227, 255, 0.5);
   --editor-searchbar-height: 27px;
   --editor-second-searchbar-height: 27px;
 }
 
 .theme-dark .editor-wrapper {
@@ -2822,16 +2886,20 @@ html .breakpoints-list .breakpoint.pause
   height: 16px;
 }
 
 .accordion ._content {
   border-bottom: 1px solid var(--theme-splitter-color);
   font-size: 12px;
 }
 
+.accordion div:last-child ._content {
+  border-bottom: none;
+}
+
 .accordion ._header .header-buttons {
   display: flex;
   margin-left: auto;
   padding-right: 5px;
 }
 
 .accordion .header-buttons .add-button {
   font-size: 180%;
@@ -2859,16 +2927,20 @@ html .breakpoints-list .breakpoint.pause
   height: 30px;
   overflow: hidden;
   position: sticky;
   top: 0;
   z-index: 1;
   background-color: var(--theme-body-background);
 }
 
+.command-bar.vertical {
+  width: 100vw;
+}
+
 html[dir="rtl"] .command-bar {
   border-right: 1px solid var(--theme-splitter-color);
 }
 
 .theme-dark .command-bar {
   background-color: var(--theme-tab-toolbar-background);
 }
 
@@ -3011,16 +3083,21 @@ html .command-bar > button:disabled {
   text-align: center;
   font-size: 1.25em;
   color: var(--theme-comment-alt);
   background-color: var(--theme-tab-toolbar-background);
   font-weight: lighter;
   z-index: 100;
 }
 
+.alignlabel {
+  display: inline-block;
+  text-align: left;
+}
+
 .welcomebox .toggle-button-end {
   position: absolute;
   top: auto;
   bottom: 0;
   offset-inline-end: 0;
   offset-inline-start: auto;
 }
 
@@ -3036,25 +3113,31 @@ html .welcomebox .toggle-button-end.coll
 }
 
 .source-header * {
   -moz-user-select: none;
   user-select: none;
 }
 
 .source-header .new-tab-btn {
-  padding: 0px 4px;
+  padding: 4px;
   margin-top: 4px;
+  margin-left: 2px;
   fill: var(--theme-content-color3);
   transition: 0.1s ease;
   align-self: center;
 }
 
+.source-header .new-tab-btn:hover {
+  background-color: var(--theme-toolbar-background-hover);
+}
+
 .source-header .new-tab-btn svg {
   width: 12px;
+  display: block;
 }
 
 .source-tabs {
   max-width: calc(100% - 80px);
   align-self: flex-start;
 }
 
 .source-tab {
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -535,17 +535,17 @@ function isDirectory(url) {
   var parts = url.path.split("/").filter(p => p !== "");
 
   // Assume that all urls point to files except when they end with '/'
   // Or directory node has children
   return parts.length === 0 || url.path.slice(-1) === "/" || nodeHasChildren(url);
 }
 
 function isInvalidUrl(url, source) {
-  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loading") || !url.group || (0, _source.isPretty)(source.toJS());
+  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loadedState") === "loading" || !url.group || (0, _source.isPretty)(source.toJS());
 }
 
 function partIsFile(index, parts, url) {
   var isLastPart = index === parts.length - 1;
   return !isDirectory(url) && isLastPart;
 }
 
 function createNode(name, path, contents) {
@@ -705,18 +705,18 @@ function getWasmText(sourceId, data) {
   var dis = new _WasmDis.WasmDisassembler();
   dis.addOffsets = true;
   var done = dis.disassembleChunk(parser);
   var result = dis.getResult();
   if (result.lines.length === 0) {
     result = { lines: ["No luck with wast conversion"], offsets: [0], done };
   }
 
-  var offsets = result.offsets,
-      lines = [];
+  var offsets = result.offsets;
+  var lines = [];
   for (var i = 0; i < offsets.length; i++) {
     lines[offsets[i]] = i;
   }
 
   wasmStates[sourceId] = { offsets, lines };
 
   return { lines: result.lines, done: result.done };
 }
@@ -5901,17 +5901,17 @@ var _require5 = __webpack_require__(828)
     isDevelopment = _require5.isDevelopment;
 
 var L10N = __webpack_require__(185);
 
 var _require6 = __webpack_require__(1130),
     showMenu = _require6.showMenu,
     buildMenu = _require6.buildMenu;
 
-setConfig({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js","searchURL":"resource://devtools/client/debugger/new/search-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"codeFolding":{"enabled":false},"searchNav":{"enabled":true},"collapseFrame":{"enabled":true},"outline":{"enabled":true}}});
+setConfig({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js","searchURL":"resource://devtools/client/debugger/new/search-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"codeFolding":{"enabled":false},"searchNav":{"enabled":true},"collapseFrame":{"enabled":true},"outline":{"enabled":true},"wasm":{"enabled":true}}});
 
 // Set various flags before requiring app code.
 if (getValue("logging.client")) {
   // DevToolsUtils.dumpn.wantLogging = true;
 }
 
 var _require7 = __webpack_require__(885),
     firefox = _require7.firefox,
@@ -6768,23 +6768,25 @@ var sidePanelItems = {
     clientType: "firefox",
     paramName: "firefox-tab",
     docsUrlPart: "firefox"
   },
   Chrome: {
     name: "Chrome",
     clientType: "chrome",
     paramName: "chrome-tab",
-    docsUrlPart: "chrome"
+    docsUrlPart: "chrome",
+    isUnderConstruction: true
   },
   Node: {
     name: "Node",
     clientType: "node",
     paramName: "node-tab",
-    docsUrlPart: "node"
+    docsUrlPart: "node",
+    isUnderConstruction: true
   },
   Settings: {
     name: "Settings",
     clientType: "settings",
     paramName: "settings-tab",
     docsUrlPart: "settings"
   }
 };
@@ -13904,34 +13906,35 @@ module.exports = {
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(680);
+__webpack_require__(851);
 var dom = React.DOM;
 
 var ImPropTypes = __webpack_require__(150);
 var configMap = __webpack_require__(145).sidePanelItems;
 var Tabs = React.createFactory(__webpack_require__(172));
 var Sidebar = React.createFactory(__webpack_require__(176));
 var Settings = React.createFactory(__webpack_require__(179));
 
 var githubUrl = "https://github.com/devtools-html/debugger.html/blob/master";
 
 function getTabsByClientType(tabs, clientType) {
   return tabs.valueSeq().filter(tab => tab.get("clientType") == clientType);
 }
 
 function firstTimeMessage(title, urlPart) {
   return dom.div({ className: "footer-note" }, `First time connecting to ${title}? Checkout out the `, dom.a({
-    href: `${githubUrl}/docs/getting-setup.md#starting-${urlPart}`
+    href: `${githubUrl}/docs/getting-setup.md#starting-${urlPart}`,
+    target: "_blank"
   }, "docs"), ".");
 }
 
 var LandingPage = React.createClass({
   displayName: "LandingPage",
 
   propTypes: {
     tabs: ImPropTypes.map.isRequired,
@@ -13964,35 +13967,48 @@ var LandingPage = React.createClass({
   },
 
   onSideBarItemClick(itemTitle) {
     if (itemTitle !== this.state.selectedPane) {
       this.setState({ selectedPane: itemTitle });
     }
   },
 
-  renderLaunchButton() {
+  renderLaunchOptions() {
     var selectedPane = this.state.selectedPane;
-    var name = configMap[selectedPane].name;
+    var _configMap$selectedPa = configMap[selectedPane],
+        name = _configMap$selectedPa.name,
+        isUnderConstruction = _configMap$selectedPa.isUnderConstruction;
 
 
     var isConnected = name === configMap.Firefox.name ? this.state.firefoxConnected : this.state.chromeConnected;
     var isNodeSelected = name === configMap.Node.name;
 
     if (isNodeSelected) {
-      return dom.h3({}, "Run a node script in the terminal with `--inspect`");
+      return dom.div({ className: "launch-action-container" }, dom.h3({}, "Run a node script in the terminal with `--inspect`"), isUnderConstruction ? this.renderExperimentalMessage(name) : null);
     }
 
     var connectedStateText = isNodeSelected ? null : `Please open a tab in ${name}`;
 
-    return isConnected ? connectedStateText : dom.input({
-      type: "button",
-      value: `Launch ${configMap[selectedPane].name}`,
-      onClick: () => this.launchBrowser(configMap[selectedPane].name)
-    });
+    return isConnected ? connectedStateText : this.renderLaunchButton(name, isUnderConstruction);
+  },
+
+  renderLaunchButton(browserName, isUnderConstruction) {
+    return dom.div({ className: "launch-action-container" }, dom.button({ onClick: () => this.launchBrowser(browserName) }, `Launch ${browserName}`), isUnderConstruction ? this.renderExperimentalMessage(browserName) // eslint-disable-line max-len
+    : null);
+  },
+
+  renderExperimentalMessage(browserName) {
+    var underConstructionMessage = "Debugging is experimental and certain features won't work (i.e, seeing variables, attaching breakpoints)"; // eslint-disable-line max-len
+    var githubIssuesUrl = "https://github.com/devtools-html/debugger.html/issues?q=is%3Aopen+is%3Aissue+label%3A";
+    var underConstructionImageSrc = __webpack_require__(855);
+    return dom.div({ className: "under-construction" }, dom.img({ src: underConstructionImageSrc }), dom.div({ className: "under-construction-message" }, underConstructionMessage, // eslint-disable-line max-len
+    dom.a({ className: "github-link",
+      href: `${githubIssuesUrl}${browserName}`,
+      target: "_blank" }, "Help us make it happen")));
   },
 
   launchBrowser(browser) {
     fetch("/launch", {
       body: JSON.stringify({ browser }),
       headers: {
         "Content-Type": "application/json"
       },
@@ -14004,17 +14020,17 @@ var LandingPage = React.createClass({
         this.setState({ chromeConnected: true });
       }
     }).catch(err => {
       alert(`Error launching ${browser}. ${err.message}`);
     });
   },
 
   renderEmptyPanel() {
-    return dom.div({ className: "hero" }, this.renderLaunchButton());
+    return dom.div({ className: "hero" }, this.renderLaunchOptions());
   },
 
   renderSettings() {
     var _props = this.props,
         config = _props.config,
         setValue = _props.setValue;
 
 
@@ -14022,19 +14038,19 @@ var LandingPage = React.createClass({
   },
 
   renderFilter() {
     var selectedPane = this.state.selectedPane;
     var _props2 = this.props,
         tabs = _props2.tabs,
         _props2$filterString = _props2.filterString,
         filterString = _props2$filterString === undefined ? "" : _props2$filterString;
-    var _configMap$selectedPa = configMap[selectedPane],
-        clientType = _configMap$selectedPa.clientType,
-        paramName = _configMap$selectedPa.paramName;
+    var _configMap$selectedPa2 = configMap[selectedPane],
+        clientType = _configMap$selectedPa2.clientType,
+        paramName = _configMap$selectedPa2.paramName;
 
 
     var targets = getTabsByClientType(tabs, clientType);
 
     return dom.header({}, dom.input({
       ref: "filterInput",
       placeholder: "Filter tabs",
       value: filterString,
@@ -14049,20 +14065,20 @@ var LandingPage = React.createClass({
     }));
   },
 
   renderPanel() {
     var _props3 = this.props,
         onTabClick = _props3.onTabClick,
         tabs = _props3.tabs;
     var selectedPane = this.state.selectedPane;
-    var _configMap$selectedPa2 = configMap[selectedPane],
-        name = _configMap$selectedPa2.name,
-        clientType = _configMap$selectedPa2.clientType,
-        paramName = _configMap$selectedPa2.paramName;
+    var _configMap$selectedPa3 = configMap[selectedPane],
+        name = _configMap$selectedPa3.name,
+        clientType = _configMap$selectedPa3.clientType,
+        paramName = _configMap$selectedPa3.paramName;
 
 
     var clientTargets = getTabsByClientType(tabs, clientType);
     var tabsDetected = clientTargets && clientTargets.count() > 0;
     var targets = clientTargets.filter(t => !t.get("filteredOut"));
 
     var isSettingsPaneSelected = name === configMap.Settings.name;
 
@@ -14079,19 +14095,19 @@ var LandingPage = React.createClass({
 
   render() {
     var _props4 = this.props,
         supportsFirefox = _props4.supportsFirefox,
         supportsChrome = _props4.supportsChrome,
         title = _props4.title;
     var selectedPane = this.state.selectedPane;
     var onSideBarItemClick = this.onSideBarItemClick;
-    var _configMap$selectedPa3 = configMap[selectedPane],
-        name = _configMap$selectedPa3.name,
-        docsUrlPart = _configMap$selectedPa3.docsUrlPart;
+    var _configMap$selectedPa4 = configMap[selectedPane],
+        name = _configMap$selectedPa4.name,
+        docsUrlPart = _configMap$selectedPa4.docsUrlPart;
 
 
     return dom.div({
       className: "landing-page"
     }, Sidebar({
       supportsFirefox,
       supportsChrome,
       title,
@@ -14317,17 +14333,17 @@ function combineReducers(reducers) {
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(681);
+__webpack_require__(852);
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 function getTabURL(tab, paramName) {
   var tabID = tab.get("id");
   return `/?${paramName}=${tabID}`;
 }
@@ -14553,63 +14569,73 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBP
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(682);
+__webpack_require__(853);
+var rocketSvg = __webpack_require__(1126);
+
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 var Sidebar = React.createClass({
   displayName: "Sidebar",
 
   propTypes: {
     supportsFirefox: React.PropTypes.bool.isRequired,
     supportsChrome: React.PropTypes.bool.isRequired,
     title: React.PropTypes.string.isRequired,
     selectedPane: React.PropTypes.string.isRequired,
     onSideBarItemClick: React.PropTypes.func.isRequired
   },
 
-  render() {
-    var connections = [];
-
-    if (this.props.supportsFirefox) {
-      connections.push("Firefox");
-    }
-
-    if (this.props.supportsChrome) {
-      connections.push("Chrome", "Node");
-    }
-
-    connections.push("Settings");
-
-    return dom.aside({
-      className: "sidebar"
-    }, dom.h1({}, this.props.title), dom.ul({}, connections.map(title => dom.li({
+  renderTitle(title) {
+    return dom.div({ className: "title-wrapper" }, dom.h1({}, title), dom.div({ className: "launchpad-container" }, dom.div({
+      className: "launchpad-container-icon",
+      dangerouslySetInnerHTML: { __html: rocketSvg }
+    }), dom.h2({ className: "launchpad-container-title" }, "Launchpad")));
+  },
+
+  renderItem(title) {
+    return dom.li({
       className: classnames({
         selected: title == this.props.selectedPane
       }),
       key: title,
       tabIndex: 0,
       role: "button",
       onClick: () => this.props.onSideBarItemClick(title),
       onKeyDown: e => {
         if (e.keyCode === 13) {
           this.props.onSideBarItemClick(title);
         }
       }
-    }, dom.a({}, title)))));
-  }
-});
+    }, dom.a({}, title));
+  },
+
+  render() {
+    var connections = [];
+
+    if (this.props.supportsFirefox) {
+      connections.push("Firefox");
+    }
+
+    if (this.props.supportsChrome) {
+      connections.push("Chrome", "Node");
+    }
+
+    return dom.aside({
+      className: "sidebar"
+    }, this.renderTitle(this.props.title), dom.ul({}, connections.map(title => this.renderItem(title)), this.renderItem("Settings")));
+  } });
 
 module.exports = Sidebar;
 
 /***/ }),
 /* 177 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -15208,17 +15234,17 @@ module.exports = {
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var classnames = __webpack_require__(175);
-__webpack_require__(684);
+__webpack_require__(856);
 
 module.exports = function (className) {
   var root = document.createElement("div");
   root.className = classnames(className);
   root.style.setProperty("flex", 1);
   return root;
 };
 
@@ -15636,17 +15662,17 @@ function createPrettySource(sourceId) {
   return (() => {
     var _ref = _asyncToGenerator(function* (_ref2) {
       var dispatch = _ref2.dispatch,
           getState = _ref2.getState,
           sourceMaps = _ref2.sourceMaps;
 
       var source = (0, _selectors.getSource)(getState(), sourceId).toJS();
       var url = (0, _source.getPrettySourceURL)(source.url);
-      var id = sourceMaps.generatedToOriginalId(sourceId, url);
+      var id = yield sourceMaps.generatedToOriginalId(sourceId, url);
 
       var _ref3 = yield (0, _prettyPrint.prettyPrint)({
         source,
         url
       }),
           code = _ref3.code,
           mappings = _ref3.mappings;
 
@@ -15659,17 +15685,17 @@ function createPrettySource(sourceId) {
 
       var prettySource = {
         url,
         id,
         isPrettyPrinted: true,
         text: code,
         contentType: "text/javascript",
         frames,
-        loading: false
+        loadedState: "loaded"
       };
 
       return dispatch({
         type: "ADD_SOURCE",
         source: prettySource
       });
     });
 
@@ -15895,18 +15921,20 @@ function thunk(makeArgs) {
       return typeof action === "function" ? action(makeArgs ? makeArgs(args, getState()) : args) : next(action);
     };
   };
 }
 
 /***/ }),
 /* 225 */,
 /* 226 */
-/***/ (function(module, exports, __webpack_require__) {
-
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 // @flow
 
 const { isDevelopment } = __webpack_require__(828);
 const { Services, PrefsHelper } = __webpack_require__(830);
 
 const prefsSchemaVersion = "1.0.2";
 
 const pref = Services.pref;
@@ -15924,16 +15952,17 @@ if (isDevelopment()) {
   pref("devtools.debugger.pending-selected-location", "{}");
   pref("devtools.debugger.pending-breakpoints", "{}");
   pref("devtools.debugger.expressions", "[]");
   pref("devtools.debugger.file-search-case-sensitive", false);
   pref("devtools.debugger.file-search-whole-word", false);
   pref("devtools.debugger.file-search-regex-match", false);
   pref("devtools.debugger.prefs-schema-version", "1.0.1");
   pref("devtools.debugger.project-text-search-enabled", true);
+  pref("devtools.debugger.features.async-stepping", false);
 }
 
 const prefs = new PrefsHelper("devtools", {
   clientSourceMapsEnabled: ["Bool", "debugger.client-source-maps-enabled"],
   pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
   ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
   callStackVisible: ["Bool", "debugger.call-stack-visible"],
   scopesVisible: ["Bool", "debugger.scopes-visible"],
@@ -15949,25 +15978,33 @@ const prefs = new PrefsHelper("devtools"
   fileSearchRegexMatch: ["Bool", "debugger.file-search-regex-match"],
   debuggerPrefsSchemaVersion: ["Char", "debugger.prefs-schema-version"],
   projectTextSearchEnabled: [
     "Bool",
     "debugger.project-text-search-enabled",
     false
   ]
 });
+/* harmony export (immutable) */ __webpack_exports__["prefs"] = prefs;
+
+
+const features = new PrefsHelper("devtools.debugger.features", {
+  asyncStepping: ["Bool", "async-stepping", false]
+});
+/* harmony export (immutable) */ __webpack_exports__["features"] = features;
+
+
+debugger;
 
 if (prefs.debuggerPrefsSchemaVersion !== prefsSchemaVersion) {
   // clear pending Breakpoints
   prefs.pendingBreakpoints = {};
   prefs.debuggerPrefsSchemaVersion = prefsSchemaVersion;
 }
 
-module.exports = { prefs };
-
 
 /***/ }),
 /* 227 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -16014,53 +16051,62 @@ var _ast2 = _interopRequireDefault(_ast)
 var _coverage = __webpack_require__(241);
 
 var _coverage2 = _interopRequireDefault(_coverage);
 
 var _projectTextSearch = __webpack_require__(31);
 
 var _projectTextSearch2 = _interopRequireDefault(_projectTextSearch);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _sourceSearch = __webpack_require__(1132);
+
+var _sourceSearch2 = _interopRequireDefault(_sourceSearch);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* 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/. */
 
 exports.default = {
   expressions: _expressions2.default,
   eventListeners: _eventListeners2.default,
   sources: _sources2.default,
   breakpoints: _breakpoints2.default,
   pendingBreakpoints: _pendingBreakpoints2.default,
   asyncRequests: _asyncRequests2.default,
   pause: _pause2.default,
   ui: _ui2.default,
   ast: _ast2.default,
   coverage: _coverage2.default,
-  projectTextSearch: _projectTextSearch2.default
-}; /* 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/. */
+  projectTextSearch: _projectTextSearch2.default,
+  sourceSearch: _sourceSearch2.default
+};
 
 /***/ }),
 /* 228 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getVisibleExpressions = exports.getExpressions = exports.State = undefined;
+exports.getExpressions = exports.State = undefined;
 exports.getExpression = getExpression;
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _immutable = __webpack_require__(146);
 
+var _lodash = __webpack_require__(2);
+
 var _reselect = __webpack_require__(993);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var State = exports.State = (0, _makeRecord2.default)({
   expressions: (0, _immutable.List)(restoreExpressions())
@@ -16070,34 +16116,31 @@ function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : State();
   var action = arguments[1];
 
   switch (action.type) {
     case "ADD_EXPRESSION":
       return appendToList(state, ["expressions"], {
         input: action.input,
         value: null,
-        updating: true,
-        visible: action.visible
+        updating: true
       });
     case "UPDATE_EXPRESSION":
       var key = action.expression.input;
       return updateItemInList(state, ["expressions"], key, {
         input: action.input,
         value: null,
-        updating: true,
-        visible: action.visible
+        updating: true
       });
     case "EVALUATE_EXPRESSION":
       if (action.status === "done") {
         return updateItemInList(state, ["expressions"], action.input, {
           input: action.input,
           value: action.value,
-          updating: false,
-          visible: action.visible
+          updating: false
         });
       }
       break;
     case "DELETE_EXPRESSION":
       return deleteExpression(state, action.input);
   }
 
   return state;
@@ -16107,17 +16150,19 @@ function restoreExpressions() {
   var exprs = _prefs.prefs.expressions;
   if (exprs.length == 0) {
     return;
   }
   return exprs;
 }
 
 function storeExpressions(state) {
-  _prefs.prefs.expressions = state.getIn(["expressions"]).filter(e => e.visible).toJS();
+  var expressions = state.getIn(["expressions"]).map(expression => (0, _lodash.omit)(expression, "value")).toJS();
+
+  _prefs.prefs.expressions = expressions;
 }
 
 function appendToList(state, path, value) {
   var newState = state.updateIn(path, () => {
     return state.getIn(path).push(value);
   });
   storeExpressions(newState);
   return newState;
@@ -16139,18 +16184,16 @@ function deleteExpression(state, input) 
   storeExpressions(newState);
   return newState;
 }
 
 var getExpressionsWrapper = state => state.expressions;
 
 var getExpressions = exports.getExpressions = (0, _reselect.createSelector)(getExpressionsWrapper, expressions => expressions.get("expressions"));
 
-var getVisibleExpressions = exports.getVisibleExpressions = (0, _reselect.createSelector)(getExpressions, expressions => expressions.filter(e => e.visible));
-
 function getExpression(state, input) {
   return getExpressions(state).find(exp => exp.input == input);
 }
 
 exports.default = update;
 
 /***/ }),
 /* 229 */,
@@ -16387,43 +16430,43 @@ function update() {
       }
       break;
 
     case "TOGGLE_PRETTY_PRINT":
       return setSourceTextProps(state, action);
 
     case "NAVIGATE":
       var source = getSelectedSource({ sources: state });
-      var _url = source && source.get("url");
-
-      if (!_url) {
+      var url = source && source.get("url");
+
+      if (!url) {
         return initialState();
       }
 
-      return initialState().set("pendingSelectedLocation", { url: _url });
+      return initialState().set("pendingSelectedLocation", { url });
   }
 
   return state;
 }
 
 function getTextPropsFromAction(action) {
   var source = action.source;
   var value = action.value;
 
 
   if (action.status === "start") {
-    return { id: source.id, loading: true };
+    return { id: source.id, loadedState: "loading" };
   } else if (action.status === "error") {
-    return { id: source.id, error: action.error, loading: false };
+    return { id: source.id, error: action.error, loadedState: "loaded" };
   }
   return {
     text: value.text,
     id: source.id,
     contentType: value.contentType,
-    loading: false
+    loadedState: "loaded"
   };
 }
 
 // TODO: Action is coerced to `any` unfortunately because how we type
 // asynchronous actions is wrong. The `value` may be null for the
 // "start" and "error" states but we don't type it like that. We need
 // to rethink how we type async actions.
 function setSourceTextProps(state, action) {
@@ -16607,17 +16650,17 @@ exports.default = update;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isPretty = exports.isJavaScript = undefined;
+exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isPretty = exports.isJavaScript = undefined;
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _utils = __webpack_require__(234);
 
 var _path = __webpack_require__(235);
 
 var _url = __webpack_require__(334);
@@ -16817,26 +16860,31 @@ function getMode(source) {
 
   if (isHTMLLike) {
     return { name: "htmlmixed" };
   }
 
   return { name: "text" };
 }
 
+function isLoaded(source) {
+  return source.loadedState === "loaded";
+}
+
 exports.isJavaScript = isJavaScript;
 exports.isPretty = isPretty;
 exports.shouldPrettyPrint = shouldPrettyPrint;
 exports.getPrettySourceURL = getPrettySourceURL;
 exports.getRawSourceURL = getRawSourceURL;
 exports.getFilename = getFilename;
 exports.getFilenameFromURL = getFilenameFromURL;
 exports.getSourcePath = getSourcePath;
 exports.getSourceLineCount = getSourceLineCount;
 exports.getMode = getMode;
+exports.isLoaded = isLoaded;
 
 /***/ }),
 /* 234 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -16969,16 +17017,17 @@ exports.join = join;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getHiddenBreakpointLocation = exports.getHiddenBreakpoint = undefined;
 
 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; };
 /* 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/. */
 
 /**
  * Breakpoints reducer
@@ -16999,16 +17048,18 @@ var I = _interopRequireWildcard(_immutab
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _breakpoint2 = __webpack_require__(1057);
 
+var _reselect = __webpack_require__(993);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function initialState() {
   return (0, _makeRecord2.default)({
     breakpoints: I.Map(),
     breakpointsDisabled: false
@@ -17146,16 +17197,28 @@ function getBreakpointsForSource(state, 
   var breakpoints = getBreakpoints(state);
 
   return breakpoints.filter(bp => {
     var location = isGeneratedSource ? bp.generatedLocation || bp.location : bp.location;
     return location.sourceId === sourceId;
   });
 }
 
+var getHiddenBreakpoint = exports.getHiddenBreakpoint = (0, _reselect.createSelector)(getBreakpoints, function (breakpoints) {
+  var hiddenBreakpoints = breakpoints.valueSeq().filter(breakpoint => breakpoint.hidden).first();
+  return hiddenBreakpoints;
+});
+
+var getHiddenBreakpointLocation = exports.getHiddenBreakpointLocation = (0, _reselect.createSelector)(getHiddenBreakpoint, function (hiddenBreakpoint) {
+  if (!hiddenBreakpoint) {
+    return null;
+  }
+  return hiddenBreakpoint.location;
+});
+
 exports.default = update;
 
 /***/ }),
 /* 237 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -17839,37 +17902,50 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(241);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(31);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
+var _sourceSearch = __webpack_require__(1132);
+
+var sourceSearch = _interopRequireWildcard(_sourceSearch);
+
 var _breakpointAtLocation = __webpack_require__(1134);
 
 var _breakpointAtLocation2 = _interopRequireDefault(_breakpointAtLocation);
 
 var _linesInScope = __webpack_require__(1124);
 
 var _linesInScope2 = _interopRequireDefault(_linesInScope);
 
 var _visibleBreakpoints = __webpack_require__(1135);
 
 var _visibleBreakpoints2 = _interopRequireDefault(_visibleBreakpoints);
 
+var _isSelectedFrameVisible = __webpack_require__(805);
+
+var _isSelectedFrameVisible2 = _interopRequireDefault(_isSelectedFrameVisible);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 /**
  * @param object - location
  */
 
-module.exports = Object.assign({}, expressions, sources, pause, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, { getBreakpointAtLocation: _breakpointAtLocation2.default, getInScopeLines: _linesInScope2.default, getVisibleBreakpoints: _visibleBreakpoints2.default });
+module.exports = Object.assign({}, expressions, sources, pause, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, {
+  getBreakpointAtLocation: _breakpointAtLocation2.default,
+  getInScopeLines: _linesInScope2.default,
+  getVisibleBreakpoints: _visibleBreakpoints2.default,
+  isSelectedFrameVisible: _isSelectedFrameVisible2.default
+});
 
 /***/ }),
 /* 243 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -17890,23 +17966,23 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _ui = __webpack_require__(1128);
 
 var _devtoolsModules = __webpack_require__(830);
 
-__webpack_require__(685);
-
-__webpack_require__(686);
-
-__webpack_require__(687);
-
-__webpack_require__(688);
+__webpack_require__(857);
+
+__webpack_require__(858);
+
+__webpack_require__(859);
+
+__webpack_require__(860);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
 var _ProjectSearch = __webpack_require__(1139);
 
 var _ProjectSearch2 = _interopRequireDefault(_ProjectSearch);
@@ -18146,19 +18222,23 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(322);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(37);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
+var _sourceSearch = __webpack_require__(1143);
+
+var sourceSearch = _interopRequireWildcard(_sourceSearch);
+
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
-exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch);
+exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch, sourceSearch);
 
 /***/ }),
 /* 245 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -18178,26 +18258,28 @@ var _extends = Object.assign || function
  * @module actions/breakpoints
  */
 
 // this will need to be changed so that addCLientBreakpoint is removed
 
 
 exports.syncBreakpoint = syncBreakpoint;
 exports.addBreakpoint = addBreakpoint;
+exports.addHiddenBreakpoint = addHiddenBreakpoint;
 exports.removeBreakpoint = removeBreakpoint;
 exports.enableBreakpoint = enableBreakpoint;
 exports.disableBreakpoint = disableBreakpoint;
 exports.toggleAllBreakpoints = toggleAllBreakpoints;
 exports.toggleBreakpoints = toggleBreakpoints;
 exports.removeAllBreakpoints = removeAllBreakpoints;
 exports.removeBreakpoints = removeBreakpoints;
 exports.remapBreakpoints = remapBreakpoints;
 exports.setBreakpointCondition = setBreakpointCondition;
 exports.toggleBreakpoint = toggleBreakpoint;
+exports.addOrToggleDisabledBreakpoint = addOrToggleDisabledBreakpoint;
 exports.toggleDisabledBreakpoint = toggleDisabledBreakpoint;
 
 var _promise = __webpack_require__(193);
 
 var _selectors = __webpack_require__(242);
 
 var _breakpoint = __webpack_require__(1057);
 
@@ -18216,28 +18298,28 @@ function _interopRequireDefault(obj) { r
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
  * Syncing a breakpoint add breakpoint information that is stored, and
  * contact the server for more data.
  *
  * @memberof actions/breakpoints
  * @static
- * @param {String} $1.source Source  value
+ * @param {String} $1.sourceId String  value
  * @param {PendingBreakpoint} $1.location PendingBreakpoint  value
  */
 function syncBreakpoint(source, pendingBreakpoint) {
   return (_ref) => {
     var dispatch = _ref.dispatch,
         getState = _ref.getState,
         client = _ref.client,
         sourceMaps = _ref.sourceMaps;
 
-		var sourceId = source.id;
-		var _pendingBreakpoint$lo = pendingBreakpoint.location,
+    var sourceId = source.id;
+    var _pendingBreakpoint$lo = pendingBreakpoint.location,
         line = _pendingBreakpoint$lo.line,
         sourceUrl = _pendingBreakpoint$lo.sourceUrl,
         column = _pendingBreakpoint$lo.column;
 
     var location = { sourceId, sourceUrl, line, column };
     var breakpoint = (0, _breakpoint.createBreakpoint)(location, pendingBreakpoint);
 
     var syncPromise = (0, _syncBreakpoint.syncClientBreakpoint)(getState, client, sourceMaps, source, pendingBreakpoint);
@@ -18254,41 +18336,56 @@ function syncBreakpoint(source, pendingB
  * Add a new breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  * @param {String} $1.condition Conditional breakpoint condition value
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 
-function addBreakpoint(location, condition) {
-  var breakpoint = (0, _breakpoint.createBreakpoint)(location, { condition });
+function addBreakpoint(location, condition, hidden) {
+  var breakpoint = (0, _breakpoint.createBreakpoint)(location, { condition, hidden });
   return (_ref2) => {
     var dispatch = _ref2.dispatch,
         getState = _ref2.getState,
         sourceMaps = _ref2.sourceMaps,
         client = _ref2.client;
 
     var action = { type: "ADD_BREAKPOINT", breakpoint };
     var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
     return dispatch(_extends({}, action, { [_promise.PROMISE]: promise }));
   };
 }
 
 /**
+ * Add a new hidden breakpoint
+ *
+ * @memberOf actions/breakpoints
+ * @param location
+ * @return {function(ThunkArgs)}
+ */
+function addHiddenBreakpoint(location) {
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch;
+
+    return dispatch(addBreakpoint(location, "", true));
+  };
+}
+
+/**
  * Remove a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoint(location) {
-  return (_ref3) => {
-    var dispatch = _ref3.dispatch,
-        getState = _ref3.getState,
-        client = _ref3.client;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch,
+        getState = _ref4.getState,
+        client = _ref4.client;
 
     var bp = (0, _selectors.getBreakpoint)(getState(), location);
     if (!bp) {
       throw new Error("attempt to remove breakpoint that does not exist");
     }
 
     if (bp.loading) {
       // TODO(jwl): make this wait until the breakpoint is saved if it
@@ -18320,54 +18417,54 @@ function removeBreakpoint(location) {
  * will reuse the existing breakpoint information that is stored.
  *
  * @memberof actions/breakpoints
  * @static
  * @param {Location} $1.location Location  value
  */
 function enableBreakpoint(location) {
   return (() => {
-    var _ref4 = _asyncToGenerator(function* (_ref5) {
-      var dispatch = _ref5.dispatch,
-          getState = _ref5.getState,
-          client = _ref5.client,
-          sourceMaps = _ref5.sourceMaps;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState,
+          client = _ref6.client,
+          sourceMaps = _ref6.sourceMaps;
 
       var breakpoint = (0, _selectors.getBreakpoint)(getState(), location);
       if (!breakpoint) {
         throw new Error("attempted to enable a breakpoint that does not exist");
       }
 
       var action = { type: "ENABLE_BREAKPOINT", breakpoint };
       var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
       return dispatch({
         type: "ENABLE_BREAKPOINT",
         breakpoint,
         [_promise.PROMISE]: promise
       });
     });
 
     return function (_x) {
-      return _ref4.apply(this, arguments);
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Disable a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function disableBreakpoint(location) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
+    var _ref7 = _asyncToGenerator(function* (_ref8) {
+      var dispatch = _ref8.dispatch,
+          getState = _ref8.getState,
+          client = _ref8.client;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
 
       if (!bp) {
         throw new Error("attempt to disable a breakpoint that does not exist");
       }
 
       if (bp.loading) {
@@ -18381,155 +18478,155 @@ function disableBreakpoint(location) {
 
       return dispatch({
         type: "DISABLE_BREAKPOINT",
         breakpoint: newBreakpoint
       });
     });
 
     return function (_x2) {
-      return _ref6.apply(this, arguments);
+      return _ref7.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle All Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleAllBreakpoints(shouldDisableBreakpoints) {
   return (() => {
-    var _ref8 = _asyncToGenerator(function* (_ref9) {
-      var dispatch = _ref9.dispatch,
-          getState = _ref9.getState;
+    var _ref9 = _asyncToGenerator(function* (_ref10) {
+      var dispatch = _ref10.dispatch,
+          getState = _ref10.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref10 of breakpoints) {
-        var _ref11 = _slicedToArray(_ref10, 2);
-
-        var breakpoint = _ref11[1];
+      for (var _ref11 of breakpoints) {
+        var _ref12 = _slicedToArray(_ref11, 2);
+
+        var breakpoint = _ref12[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
     return function (_x3) {
-      return _ref8.apply(this, arguments);
+      return _ref9.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleBreakpoints(shouldDisableBreakpoints, breakpoints) {
   return (() => {
-    var _ref12 = _asyncToGenerator(function* (_ref13) {
-      var dispatch = _ref13.dispatch;
-
-      for (var _ref14 of breakpoints) {
-        var _ref15 = _slicedToArray(_ref14, 2);
-
-        var breakpoint = _ref15[1];
+    var _ref13 = _asyncToGenerator(function* (_ref14) {
+      var dispatch = _ref14.dispatch;
+
+      for (var _ref15 of breakpoints) {
+        var _ref16 = _slicedToArray(_ref15, 2);
+
+        var breakpoint = _ref16[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
     return function (_x4) {
-      return _ref12.apply(this, arguments);
+      return _ref13.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes all breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeAllBreakpoints() {
   return (() => {
-    var _ref16 = _asyncToGenerator(function* (_ref17) {
-      var dispatch = _ref17.dispatch,
-          getState = _ref17.getState;
+    var _ref17 = _asyncToGenerator(function* (_ref18) {
+      var dispatch = _ref18.dispatch,
+          getState = _ref18.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref18 of breakpoints) {
-        var _ref19 = _slicedToArray(_ref18, 2);
-
-        var breakpoint = _ref19[1];
+      for (var _ref19 of breakpoints) {
+        var _ref20 = _slicedToArray(_ref19, 2);
+
+        var breakpoint = _ref20[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
     return function (_x5) {
-      return _ref16.apply(this, arguments);
+      return _ref17.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoints(breakpoints) {
   return (() => {
-    var _ref20 = _asyncToGenerator(function* (_ref21) {
-      var dispatch = _ref21.dispatch;
-
-      for (var _ref22 of breakpoints) {
-        var _ref23 = _slicedToArray(_ref22, 2);
-
-        var breakpoint = _ref23[1];
+    var _ref21 = _asyncToGenerator(function* (_ref22) {
+      var dispatch = _ref22.dispatch;
+
+      for (var _ref23 of breakpoints) {
+        var _ref24 = _slicedToArray(_ref23, 2);
+
+        var breakpoint = _ref24[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
     return function (_x6) {
-      return _ref20.apply(this, arguments);
+      return _ref21.apply(this, arguments);
     };
   })();
 }
 
 function remapBreakpoints(sourceId) {
   return (() => {
-    var _ref24 = _asyncToGenerator(function* (_ref25) {
-      var dispatch = _ref25.dispatch,
-          getState = _ref25.getState,
-          sourceMaps = _ref25.sourceMaps;
+    var _ref25 = _asyncToGenerator(function* (_ref26) {
+      var dispatch = _ref26.dispatch,
+          getState = _ref26.getState,
+          sourceMaps = _ref26.sourceMaps;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
       var newBreakpoints = yield (0, _remapLocations2.default)(breakpoints, sourceId, sourceMaps);
 
       return dispatch({
         type: "REMAP_BREAKPOINTS",
         breakpoints: newBreakpoints
       });
     });
 
     return function (_x7) {
-      return _ref24.apply(this, arguments);
+      return _ref25.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Update the condition of a breakpoint.
  *
  * @throws {Error} "not implemented"
@@ -18537,61 +18634,66 @@ function remapBreakpoints(sourceId) {
  * @static
  * @param {Location} location
  *        @see DebuggerController.Breakpoints.addBreakpoint
  * @param {string} condition
  *        The condition to set on the breakpoint
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 function setBreakpointCondition(location) {
-  var _ref26 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-      condition = _ref26.condition;
+  var _ref27 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+      condition = _ref27.condition;
 
   return (() => {
-    var _ref27 = _asyncToGenerator(function* (_ref28) {
-      var dispatch = _ref28.dispatch,
-          getState = _ref28.getState,
-          client = _ref28.client,
-          sourceMaps = _ref28.sourceMaps;
+    var _ref28 = _asyncToGenerator(function* (_ref29) {
+      var dispatch = _ref29.dispatch,
+          getState = _ref29.getState,
+          client = _ref29.client,
+          sourceMaps = _ref29.sourceMaps;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
       if (!bp) {
         return dispatch(addBreakpoint(location, condition));
       }
 
       if (bp.loading) {
         // TODO(jwl): when this function is called, make sure the action
         // creator waits for the breakpoint to exist
         throw new Error("breakpoint must be saved");
       }
 
+      if (bp.disabled) {
+        yield dispatch(enableBreakpoint(location));
+        bp.disabled = !bp.disabled;
+      }
+
       yield client.setBreakpointCondition(bp.id, location, condition, sourceMaps.isOriginalId(bp.location.sourceId));
 
       var newBreakpoint = _extends({}, bp, { condition });
 
       (0, _breakpoint.assertBreakpoint)(newBreakpoint);
 
       return dispatch({
         type: "SET_BREAKPOINT_CONDITION",
         breakpoint: newBreakpoint
       });
     });
 
     return function (_x9) {
-      return _ref27.apply(this, arguments);
+      return _ref28.apply(this, arguments);
     };
   })();
 }
 
 function toggleBreakpoint(line, column) {
-  return (_ref29) => {
-    var dispatch = _ref29.dispatch,
-        getState = _ref29.getState,
-        client = _ref29.client,
-        sourceMaps = _ref29.sourceMaps;
+  return (_ref30) => {
+    var dispatch = _ref30.dispatch,
+        getState = _ref30.getState,
+        client = _ref30.client,
+        sourceMaps = _ref30.sourceMaps;
 
     var selectedSource = (0, _selectors.getSelectedSource)(getState());
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
 
     if (bp && bp.loading) {
       return;
     }
 
@@ -18609,22 +18711,50 @@ function toggleBreakpoint(line, column) 
       sourceId: selectedSource.get("id"),
       sourceUrl: selectedSource.get("url"),
       line: line,
       column: column
     }));
   };
 }
 
+function addOrToggleDisabledBreakpoint(line, column) {
+  return (_ref31) => {
+    var dispatch = _ref31.dispatch,
+        getState = _ref31.getState,
+        client = _ref31.client,
+        sourceMaps = _ref31.sourceMaps;
+
+    var selectedSource = (0, _selectors.getSelectedSource)(getState());
+    var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
+
+    if (bp && bp.loading) {
+      return;
+    }
+
+    if (bp) {
+      // NOTE: it's possible the breakpoint has slid to a column
+      return dispatch(toggleDisabledBreakpoint(line, column || bp.location.column));
+    }
+
+    return dispatch(addBreakpoint({
+      sourceId: selectedSource.get("id"),
+      sourceUrl: selectedSource.get("url"),
+      line: line,
+      column: column
+    }));
+  };
+}
+
 function toggleDisabledBreakpoint(line, column) {
-  return (_ref30) => {
-    var dispatch = _ref30.dispatch,
-        getState = _ref30.getState,
-        client = _ref30.client,
-        sourceMaps = _ref30.sourceMaps;
+  return (_ref32) => {
+    var dispatch = _ref32.dispatch,
+        getState = _ref32.getState,
+        client = _ref32.client,
+        sourceMaps = _ref32.sourceMaps;
 
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
     if (bp && bp.loading) {
       return;
     }
 
     if (!bp) {
       throw new Error("attempt to disable breakpoint that does not exist");
@@ -19003,145 +19133,132 @@ function _asyncToGenerator(fn) { return 
  * Add expression for debugger to watch
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
  * @static
  */
 function addExpression(input) {
-  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-      _ref$visible = _ref.visible,
-      visible = _ref$visible === undefined ? true : _ref$visible;
-
   return (() => {
-    var _ref2 = _asyncToGenerator(function* (_ref3) {
-      var dispatch = _ref3.dispatch,
-          getState = _ref3.getState;
+    var _ref = _asyncToGenerator(function* (_ref2) {
+      var dispatch = _ref2.dispatch,
+          getState = _ref2.getState;
 
       if (!input) {
         return;
       }
 
       var expression = (0, _selectors.getExpression)(getState(), input);
-      if (expression && expression.visible) {
-        return;
-      }
-
-      // Lets make the expression visible
       if (expression) {
         return dispatch({
           type: "UPDATE_EXPRESSION",
           expression,
-          input,
-          visible: true
+          input
         });
       }
 
       dispatch({
         type: "ADD_EXPRESSION",
-        input,
-        visible
+        input
       });
 
       var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
       var selectedFrameId = selectedFrame ? selectedFrame.id : null;
-      dispatch(evaluateExpression({ input, visible }, selectedFrameId));
-    });
-
-    return function (_x2) {
-      return _ref2.apply(this, arguments);
+      dispatch(evaluateExpression({ input }, selectedFrameId));
+    });
+
+    return function (_x) {
+      return _ref.apply(this, arguments);
     };
   })();
 }
 
 function updateExpression(input, expression) {
-  return (_ref4) => {
-    var dispatch = _ref4.dispatch,
-        getState = _ref4.getState;
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch,
+        getState = _ref3.getState;
 
     if (!input || input == expression.input) {
       return;
     }
 
     dispatch({
       type: "UPDATE_EXPRESSION",
       expression,
-      input: input,
-      visible: expression.visible
+      input: input
     });
 
     var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
     var selectedFrameId = selectedFrame ? selectedFrame.id : null;
     dispatch(evaluateExpressions(selectedFrameId));
   };
 }
 
 /**
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
  * @static
  */
 function deleteExpression(expression) {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch;
 
     dispatch({
       type: "DELETE_EXPRESSION",
       input: expression.input
     });
   };
 }
 
 /**
  *
  * @memberof actions/pause
  * @param {number} selectedFrameId
  * @static
  */
 function evaluateExpressions(frameId) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState,
+          client = _ref6.client;
 
       var expressions = (0, _selectors.getExpressions)(getState()).toJS();
       if (!frameId) {
         var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
         frameId = selectedFrame ? selectedFrame.id : null;
       }
       for (var expression of expressions) {
         yield dispatch(evaluateExpression(expression, frameId));
       }
     });
 
-    return function (_x3) {
-      return _ref6.apply(this, arguments);
+    return function (_x2) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 function evaluateExpression(expression, frameId) {
-  return function (_ref8) {
-    var dispatch = _ref8.dispatch,
-        getState = _ref8.getState,
-        client = _ref8.client;
+  return function (_ref7) {
+    var dispatch = _ref7.dispatch,
+        getState = _ref7.getState,
+        client = _ref7.client;
 
     if (!expression.input) {
       console.warn("Expressions should not be empty");
       return;
     }
 
     return dispatch({
       type: "EVALUATE_EXPRESSION",
       input: expression.input,
-      visible: expression.visible,
       [_promise.PROMISE]: client.evaluate(expression.input, { frameId })
     });
   };
 }
 
 /***/ }),
 /* 253 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -19354,47 +19471,63 @@ function updateEventBreakpoints(eventNam
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 
+// If a request has been made to show this source, go ahead and
+// select it.
+var checkSelectedSource = (() => {
+  var _ref = _asyncToGenerator(function* (state, dispatch, source) {
+    var pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
+
+    if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
+      yield dispatch(selectSource(source.id, { line: pendingLocation.line }));
+    }
+  });
+
+  return function checkSelectedSource(_x, _x2, _x3) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
 var checkPendingBreakpoint = (() => {
-  var _ref = _asyncToGenerator(function* (state, dispatch, pendingBreakpoint, source) {
+  var _ref2 = _asyncToGenerator(function* (state, dispatch, pendingBreakpoint, source) {
     var sourceUrl = pendingBreakpoint.location.sourceUrl;
 
     var sameSource = sourceUrl && sourceUrl === source.url;
 
     if (sameSource) {
       yield dispatch((0, _breakpoints.syncBreakpoint)(source, pendingBreakpoint));
     }
   });
 
-  return function checkPendingBreakpoint(_x, _x2, _x3, _x4) {
-    return _ref.apply(this, arguments);
+  return function checkPendingBreakpoint(_x4, _x5, _x6, _x7) {
+    return _ref2.apply(this, arguments);
   };
 })();
 
 var checkPendingBreakpoints = (() => {
-  var _ref2 = _asyncToGenerator(function* (state, dispatch, source) {
+  var _ref3 = _asyncToGenerator(function* (state, dispatch, source) {
     var pendingBreakpoints = (0, _selectors.getPendingBreakpoints)(state);
     if (!pendingBreakpoints) {
       return;
     }
 
     var pendingBreakpointsArray = pendingBreakpoints.valueSeq().toJS();
     for (var pendingBreakpoint of pendingBreakpointsArray) {
       yield checkPendingBreakpoint(state, dispatch, pendingBreakpoint, source);
     }
   });
 
-  return function checkPendingBreakpoints(_x5, _x6, _x7) {
-    return _ref2.apply(this, arguments);
+  return function checkPendingBreakpoints(_x8, _x9, _x10) {
+    return _ref3.apply(this, arguments);
   };
 })();
 
 /**
  * Handler for the debugger client's unsolicited newSource notification.
  * @memberof actions/sources
  * @static
  */
@@ -19444,78 +19577,69 @@ function _asyncToGenerator(fn) { return 
  * 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/. */
 
 /**
  * Redux actions for the sources state
  * @module actions/sources
  */
 
-// If a request has been made to show this source, go ahead and
-// select it.
-function checkSelectedSource(state, dispatch, source) {
-  var pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
-
-  if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
-    dispatch(selectSource(source.id, { line: pendingLocation.line }));
-  }
-}
-
 function newSource(source) {
   return (() => {
-    var _ref3 = _asyncToGenerator(function* (_ref4) {
-      var dispatch = _ref4.dispatch,
-          getState = _ref4.getState;
+    var _ref4 = _asyncToGenerator(function* (_ref5) {
+      var dispatch = _ref5.dispatch,
+          getState = _ref5.getState;
 
       dispatch({ type: "ADD_SOURCE", source });
+
       if (_prefs.prefs.clientSourceMapsEnabled) {
         yield dispatch(loadSourceMap(source));
       }
 
-      checkSelectedSource(getState(), dispatch, source);
+      yield checkSelectedSource(getState(), dispatch, source);
       yield checkPendingBreakpoints(getState(), dispatch, source);
     });
 
-    return function (_x8) {
-      return _ref3.apply(this, arguments);
+    return function (_x11) {
+      return _ref4.apply(this, arguments);
     };
   })();
 }
 
 function newSources(sources) {
   return (() => {
-    var _ref5 = _asyncToGenerator(function* (_ref6) {
-      var dispatch = _ref6.dispatch,
-          getState = _ref6.getState;
+    var _ref6 = _asyncToGenerator(function* (_ref7) {
+      var dispatch = _ref7.dispatch,
+          getState = _ref7.getState;
 
       var filteredSources = sources.filter(function (source) {
         return !(0, _selectors.getSource)(getState(), source.id);
       });
 
       for (var source of filteredSources) {
         yield dispatch(newSource(source));
       }
     });
 
-    return function (_x9) {
-      return _ref5.apply(this, arguments);
+    return function (_x12) {
+      return _ref6.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceMap(generatedSource) {
   return (() => {
-    var _ref7 = _asyncToGenerator(function* (_ref8) {
-      var dispatch = _ref8.dispatch,
-          getState = _ref8.getState,
-          sourceMaps = _ref8.sourceMaps;
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          sourceMaps = _ref9.sourceMaps;
 
       var urls = yield sourceMaps.getOriginalURLs(generatedSource);
       if (!urls) {
         // If this source doesn't have a sourcemap, do nothing.
         return;
       }
 
       var state = getState();
@@ -19530,63 +19654,69 @@ function loadSourceMap(generatedSource) 
       dispatch({ type: "ADD_SOURCES", sources: originalSources });
 
       originalSources.forEach(function (source) {
         checkSelectedSource(state, dispatch, source);
         checkPendingBreakpoints(state, dispatch, source);
       });
     });
 
-    return function (_x10) {
-      return _ref7.apply(this, arguments);
+    return function (_x13) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Deterministically select a source that has a given URL. This will
  * work regardless of the connection status or if the source exists
  * yet. This exists mostly for external things to interact with the
  * debugger.
  *
  * @memberof actions/sources
  * @static
  */
 function selectSourceURL(url) {
   var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-  return (_ref9) => {
-    var dispatch = _ref9.dispatch,
-        getState = _ref9.getState;
-
-    var source = (0, _selectors.getSourceByURL)(getState(), url);
-    if (source) {
-      dispatch(selectSource(source.get("id"), options));
-    } else {
-      dispatch({
-        type: "SELECT_SOURCE_URL",
-        url: url,
-        tabIndex: options.tabIndex,
-        line: options.line
-      });
-    }
-  };
+  return (() => {
+    var _ref10 = _asyncToGenerator(function* (_ref11) {
+      var dispatch = _ref11.dispatch,
+          getState = _ref11.getState;
+
+      var source = (0, _selectors.getSourceByURL)(getState(), url);
+      if (source) {
+        yield dispatch(selectSource(source.get("id"), options));
+      } else {
+        dispatch({
+          type: "SELECT_SOURCE_URL",
+          url: url,
+          tabIndex: options.tabIndex,
+          line: options.line
+        });
+      }
+    });
+
+    return function (_x15) {
+      return _ref10.apply(this, arguments);
+    };
+  })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function selectSource(id) {
   var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-  return (_ref10) => {
-    var dispatch = _ref10.dispatch,
-        getState = _ref10.getState,
-        client = _ref10.client;
+  return (_ref12) => {
+    var dispatch = _ref12.dispatch,
+        getState = _ref12.getState,
+        client = _ref12.client;
 
     if (!client) {
       // No connection, do nothing. This happens when the debugger is
       // shut down too fast and it tries to display a default source.
       return;
     }
 
     var source = (0, _selectors.getSource)(getState(), id);
@@ -19616,39 +19746,39 @@ function selectSource(id) {
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function jumpToMappedLocation(sourceLocation) {
   return (() => {
-    var _ref12 = _asyncToGenerator(function* (_ref13) {
-      var dispatch = _ref13.dispatch,
-          getState = _ref13.getState,
-          client = _ref13.client,
-          sourceMaps = _ref13.sourceMaps;
+    var _ref14 = _asyncToGenerator(function* (_ref15) {
+      var dispatch = _ref15.dispatch,
+          getState = _ref15.getState,
+          client = _ref15.client,
+          sourceMaps = _ref15.sourceMaps;
 
       if (!client) {
         return;
       }
 
       var source = (0, _selectors.getSource)(getState(), sourceLocation.sourceId);
       var pairedLocation = void 0;
       if (sourceMaps.isOriginalId(sourceLocation.sourceId)) {
         pairedLocation = yield sourceMaps.getGeneratedLocation(sourceLocation, source.toJS());
       } else {
         pairedLocation = yield sourceMaps.getOriginalLocation(sourceLocation, source.toJS());
       }
 
       return dispatch(selectSource(pairedLocation.sourceId, { line: pairedLocation.line }));
     });
 
-    return function (_x13) {
-      return _ref12.apply(this, arguments);
+    return function (_x17) {
+      return _ref14.apply(this, arguments);
     };
   })();
 }
 
 function addTab(source, tabIndex) {
   return {
     type: "ADD_TAB",
     source,
@@ -19664,39 +19794,39 @@ function moveTab(url, tabIndex) {
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function closeTab(url) {
-  return (_ref14) => {
-    var dispatch = _ref14.dispatch,
-        getState = _ref14.getState,
-        client = _ref14.client;
+  return (_ref16) => {
+    var dispatch = _ref16.dispatch,
+        getState = _ref16.getState,
+        client = _ref16.client;
 
     (0, _editor.removeDocument)(url);
     var tabs = (0, _selectors.removeSourceFromTabList)((0, _selectors.getSourceTabs)(getState()), url);
     var sourceId = (0, _selectors.getNewSelectedSourceId)(getState(), tabs);
 
     dispatch({ type: "CLOSE_TAB", url, tabs });
     dispatch(selectSource(sourceId));
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function closeTabs(urls) {
-  return (_ref15) => {
-    var dispatch = _ref15.dispatch,
-        getState = _ref15.getState,
-        client = _ref15.client;
+  return (_ref17) => {
+    var dispatch = _ref17.dispatch,
+        getState = _ref17.getState,
+        client = _ref17.client;
 
     urls.forEach(url => {
       var source = (0, _selectors.getSourceByURL)(getState(), url);
       if (source) {
         (0, _editor.removeDocument)(source.get("id"));
       }
     });
 
@@ -19717,25 +19847,25 @@ function closeTabs(urls) {
  * @static
  * @param string id The source form from the RDP.
  * @returns Promise
  *          A promise that resolves to [aSource, prettyText] or rejects to
  *          [aSource, error].
  */
 function togglePrettyPrint(sourceId) {
   return (() => {
-    var _ref16 = _asyncToGenerator(function* (_ref17) {
-      var dispatch = _ref17.dispatch,
-          getState = _ref17.getState,
-          client = _ref17.client,
-          sourceMaps = _ref17.sourceMaps;
+    var _ref18 = _asyncToGenerator(function* (_ref19) {
+      var dispatch = _ref19.dispatch,
+          getState = _ref19.getState,
+          client = _ref19.client,
+          sourceMaps = _ref19.sourceMaps;
 
       var source = (0, _selectors.getSource)(getState(), sourceId).toJS();
 
-      if (source && source.loading) {
+      if (source && !(0, _source.isLoaded)(source)) {
         return {};
       }
 
       (0, _assert2.default)(sourceMaps.isGeneratedId(sourceId), "Pretty-printing only allowed on generated sources");
 
       var selectedLocation = (0, _selectors.getSelectedLocation)(getState());
       var selectedOriginalLocation = selectedLocation ? yield sourceMaps.getOriginalLocation(selectedLocation) : {};
 
@@ -19743,67 +19873,68 @@ function togglePrettyPrint(sourceId) {
       var prettySource = (0, _selectors.getSourceByURL)(getState(), url);
 
       if (prettySource) {
         return dispatch(selectSource(prettySource.get("id"), {
           line: selectedOriginalLocation.line
         }));
       }
 
-      var _ref18 = yield dispatch((0, _createPrettySource.createPrettySource)(sourceId)),
-          newPrettySource = _ref18.source;
+      var _ref20 = yield dispatch((0, _createPrettySource.createPrettySource)(sourceId)),
+          newPrettySource = _ref20.source;
 
       yield dispatch((0, _breakpoints.remapBreakpoints)(sourceId));
+      yield dispatch((0, _ast.setEmptyLines)(newPrettySource.id));
 
       return dispatch(selectSource(newPrettySource.id, {
         line: selectedOriginalLocation.line
       }));
     });
 
-    return function (_x14) {
-      return _ref16.apply(this, arguments);
+    return function (_x18) {
+      return _ref18.apply(this, arguments);
     };
   })();
 }
 
 function toggleBlackBox(source) {
   return (() => {
-    var _ref19 = _asyncToGenerator(function* (_ref20) {
-      var dispatch = _ref20.dispatch,
-          getState = _ref20.getState,
-          client = _ref20.client,
-          sourceMaps = _ref20.sourceMaps;
+    var _ref21 = _asyncToGenerator(function* (_ref22) {
+      var dispatch = _ref22.dispatch,
+          getState = _ref22.getState,
+          client = _ref22.client,
+          sourceMaps = _ref22.sourceMaps;
       var isBlackBoxed = source.isBlackBoxed,
           id = source.id;
 
 
       return dispatch({
         type: "BLACKBOX",
         source,
         [_promise.PROMISE]: client.blackBox(id, isBlackBoxed)
       });
     });
 
-    return function (_x15) {
-      return _ref19.apply(this, arguments);
+    return function (_x19) {
+      return _ref21.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceText(source) {
   return (() => {
-    var _ref21 = _asyncToGenerator(function* (_ref22) {
-      var dispatch = _ref22.dispatch,
-          getState = _ref22.getState,
-          client = _ref22.client,
-          sourceMaps = _ref22.sourceMaps;
+    var _ref23 = _asyncToGenerator(function* (_ref24) {
+      var dispatch = _ref24.dispatch,
+          getState = _ref24.getState,
+          client = _ref24.client,
+          sourceMaps = _ref24.sourceMaps;
 
       // Fetch the source text only once.
       if (source.text) {
         return Promise.resolve(source);
       }
 
       yield dispatch({
         type: "LOAD_SOURCE_TEXT",
@@ -19819,73 +19950,94 @@ function loadSourceText(source) {
             id: source.id,
             text: response.source,
             contentType: response.contentType || "text/javascript"
           };
         })()
       });
 
       yield dispatch((0, _ast.setSymbols)(source.id));
-    });
-
-    return function (_x16) {
-      return _ref21.apply(this, arguments);
+      yield dispatch((0, _ast.setEmptyLines)(source.id));
+    });
+
+    return function (_x20) {
+      return _ref23.apply(this, arguments);
     };
   })();
 }
 
 /**
   Load the text for all the avaliable sources
  * @memberof actions/sources
  * @static
  */
 function loadAllSources() {
   return (() => {
-    var _ref24 = _asyncToGenerator(function* (_ref25) {
-      var dispatch = _ref25.dispatch,
-          getState = _ref25.getState;
+    var _ref26 = _asyncToGenerator(function* (_ref27) {
+      var dispatch = _ref27.dispatch,
+          getState = _ref27.getState;
 
       var sources = (0, _selectors.getSources)(getState());
       var query = (0, _selectors.getTextSearchQuery)(getState());
-      for (var _ref26 of sources) {
-        var _ref27 = _slicedToArray(_ref26, 2);
-
-        var src = _ref27[1];
+      for (var _ref28 of sources) {
+        var _ref29 = _slicedToArray(_ref28, 2);
+
+        var src = _ref29[1];
 
         var source = src.toJS();
         yield dispatch(loadSourceText(source));
         // If there is a current search query we search
         // each of the source texts as they get loaded
         if (query) {
           yield dispatch((0, _projectTextSearch.searchSource)(source, query));
         }
       }
     });
 
-    return function (_x17) {
-      return _ref24.apply(this, arguments);
+    return function (_x21) {
+      return _ref26.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 255 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getPausedPosition = undefined;
+
+var getPausedPosition = exports.getPausedPosition = (() => {
+  var _ref = _asyncToGenerator(function* (pauseInfo, sourceMaps) {
+    var frames = pauseInfo.frames;
+
+    frames = yield updateFrameLocations(frames, sourceMaps);
+    var frame = frames[0];
+    var location = frame.location;
+
+    return location;
+  });
+
+  return function getPausedPosition(_x, _x2) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
 exports.updateFrameLocations = updateFrameLocations;
 exports.getPauseReason = getPauseReason;
 
 var _lodash = __webpack_require__(2);
 
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
 function updateFrameLocations(frames, sourceMaps) {
   if (!frames || frames.length == 0) {
     return Promise.resolve(frames);
   }
 
   return Promise.all(frames.map(frame => {
     return sourceMaps.getOriginalLocation(frame.location).then(loc => {
       return Object.assign({}, frame, {
@@ -20140,16 +20292,21 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
 
 var _source = __webpack_require__(233);
 
 var _wasm = __webpack_require__(23);
 
+var _devtoolsSourceEditor = __webpack_require__(994);
+
+var resizeBreakpointGutter = _devtoolsSourceEditor.SourceEditorUtils.resizeBreakpointGutter;
+
+
 var sourceDocs = {};
 
 function getDocument(key) {
   return sourceDocs[key];
 }
 
 function setDocument(key, doc) {
   sourceDocs[key] = doc;
@@ -20161,26 +20318,27 @@ function removeDocument(key) {
 
 function clearDocuments() {
   sourceDocs = {};
 }
 
 function resetLineNumberFormat(editor) {
   var cm = editor.codeMirror;
   cm.setOption("lineNumberFormatter", number => number);
+  resizeBreakpointGutter(cm);
 }
 
 function updateLineNumberFormat(editor, sourceId) {
   if (!(0, _wasm.isWasm)(sourceId)) {
-    resetLineNumberFormat(editor);
-    return;
+    return resetLineNumberFormat(editor);
   }
   var cm = editor.codeMirror;
   var lineNumberFormatter = (0, _wasm.getWasmLineNumberFormatter)(sourceId);
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
+  resizeBreakpointGutter(cm);
 }
 
 function updateDocument(editor, sourceId) {
   if (!sourceId) {
     return;
   }
   var doc = getDocument(sourceId) || editor.createDocument();
   editor.replaceDocument(doc);
@@ -20805,17 +20963,88 @@ module.exports = hasPath;
 
 /***/ }),
 /* 298 */,
 /* 299 */,
 /* 300 */,
 /* 301 */,
 /* 302 */,
 /* 303 */,
-/* 304 */,
+/* 304 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(84),
+    isSymbol = __webpack_require__(72);
+
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
+
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
+
+/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
+}
+
+module.exports = toNumber;
+
+
+/***/ }),
 /* 305 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -21062,27 +21291,40 @@ exports.pauseOnExceptions = pauseOnExcep
 exports.command = command;
 exports.stepIn = stepIn;
 exports.stepOver = stepOver;
 exports.stepOut = stepOut;
 exports.resume = resume;
 exports.breakOnNext = breakOnNext;
 exports.selectFrame = selectFrame;
 exports.loadObjectProperties = loadObjectProperties;
+exports.astCommand = astCommand;
 
 var _sources = __webpack_require__(254);
 
 var _promise = __webpack_require__(193);
 
 var _selectors = __webpack_require__(242);
 
 var _pause = __webpack_require__(255);
 
 var _expressions = __webpack_require__(252);
 
+var _breakpoints = __webpack_require__(245);
+
+var _breakpoints2 = __webpack_require__(236);
+
+var _parser = __webpack_require__(827);
+
+var parser = _interopRequireWildcard(_parser);
+
+var _prefs = __webpack_require__(226);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
  * Redux actions for the pause state
  * @module actions/pause
  */
 
 /**
@@ -21202,51 +21444,51 @@ function command(_ref5) {
  * @returns {Function} {@link command}
  */
 function stepIn() {
   return (_ref7) => {
     var dispatch = _ref7.dispatch,
         getState = _ref7.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepIn" }));
+      return dispatch(astCommand("stepIn"));
     }
   };
 }
 
 /**
  * stepOver
  * @memberof actions/pause
  * @static
  * @returns {Function} {@link command}
  */
 function stepOver() {
   return (_ref8) => {
     var dispatch = _ref8.dispatch,
         getState = _ref8.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepOver" }));
+      return dispatch(astCommand("stepOver"));
     }
   };
 }
 
 /**
  * stepOut
  * @memberof actions/pause
  * @static
  * @returns {Function} {@link command}
  */
 function stepOut() {
   return (_ref9) => {
     var dispatch = _ref9.dispatch,
         getState = _ref9.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepOut" }));
+      return dispatch(astCommand("stepOut"));
     }
   };
 }
 
 /**
  * resume
  * @memberof actions/pause
  * @static
@@ -21332,16 +21574,57 @@ function loadObjectProperties(object) {
     dispatch({
       type: "LOAD_OBJECT_PROPERTIES",
       objectId,
       [_promise.PROMISE]: client.getProperties(object)
     });
   };
 }
 
+/**
+ * @memberOf actions/pause
+ * @static
+ * @param stepType
+ * @returns {function(ThunkArgs)}
+ */
+function astCommand(stepType) {
+  return (() => {
+    var _ref15 = _asyncToGenerator(function* (_ref16) {
+      var dispatch = _ref16.dispatch,
+          getState = _ref16.getState,
+          sourceMaps = _ref16.sourceMaps;
+
+      if (!_prefs.features.asyncStepping) {
+        return dispatch(command({ type: stepType }));
+      }
+
+      var pauseInfo = (0, _selectors.getPause)(getState());
+      var source = (0, _selectors.getSelectedSource)(getState()).toJS();
+      var currentHiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
+      if (currentHiddenBreakpointLocation) {
+        dispatch((0, _breakpoints.removeBreakpoint)(currentHiddenBreakpointLocation));
+      }
+      var pausedPosition = yield (0, _pause.getPausedPosition)(pauseInfo, sourceMaps);
+
+      var _ref17 = yield parser.getNextStep(source, stepType, pausedPosition),
+          nextStepType = _ref17.nextStepType,
+          nextHiddenBreakpointLocation = _ref17.nextHiddenBreakpointLocation;
+
+      if (nextHiddenBreakpointLocation) {
+        yield dispatch((0, _breakpoints.addHiddenBreakpoint)(nextHiddenBreakpointLocation));
+      }
+      return dispatch(command({ type: nextStepType }));
+    });
+
+    return function (_x3) {
+      return _ref15.apply(this, arguments);
+    };
+  })();
+}
+
 /***/ }),
 /* 320 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -21525,16 +21808,22 @@ function toggleFileSearchModifier(modifi
 }
 
 function showSource(sourceId) {
   return (_ref4) => {
     var dispatch = _ref4.dispatch,
         getState = _ref4.getState;
 
     var source = (0, _selectors.getSource)(getState(), sourceId);
+
+    dispatch({
+      type: "SHOW_SOURCE",
+      sourceUrl: ""
+    });
+
     dispatch({
       type: "SHOW_SOURCE",
       sourceUrl: source.get("url")
     });
   };
 }
 
 function togglePaneCollapse(position, paneCollapsed) {
@@ -21631,17 +21920,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
-__webpack_require__(737);
+__webpack_require__(952);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Modal extends _react.Component {
 
   constructor(props) {
     super(props);
     var self = this;
@@ -23083,17 +23372,17 @@ var _react2 = _interopRequireDefault(_re
 var _fuzzaldrinPlus = __webpack_require__(161);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _resultList = __webpack_require__(343);
 
-__webpack_require__(695);
+__webpack_require__(867);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
@@ -23102,36 +23391,34 @@ function _interopRequireDefault(obj) { r
 
 class Autocomplete extends _react.Component {
 
   constructor(props) {
     super(props);
 
     this.onKeyDown = this.onKeyDown.bind(this);
     this.state = {
-      inputValue: props.inputValue,
       selectedIndex: 0,
       focused: false
     };
   }
 
   componentDidUpdate() {
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedIndex);
     }
   }
 
   getSearchResults() {
-    var inputValue = this.state.inputValue;
-
+    var inputValue = this.props.inputValue;
     if (inputValue == "") {
       return [];
     }
 
-    return (0, _fuzzaldrinPlus.filter)(this.props.items, this.state.inputValue, {
+    return (0, _fuzzaldrinPlus.filter)(this.props.items, inputValue, {
       key: "value"
     });
   }
 
   onKeyDown(e) {
     var searchResults = this.getSearchResults(),
         resultCount = searchResults.length;
 
@@ -23148,21 +23435,21 @@ class Autocomplete extends _react.Compon
       if (this.props.onSelectedItem) {
         this.props.onSelectedItem(searchResults[_selectedIndex2]);
       }
       e.preventDefault();
     } else if (e.key === "Enter") {
       if (searchResults.length) {
         this.props.selectItem(e, searchResults[this.state.selectedIndex]);
       } else {
-        this.props.close(this.state.inputValue);
+        this.props.close(this.props.inputValue);
       }
       e.preventDefault();
     } else if (e.key === "Tab") {
-      this.props.close(this.state.inputValue);
+      this.props.close(this.props.inputValue);
       e.preventDefault();
     }
   }
 
   renderResults(results) {
     var size = this.props.size;
 
 
@@ -23172,17 +23459,17 @@ class Autocomplete extends _react.Compon
         selected: this.state.selectedIndex,
         selectItem: this.props.selectItem,
         close: this.props.close,
         size,
         ref: "resultList"
       };
 
       return _react2.default.createElement(_ResultList2.default, props);
-    } else if (this.state.inputValue && !results.length) {
+    } else if (this.props.inputValue && !results.length) {
       return _react2.default.createElement(
         "div",
         { className: "no-result-msg absolute-center" },
         L10N.getStr("sourceSearch.noResults2")
       );
     }
   }
 
@@ -23191,26 +23478,28 @@ class Autocomplete extends _react.Compon
     var _props = this.props,
         size = _props.size,
         children = _props.children;
 
     var searchResults = this.getSearchResults();
     var summaryMsg = L10N.getFormatStr("sourceSearch.resultsSummary1", searchResults.length);
 
     var searchProps = {
-      query: this.state.inputValue,
+      query: this.props.inputValue,
       count: searchResults.length,
       placeholder: this.props.placeholder,
       size,
       showErrorEmoji: true,
       summaryMsg,
-      onChange: e => this.setState({
-        inputValue: e.target.value,
-        selectedIndex: 0
-      }),
+      onChange: e => {
+        this.props.onChangeHandler(e.target.value);
+        this.setState({
+          selectedIndex: 0
+        });
+      },
       onFocus: () => this.setState({ focused: true }),
       onBlur: () => this.setState({ focused: false }),
       onKeyDown: this.onKeyDown,
       handleClose: this.props.close
     };
 
     return _react2.default.createElement(
       "div",
@@ -23316,17 +23605,17 @@ exports.handleKeyDown = handleKeyDown;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _Svg = __webpack_require__(345);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(690);
+__webpack_require__(862);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * This file maps the SVG React Components in the assets/images directory.
  */
 
 exports.default = _Svg2.default;
@@ -23349,16 +23638,17 @@ var svg = {
   angular: __webpack_require__(247),
   arrow: __webpack_require__(348),
   backbone: __webpack_require__(997),
   blackBox: __webpack_require__(349),
   breakpoint: __webpack_require__(350),
   "column-breakpoint": __webpack_require__(998),
   "case-match": __webpack_require__(351),
   close: __webpack_require__(352),
+  dojo: __webpack_require__(806),
   domain: __webpack_require__(353),
   file: __webpack_require__(354),
   folder: __webpack_require__(355),
   globe: __webpack_require__(356),
   jquery: __webpack_require__(999),
   underscore: __webpack_require__(1117),
   lodash: __webpack_require__(1118),
   ember: __webpack_require__(1119),
@@ -23390,38 +23680,48 @@ var svg = {
   node: __webpack_require__(1002),
   express: __webpack_require__(1003),
   pug: __webpack_require__(1004),
   extjs: __webpack_require__(1043),
   showSources: __webpack_require__(1044),
   showOutline: __webpack_require__(1045)
 };
 
-module.exports = function (name, props) {
-  // eslint-disable-line
+function Svg(_ref) {
+  var name = _ref.name,
+      className = _ref.className,
+      onClick = _ref.onClick,
+      ariaLabel = _ref["aria-label"];
+
   if (!svg[name]) {
-    var error = "Unknown SVG: " + name;
+    var error = `Unknown SVG: ${name}`;
     if (isDevelopment()) {
       throw new Error(error);
     }
 
     console.warn(error);
     return;
   }
 
-  var className = name;
-  if (props && props.className) {
-    className = `${name} ${props.className}`;
-  }
+  className = `${name} ${className || ""}`;
   if (name === "subSettings") {
     className = "";
   }
-  props = Object.assign({}, props, { className, src: svg[name] });
+  var props = {
+    className,
+    onClick,
+    ["aria-label"]: ariaLabel,
+    src: svg[name]
+  };
   return React.createElement(InlineSVG, props);
-};
+}
+
+Svg.displayName = "Svg";
+
+module.exports = Svg;
 
 /***/ }),
 /* 346 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -23765,33 +24065,33 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(693);
+__webpack_require__(865);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var arrowBtn = (onClick, type, className, tooltip) => {
   var props = {
     onClick,
     type,
     className,
     title: tooltip,
     key: type
   };
 
   return _react2.default.createElement(
     "button",
     props,
-    (0, _Svg2.default)(type)
+    _react2.default.createElement(_Svg2.default, { name: type })
   );
 };
 
 arrowBtn.displayName = "ArrowButton";
 
 class SearchInput extends _react.Component {
 
   componentDidMount() {
@@ -23804,20 +24104,20 @@ class SearchInput extends _react.Compone
         query = _props.query,
         showErrorEmoji = _props.showErrorEmoji;
 
     return count === 0 && query.trim() !== "" && !showErrorEmoji;
   }
 
   renderSvg() {
     if (this.shouldShowErrorEmoji()) {
-      return (0, _Svg2.default)("sad-face");
-    }
-
-    return (0, _Svg2.default)("magnifying-glass");
+      return _react2.default.createElement(_Svg2.default, { name: "sad-face" });
+    }
+
+    return _react2.default.createElement(_Svg2.default, { name: "magnifying-glass" });
   }
 
   renderArrowButtons() {
     var _props2 = this.props,
         handleNext = _props2.handleNext,
         handlePrev = _props2.handlePrev;
 
 
@@ -23911,33 +24211,33 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(692);
+__webpack_require__(864);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function CloseButton(_ref) {
   var handleClick = _ref.handleClick,
       buttonClass = _ref.buttonClass,
       tooltip = _ref.tooltip;
 
   return _react2.default.createElement(
     "div",
     {
       className: buttonClass ? `close-btn ${buttonClass}` : "close-btn",
       onClick: handleClick,
       title: tooltip
     },
-    (0, _Svg2.default)("close")
+    _react2.default.createElement(_Svg2.default, { name: "close" })
   );
 }
 
 
 CloseButton.displayName = "CloseButton";
 CloseButton.propTypes = {
   handleClick: _react.PropTypes.func.isRequired
 };
@@ -23962,17 +24262,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(696);
+__webpack_require__(868);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ResultList extends _react.Component {
 
   constructor(props) {
     super(props);
     this.renderListItem = this.renderListItem.bind(this);
@@ -24119,17 +24419,17 @@ Object.defineProperty(exports, "__esModu
 });
 
 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; };
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(691);
+__webpack_require__(863);
 
 var _devtoolsComponents = __webpack_require__(1007);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Tree = (0, _react.createFactory)(_devtoolsComponents.Tree);
 
 class ManagedTree extends _react.Component {
@@ -24310,30 +24610,32 @@ var _redux = __webpack_require__(3);
 var _reactRedux = __webpack_require__(151);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-var _lodash = __webpack_require__(2);
-
 var _GutterMenu = __webpack_require__(655);
 
 var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
 
 var _EditorMenu = __webpack_require__(656);
 
 var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
 
 var _ConditionalPanel = __webpack_require__(711);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
+var _source = __webpack_require__(233);
+
+var _ast = __webpack_require__(1058);
+
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _Footer = __webpack_require__(427);
 
@@ -24342,17 +24644,17 @@ var _Footer2 = _interopRequireDefault(_F
 var _SearchBar = __webpack_require__(433);
 
 var _SearchBar2 = _interopRequireDefault(_SearchBar);
 
 var _HighlightLines = __webpack_require__(1025);
 
 var _HighlightLines2 = _interopRequireDefault(_HighlightLines);
 
-var _Preview = __webpack_require__(657);
+var _Preview = __webpack_require__(809);
 
 var _Preview2 = _interopRequireDefault(_Preview);
 
 var _Breakpoints = __webpack_require__(1158);
 
 var _Breakpoints2 = _interopRequireDefault(_Breakpoints);
 
 var _HitMarker = __webpack_require__(715);
@@ -24362,21 +24664,25 @@ var _HitMarker2 = _interopRequireDefault
 var _CallSites = __webpack_require__(1159);
 
 var _CallSites2 = _interopRequireDefault(_CallSites);
 
 var _DebugLine = __webpack_require__(313);
 
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
+var _EmptyLines = __webpack_require__(1144);
+
+var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
+
 var _editor = __webpack_require__(257);
 
-__webpack_require__(716);
-
-__webpack_require__(717);
+__webpack_require__(905);
+
+__webpack_require__(906);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
@@ -24398,20 +24704,18 @@ class Editor extends _react.PureComponen
       editor: null
     };
 
     var self = this;
     self.closeConditionalPanel = this.closeConditionalPanel.bind(this);
     self.onEscape = this.onEscape.bind(this);
     self.onGutterClick = this.onGutterClick.bind(this);
     self.onGutterContextMenu = this.onGutterContextMenu.bind(this);
-    self.onScroll = this.onScroll.bind(this);
     self.onSearchAgain = this.onSearchAgain.bind(this);
     self.onToggleBreakpoint = this.onToggleBreakpoint.bind(this);
-    self.onMouseOver = (0, _lodash.debounce)(this.onMouseOver, 40);
     self.toggleConditionalPanel = this.toggleConditionalPanel.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     // This lifecycle method is responsible for updating the editor
     // text.
     var selectedSource = nextProps.selectedSource;
 
@@ -24419,17 +24723,17 @@ class Editor extends _react.PureComponen
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
 
     if (!selectedSource) {
       if (this.props.selectedSource) {
         this.showMessage("");
       }
-    } else if (selectedSource.get("loading")) {
+    } else if (!(0, _source.isLoaded)(selectedSource.toJS())) {
       this.showMessage(L10N.getStr("loadingText"));
     } else if (selectedSource.get("error")) {
       this.showMessage(selectedSource.get("error"));
     } else if (this.props.selectedSource !== selectedSource) {
       (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS());
     }
 
     if (this.state.editor && this.props.linesInScope !== nextProps.linesInScope) {
@@ -24459,17 +24763,16 @@ class Editor extends _react.PureComponen
     (0, _editor.resizeBreakpointGutter)(codeMirror);
     (0, _devtoolsLaunchpad.debugGlobal)("cm", codeMirror);
 
     codeMirror.on("gutterClick", this.onGutterClick);
 
     // Set code editor wrapper to be focusable
     codeMirrorWrapper.tabIndex = 0;
     codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e));
-    codeMirrorWrapper.addEventListener("mouseover", e => this.onMouseOver(e));
 
     var toggleFoldMarkerVisibility = e => {
       if (node instanceof HTMLElement) {
         node.querySelectorAll(".CodeMirror-guttermarker-subtle").forEach(elem => {
           elem.classList.toggle("visible");
         });
       }
     };
@@ -24481,18 +24784,16 @@ class Editor extends _react.PureComponen
     if (!(0, _devtoolsConfig.isFirefox)()) {
       codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
 
       codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, cm));
     } else {
       codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, codeMirror));
     }
 
-    codeMirror.on("scroll", this.onScroll);
-
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     this.cbPanel = null;
     var editor = this.setupEditor();
 
@@ -24614,36 +24915,28 @@ class Editor extends _react.PureComponen
     var codeMirror = this.state.editor.codeMirror;
 
     if (codeMirror.listSelections().length > 1) {
       codeMirror.execCommand("singleSelection");
       e.preventDefault();
     }
   }
 
-  onScroll() {
-    this.clearPreviewSelection();
-  }
-
   onSearchAgain(_, e) {
     var _props3 = this.props,
         query = _props3.query,
         searchModifiers = _props3.searchModifiers;
     var codeMirror = this.state.editor.editor.codeMirror;
 
     var ctx = { ed: this.state.editor, cm: codeMirror };
 
     var direction = e.shiftKey ? "prev" : "next";
     (0, _editor.traverseResults)(e, ctx, query, direction, searchModifiers.toJS());
   }
 
-  clearPreviewSelection() {
-    this.props.clearSelection();
-  }
-
   inSelectedFrameSource() {
     var _props4 = this.props,
         selectedLocation = _props4.selectedLocation,
         selectedFrame = _props4.selectedFrame;
 
     return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
   }
 
@@ -24668,75 +24961,82 @@ class Editor extends _react.PureComponen
       toggleBlackBox,
       onGutterContextMenu: this.onGutterContextMenu
     });
   }
 
   onGutterClick(cm, line, gutter, ev) {
     var _props6 = this.props,
         selectedSource = _props6.selectedSource,
-        toggleBreakpoint = _props6.toggleBreakpoint;
+        toggleBreakpoint = _props6.toggleBreakpoint,
+        addOrToggleDisabledBreakpoint = _props6.addOrToggleDisabledBreakpoint,
+        isEmptyLine = _props6.isEmptyLine;
 
     // ignore right clicks in the gutter
 
     if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed")) {
       return;
     }
 
+    if (isEmptyLine(line)) {
+      return;
+    }
+
     if (this.isCbPanelOpen()) {
       return this.closeConditionalPanel();
     }
 
     if (!selectedSource) {
       return;
     }
 
     if (gutter !== "CodeMirror-foldgutter") {
-      toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      if (ev.shiftKey) {
+        addOrToggleDisabledBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      } else {
+        toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      }
     }
   }
 
   onGutterContextMenu(event) {
     var _props7 = this.props,
         selectedSource = _props7.selectedSource,
         breakpoints = _props7.breakpoints,
         toggleBreakpoint = _props7.toggleBreakpoint,
-        toggleDisabledBreakpoint = _props7.toggleDisabledBreakpoint;
+        toggleDisabledBreakpoint = _props7.toggleDisabledBreakpoint,
+        isEmptyLine = _props7.isEmptyLine;
 
 
     if (selectedSource && selectedSource.get("isBlackBoxed")) {
       event.preventDefault();
       return;
     }
 
     var sourceId = selectedSource ? selectedSource.get("id") : "";
     var line = (0, _editor.lineAtHeight)(this.state.editor, sourceId, event);
     var breakpoint = breakpoints.find(bp => bp.location.line === line);
 
+    if (isEmptyLine(line - 1)) {
+      return;
+    }
+
     (0, _GutterMenu2.default)({
       event,
       line,
       breakpoint,
       toggleBreakpoint,
       toggleDisabledBreakpoint,
 
       showConditionalPanel: this.toggleConditionalPanel,
       isCbPanelOpen: this.isCbPanelOpen(),
       closeConditionalPanel: this.closeConditionalPanel
     });
   }
 
-  onMouseOver(e) {
-    var target = e.target;
-
-    if (this.inSelectedFrameSource()) {
-      (0, _editor.updateSelection)(target, this.state.editor, this.props);
-    }
-  }
-
   toggleConditionalPanel(line) {
     if (this.isCbPanelOpen()) {
       return this.closeConditionalPanel();
     }
 
     var _props8 = this.props,
         selectedLocation = _props8.selectedLocation,
         setBreakpointCondition = _props8.setBreakpointCondition,
@@ -24850,60 +25150,35 @@ class Editor extends _react.PureComponen
   }
 
   renderHitCounts() {
     var _props10 = this.props,
         hitCount = _props10.hitCount,
         selectedSource = _props10.selectedSource;
 
 
-    if (!selectedSource || selectedSource.get("loading") || !hitCount || !this.state.editor) {
+    if (!selectedSource || !(0, _source.isLoaded)(selectedSource.toJS()) || !hitCount || !this.state.editor) {
       return;
     }
 
     return hitCount.filter(marker => marker.get("count") > 0).map(marker => _react2.default.createElement(_HitMarker2.default, {
       key: marker.get("line"),
       hitData: marker.toJS(),
       editor: this.state.editor.codeMirror
     }));
   }
 
   renderPreview() {
-    var _props11 = this.props,
-        selectedSource = _props11.selectedSource,
-        selection = _props11.selection;
+    var selectedSource = this.props.selectedSource;
 
     if (!this.state.editor || !selectedSource) {
       return null;
     }
 
-    if (!selection || selection.updating) {
-      return;
-    }
-
-    var result = selection.result,
-        expression = selection.expression,
-        location = selection.location,
-        cursorPos = selection.cursorPos;
-
-    var value = result;
-    if (typeof value == "undefined" || value.optimizedOut) {
-      return;
-    }
-
-    var editorRange = (0, _editor.toEditorRange)(selectedSource.get("id"), location);
-
-    return _react2.default.createElement(_Preview2.default, {
-      value: value,
-      editor: this.state.editor,
-      range: editorRange,
-      expression: expression,
-      popoverPos: cursorPos,
-      onClose: () => this.clearPreviewSelection()
-    });
+    return _react2.default.createElement(_Preview2.default, { editor: this.state.editor });
   }
 
   renderInScopeLines() {
     var linesInScope = this.props.linesInScope;
 
     if (!this.state.editor || !(0, _devtoolsConfig.isEnabled)("highlightScopeLines") || !linesInScope || !this.inSelectedFrameSource()) {
       return;
     }
@@ -24920,21 +25195,21 @@ class Editor extends _react.PureComponen
 
     if (!editor || !(0, _devtoolsConfig.isEnabled)("columnBreakpoints")) {
       return null;
     }
     return _react2.default.createElement(_CallSites2.default, { editor: editor });
   }
 
   renderSearchBar() {
-    var _props12 = this.props,
-        selectSource = _props12.selectSource,
-        selectedSource = _props12.selectedSource,
-        highlightLineRange = _props12.highlightLineRange,
-        clearHighlightLineRange = _props12.clearHighlightLineRange;
+    var _props11 = this.props,
+        selectSource = _props11.selectSource,
+        selectedSource = _props11.selectedSource,
+        highlightLineRange = _props11.highlightLineRange,
+        clearHighlightLineRange = _props11.clearHighlightLineRange;
 
 
     if (!this.state.editor) {
       return null;
     }
 
     return _react2.default.createElement(_SearchBar2.default, {
       editor: this.state.editor,
@@ -24958,37 +25233,45 @@ class Editor extends _react.PureComponen
   renderBreakpoints() {
     if (!this.state.editor) {
       return null;
     }
 
     return _react2.default.createElement(_Breakpoints2.default, { editor: this.state.editor });
   }
 
+  renderEmptyLines() {
+    if (!this.state.editor) {
+      return null;
+    }
+
+    return _react2.default.createElement(_EmptyLines2.default, { editor: this.state.editor });
+  }
+
   renderDebugLine() {
     var editor = this.state.editor;
-    var _props13 = this.props,
-        selectedLocation = _props13.selectedLocation,
-        selectedFrame = _props13.selectedFrame;
+    var _props12 = this.props,
+        selectedLocation = _props12.selectedLocation,
+        selectedFrame = _props12.selectedFrame;
 
     if (!editor || !selectedLocation || !selectedFrame || !selectedLocation.line || selectedFrame.location.sourceId !== selectedLocation.sourceId) {
       return null;
     }
 
     return _react2.default.createElement(_DebugLine2.default, {
       editor: editor,
       selectedFrame: selectedFrame,
       selectedLocation: selectedLocation
     });
   }
 
   render() {
-    var _props14 = this.props,
-        coverageOn = _props14.coverageOn,
-        pauseData = _props14.pauseData;
+    var _props13 = this.props,
+        coverageOn = _props13.coverageOn,
+        pauseData = _props13.pauseData;
 
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("editor-wrapper", {
           "coverage-on": coverageOn,
           paused: !!pauseData && (0, _devtoolsConfig.isEnabled)("highlightScopeLines")
@@ -25001,17 +25284,18 @@ class Editor extends _react.PureComponen
       }),
       this.renderHighlightLines(),
       this.renderInScopeLines(),
       this.renderHitCounts(),
       this.renderFooter(),
       this.renderPreview(),
       this.renderCallSites(),
       this.renderDebugLine(),
-      this.renderBreakpoints()
+      this.renderBreakpoints(),
+      this.renderEmptyLines()
     );
   }
 }
 
 Editor.displayName = "Editor";
 
 Editor.propTypes = {
   breakpoints: _reactImmutableProptypes2.default.map,
@@ -25037,23 +25321,23 @@ Editor.propTypes = {
   addExpression: _react.PropTypes.func.isRequired,
   horizontal: _react.PropTypes.bool,
   query: _react.PropTypes.string.isRequired,
   searchModifiers: _reactImmutableProptypes2.default.recordOf({
     caseSensitive: _react.PropTypes.bool.isRequired,
     regexMatch: _react.PropTypes.bool.isRequired,
     wholeWord: _react.PropTypes.bool.isRequired
   }).isRequired,
-  selection: _react.PropTypes.object,
   startPanelSize: _react.PropTypes.number,
   endPanelSize: _react.PropTypes.number,
-  clearSelection: _react.PropTypes.func.isRequired,
   linesInScope: _react.PropTypes.array,
   toggleBreakpoint: _react.PropTypes.func.isRequired,
-  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired
+  addOrToggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  isEmptyLine: _react.PropTypes.func
 };
 
 Editor.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedLocation = (0, _selectors.getSelectedLocation)(state);
@@ -25069,17 +25353,17 @@ exports.default = (0, _reactRedux.connec
     breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
     hitCount: (0, _selectors.getHitCountForSource)(state, sourceId),
     selectedFrame: (0, _selectors.getSelectedFrame)(state),
     pauseData: (0, _selectors.getPause)(state),
     coverageOn: (0, _selectors.getCoverageEnabled)(state),
     query: (0, _selectors.getFileSearchQueryState)(state),
     searchModifiers: (0, _selectors.getFileSearchModifierState)(state),
     linesInScope: (0, _selectors.getInScopeLines)(state),
-    selection: (0, _selectors.getSelection)(state)
+    isEmptyLine: line => (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS())
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Editor);
 
 /***/ }),
 /* 427 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -25116,28 +25400,28 @@ var _devtoolsConfig = __webpack_require_
 var _source = __webpack_require__(233);
 
 var _editor = __webpack_require__(257);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(705);
+__webpack_require__(875);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceFooter extends _react.PureComponent {
 
   prettyPrintButton() {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         togglePrettyPrint = _props.togglePrettyPrint;
 
-    var sourceLoaded = selectedSource && !selectedSource.get("loading");
+    var sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
     if (!(0, _editor.shouldShowPrettyPrint)(selectedSource)) {
       return;
     }
 
     var tooltip = L10N.getStr("sourceTabs.prettyPrint");
     var type = "prettyPrint";
 
@@ -25148,26 +25432,26 @@ class SourceFooter extends _react.PureCo
         className: (0, _classnames2.default)("action", type, {
           active: sourceLoaded,
           pretty: (0, _source.isPretty)(selectedSource.toJS())
         }),
         key: type,
         title: tooltip,
         "aria-label": tooltip
       },
-      (0, _Svg2.default)(type)
+      _react2.default.createElement(_Svg2.default, { name: type })
     );
   }
 
   blackBoxButton() {
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         toggleBlackBox = _props2.toggleBlackBox;
 
-    var sourceLoaded = selectedSource && !selectedSource.get("loading");
+    var sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
     var blackboxed = selectedSource.get("isBlackBoxed");
 
     if (!(0, _devtoolsConfig.isEnabled)("blackbox")) {
       return;
     }
 
     var tooltip = L10N.getStr("sourceFooter.blackbox");
@@ -25180,17 +25464,17 @@ class SourceFooter extends _react.PureCo
         className: (0, _classnames2.default)("action", type, {
           active: sourceLoaded,
           blackboxed: blackboxed
         }),
         key: type,
         title: tooltip,
         "aria-label": tooltip
       },
-      (0, _Svg2.default)("blackBox")
+      _react2.default.createElement(_Svg2.default, { name: "blackBox" })
     );
   }
 
   blackBoxSummary() {
     var selectedSource = this.props.selectedSource;
 
     var blackboxed = selectedSource.get("isBlackBoxed");
 
@@ -25304,17 +25588,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(704);
+__webpack_require__(874);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
     var _props = this.props,
         collapsed = _props.collapsed,
@@ -25338,17 +25622,17 @@ class PaneToggleButton extends _react.Co
       {
         className: (0, _classnames2.default)(`toggle-button-${position}`, {
           collapsed,
           vertical: horizontal != null ? !horizontal : false
         }),
         onClick: () => handleClick(position, collapsed),
         title: title
       },
-      (0, _Svg2.default)("togglePanes")
+      _react2.default.createElement(_Svg2.default, { name: "togglePanes" })
     );
   }
 }
 
 PaneToggleButton.displayName = "PaneToggleButton";
 
 exports.default = PaneToggleButton;
 
@@ -25386,31 +25670,33 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _editor = __webpack_require__(257);
 
 var _search = __webpack_require__(1115);
 
+var _source = __webpack_require__(233);
+
 var _resultList = __webpack_require__(343);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _lodash = __webpack_require__(2);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(706);
+__webpack_require__(876);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function getShortcuts() {
   var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
   var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
@@ -25497,18 +25783,18 @@ class SearchBar extends _react.Component
     if (searchInput) {
       searchInput.focus();
     }
 
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedResultIndex);
     }
 
-    var hasLoaded = selectedSource && !selectedSource.get("loading");
-    var wasLoading = prevProps.selectedSource && prevProps.selectedSource.get("loading");
+    var hasLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
+    var wasLoading = prevProps.selectedSource && (0, _source.isLoaded)(prevProps.selectedSource.toJS());
 
     var doneLoading = wasLoading && hasLoaded;
     var changedFiles = selectedSource != prevProps.selectedSource && hasLoaded;
     var modifiersUpdated = modifiers && !modifiers.equals(prevProps.modifiers);
 
     if (searchOn && (doneLoading || changedFiles || modifiersUpdated)) {
       this.doSearch(query);
     }
@@ -25734,17 +26020,17 @@ class SearchBar extends _react.Component
       });
       return _react2.default.createElement(
         "button",
         {
           className: preppedClass,
           onClick: () => toggleFileSearchModifier(modVal),
           title: tooltip
         },
-        (0, _Svg2.default)(svgName)
+        _react2.default.createElement(_Svg2.default, { name: svgName })
       );
     }
 
     return _react2.default.createElement(
       "div",
       { className: "search-modifiers" },
       _react2.default.createElement(
         "span",
@@ -26049,18 +26335,239 @@ exports.default = (0, _reactRedux.connec
 /* 643 */,
 /* 644 */,
 /* 645 */,
 /* 646 */,
 /* 647 */,
 /* 648 */,
 /* 649 */,
 /* 650 */,
-/* 651 */,
-/* 652 */,
+/* 651 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(84),
+    now = __webpack_require__(652),
+    toNumber = __webpack_require__(304);
+
+/** Error message constants. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max,
+    nativeMin = Math.min;
+
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ *  Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ *  The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ *  Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ *   'leading': true,
+ *   'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
+function debounce(func, wait, options) {
+  var lastArgs,
+      lastThis,
+      maxWait,
+      result,
+      timerId,
+      lastCallTime,
+      lastInvokeTime = 0,
+      leading = false,
+      maxing = false,
+      trailing = true;
+
+  if (typeof func != 'function') {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  wait = toNumber(wait) || 0;
+  if (isObject(options)) {
+    leading = !!options.leading;
+    maxing = 'maxWait' in options;
+    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+    trailing = 'trailing' in options ? !!options.trailing : trailing;
+  }
+
+  function invokeFunc(time) {
+    var args = lastArgs,
+        thisArg = lastThis;
+
+    lastArgs = lastThis = undefined;
+    lastInvokeTime = time;
+    result = func.apply(thisArg, args);
+    return result;
+  }
+
+  function leadingEdge(time) {
+    // Reset any `maxWait` timer.
+    lastInvokeTime = time;
+    // Start the timer for the trailing edge.
+    timerId = setTimeout(timerExpired, wait);
+    // Invoke the leading edge.
+    return leading ? invokeFunc(time) : result;
+  }
+
+  function remainingWait(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime,
+        result = wait - timeSinceLastCall;
+
+    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+  }
+
+  function shouldInvoke(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime;
+
+    // Either this is the first call, activity has stopped and we're at the
+    // trailing edge, the system time has gone backwards and we're treating
+    // it as the trailing edge, or we've hit the `maxWait` limit.
+    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+  }
+
+  function timerExpired() {
+    var time = now();
+    if (shouldInvoke(time)) {
+      return trailingEdge(time);
+    }
+    // Restart the timer.
+    timerId = setTimeout(timerExpired, remainingWait(time));
+  }
+
+  function trailingEdge(time) {
+    timerId = undefined;
+
+    // Only invoke if we have `lastArgs` which means `func` has been
+    // debounced at least once.
+    if (trailing && lastArgs) {
+      return invokeFunc(time);
+    }
+    lastArgs = lastThis = undefined;
+    return result;
+  }
+
+  function cancel() {
+    if (timerId !== undefined) {
+      clearTimeout(timerId);
+    }
+    lastInvokeTime = 0;
+    lastArgs = lastCallTime = lastThis = timerId = undefined;
+  }
+
+  function flush() {
+    return timerId === undefined ? result : trailingEdge(now());
+  }
+
+  function debounced() {
+    var time = now(),
+        isInvoking = shouldInvoke(time);
+
+    lastArgs = arguments;
+    lastThis = this;
+    lastCallTime = time;
+
+    if (isInvoking) {
+      if (timerId === undefined) {
+        return leadingEdge(lastCallTime);
+      }
+      if (maxing) {
+        // Handle invocations in a tight loop.
+        timerId = setTimeout(timerExpired, wait);
+        return invokeFunc(lastCallTime);
+      }
+    }
+    if (timerId === undefined) {
+      timerId = setTimeout(timerExpired, wait);
+    }
+    return result;
+  }
+  debounced.cancel = cancel;
+  debounced.flush = flush;
+  return debounced;
+}
+
+module.exports = debounce;
+
+
+/***/ }),
+/* 652 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(8);
+
+/**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ *   console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+var now = function() {
+  return root.Date.now();
+};
+
+module.exports = now;
+
+
+/***/ }),
 /* 653 */,
 /* 654 */,
 /* 655 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -26187,33 +26694,43 @@ function getMenuItems(event, _ref) {
       selectedLocation = _ref.selectedLocation,
       selectedSource = _ref.selectedSource,
       showSource = _ref.showSource,
       onGutterContextMenu = _ref.onGutterContextMenu,
       jumpToMappedLocation = _ref.jumpToMappedLocation,
       toggleBlackBox = _ref.toggleBlackBox,
       addExpression = _ref.addExpression;
 
+  var copySourceLabel = L10N.getStr("copySource");
+  var copySourceKey = L10N.getStr("copySource.accesskey");
   var copySourceUrlLabel = L10N.getStr("copySourceUrl");
   var copySourceUrlKey = L10N.getStr("copySourceUrl.accesskey");
   var revealInTreeLabel = L10N.getStr("sourceTabs.revealInTree");
   var revealInTreeKey = L10N.getStr("sourceTabs.revealInTree.accesskey");
   var blackboxLabel = L10N.getStr("sourceFooter.blackbox");
   var unblackboxLabel = L10N.getStr("sourceFooter.unblackbox");
   var blackboxKey = L10N.getStr("sourceFooter.blackbox.accesskey");
   var toggleBlackBoxLabel = selectedSource.get("isBlackBoxed") ? unblackboxLabel : blackboxLabel;
 
   var copySourceUrl = {
-    id: "node-menu-copy-source",
+    id: "node-menu-copy-source-url",
     label: copySourceUrlLabel,
     accesskey: copySourceUrlKey,
     disabled: false,
     click: () => (0, _clipboard.copyToTheClipboard)(selectedSource.get("url"))
   };
 
+  var copySource = {
+    id: "node-menu-copy-source",
+    label: copySourceLabel,
+    accesskey: copySourceKey,
+    disabled: false,
+    click: () => (0, _clipboard.copyToTheClipboard)(codeMirror.getSelection())
+  };
+
   var _codeMirror$coordsCha = codeMirror.coordsChar({
     left: event.clientX,
     top: event.clientY
   }),
       line = _codeMirror$coordsCha.line,
       ch = _codeMirror$coordsCha.ch;
 
   var sourceLocation = {
@@ -26255,263 +26772,29 @@ function getMenuItems(event, _ref) {
     disabled: false,
     click: () => showSource(selectedSource.get("id"))
   };
 
   if (selectedSource && selectedSource.get("isBlackBoxed")) {
     return [blackBoxMenuItem];
   }
 
-  var menuItems = [copySourceUrl, jumpLabel, showSourceMenuItem, blackBoxMenuItem];
+  var menuItems = [copySource, copySourceUrl, jumpLabel, showSourceMenuItem, blackBoxMenuItem];
 
   if (textSelected) {
     menuItems.push(watchExpressionLabel);
   }
 
   return menuItems;
 }
 
 exports.default = EditorMenu;
 
 /***/ }),
-/* 657 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Preview = undefined;
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _reactRedux = __webpack_require__(151);
-
-var _redux = __webpack_require__(3);
-
-var _devtoolsConfig = __webpack_require__(828);
-
-var _devtoolsReps = __webpack_require__(924);
-
-var _devtoolsReps2 = _interopRequireDefault(_devtoolsReps);
-
-var _Popover = __webpack_require__(698);
-
-var _Popover2 = _interopRequireDefault(_Popover);
-
-var _previewFunction = __webpack_require__(701);
-
-var _previewFunction2 = _interopRequireDefault(_previewFunction);
-
-var _selectors = __webpack_require__(242);
-
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-var _editor = __webpack_require__(257);
-
-__webpack_require__(712);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var Rep = _devtoolsReps2.default.REPS.Rep,
-    MODE = _devtoolsReps2.default.MODE,
-    ObjectInspectorUtils = _devtoolsReps2.default.ObjectInspectorUtils;
-var ObjectInspector = _devtoolsReps2.default.ObjectInspector;
-var getChildren = ObjectInspectorUtils.getChildren;
-class Preview extends _react.Component {
-
-  componentDidMount() {
-    var _props = this.props,
-        loadObjectProperties = _props.loadObjectProperties,
-        loadedObjects = _props.loadedObjects,
-        value = _props.value,
-        editor = _props.editor,
-        range = _props.range;
-
-
-    this.marker = (0, _editor.markText)(editor, "selection", range);
-
-    if (!value || !value.type == "object") {
-      return;
-    }
-
-    if (value.actor && !loadedObjects[value.actor]) {
-      loadObjectProperties(value);
-    }
-  }
-
-  componentWillUnmount() {
-    if (this.marker) {
-      this.marker.clear();
-    }
-  }
-
-  getChildren(root, getObjectProperties) {
-    var actors = {};
-
-    var children = getChildren({
-      getObjectProperties,
-      actors,
-      item: root
-    });
-
-    if (children.length > 0) {
-      return children;
-    }
-
-    return [root];
-  }
-
-  renderFunctionPreview(value, root) {
-    var selectSourceURL = this.props.selectSourceURL;
-    var location = value.location;
-
-
-    return _react2.default.createElement(
-      "div",
-      {
-        className: "preview",
-        onClick: () => selectSourceURL(location.url, { line: location.line })
-      },
-      (0, _previewFunction2.default)(value)
-    );
-  }
-
-  renderObjectPreview(expression, root) {
-    return _react2.default.createElement(
-      "div",
-      { className: "preview" },
-      this.renderObjectInspector(root)
-    );
-  }
-
-  renderSimplePreview(value) {
-    return _react2.default.createElement(
-      "div",
-      { className: "preview" },
-      Rep({ object: value, mode: MODE.LONG })
-    );
-  }
-
-  renderObjectInspector(root) {
-    var _props2 = this.props,
-        loadObjectProperties = _props2.loadObjectProperties,
-        loadedObjects = _props2.loadedObjects;
-
-
-    var getObjectProperties = id => loadedObjects[id];
-    var roots = this.getChildren(root, getObjectProperties);
-
-    return _react2.default.createElement(ObjectInspector, {
-      roots: roots,
-      autoExpandDepth: 0,
-      disableWrap: true,
-      disabledFocus: true,
-      getObjectProperties: getObjectProperties,
-      loadObjectProperties: loadObjectProperties
-      // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
-      , getObjectEntries: actor => {},
-      loadObjectEntries: grip => {}
-    });
-  }
-
-  renderAddToExpressionBar(expression) {
-    if (!(0, _devtoolsConfig.isEnabled)("previewWatch")) {
-      return null;
-    }
-
-    var addExpression = this.props.addExpression;
-
-    return _react2.default.createElement(
-      "div",
-      { className: "add-to-expression-bar" },
-      _react2.default.createElement(
-        "div",
-        { className: "prompt" },
-        "\xBB"
-      ),
-      _react2.default.createElement(
-        "div",
-        { className: "expression-to-save-label" },
-        expression
-      ),
-      _react2.default.createElement(
-        "div",
-        {
-          className: "expression-to-save-button",
-          onClick: event => addExpression(event)
-        },
-        L10N.getStr("addWatchExpressionButton")
-      )
-    );
-  }
-
-  renderPreview(expression, value) {
-    var root = {
-      name: expression,
-      path: expression,
-      contents: { value }
-    };
-
-    if (value.class === "Function") {
-      return this.renderFunctionPreview(value, root);
-    }
-
-    if (value.type === "object") {
-      return _react2.default.createElement(
-        "div",
-        null,
-        this.renderObjectPreview(expression, root),
-        this.renderAddToExpressionBar(expression)
-      );
-    }
-
-    return this.renderSimplePreview(value);
-  }
-
-  getPreviewType(value) {
-    if (typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
-      return "tooltip";
-    }
-
-    return "popover";
-  }
-
-  render() {
-    var _props3 = this.props,
-        popoverPos = _props3.popoverPos,
-        onClose = _props3.onClose,
-        value = _props3.value,
-        expression = _props3.expression;
-
-
-    var type = this.getPreviewType(value);
-
-    return _react2.default.createElement(
-      _Popover2.default,
-      { targetPosition: popoverPos, onMouseLeave: onClose, type: type },
-      this.renderPreview(expression, value)
-    );
-  }
-}
-
-exports.Preview = Preview;
-Preview.displayName = "Preview";
-
-exports.default = (0, _reactRedux.connect)(state => ({
-  loadedObjects: (0, _selectors.getLoadedObjects)(state)
-}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Preview);
-
-/***/ }),
+/* 657 */,
 /* 658 */,
 /* 659 */,
 /* 660 */,
 /* 661 */,
 /* 662 */,
 /* 663 */,
 /* 664 */,
 /* 665 */,
@@ -26533,130 +26816,35 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 
 /***/ }),
 /* 678 */
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_678__;
 
 /***/ }),
-/* 679 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 680 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 681 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 682 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 683 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 684 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 685 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 686 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 687 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 688 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 689 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 690 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 691 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 692 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 693 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 694 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 695 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 696 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 697 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 679 */,
+/* 680 */,
+/* 681 */,
+/* 682 */,
+/* 683 */,
+/* 684 */,
+/* 685 */,
+/* 686 */,
+/* 687 */,
+/* 688 */,
+/* 689 */,
+/* 690 */,
+/* 691 */,
+/* 692 */,
+/* 693 */,
+/* 694 */,
+/* 695 */,
+/* 696 */,
+/* 697 */,
 /* 698 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -26673,23 +26861,24 @@ var _reactDom2 = _interopRequireDefault(
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _BracketArrow = __webpack_require__(1029);
 
 var _BracketArrow2 = _interopRequireDefault(_BracketArrow);
 
-__webpack_require__(710);
+__webpack_require__(880);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Popover extends _react.Component {
   constructor() {
     super();
+    this.onMouseLeave = this.onMouseLeave.bind(this);
     this.state = {
       left: 0,
       top: 0
     };
   }
 
   componentDidMount() {
     var type = this.props.type;
@@ -26774,32 +26963,42 @@ class Popover extends _react.Component {
       orientation: arrowOrientation,
       left,
       [arrowProp]: arrowPropValue
     };
 
     return _react2.default.createElement(_BracketArrow2.default, arrowProps);
   }
 
+  onMouseLeave(e) {
+    var onMouseLeave = this.props.onMouseLeave;
+
+
+    if (e.target.className.match(/(bracket-arrow|gap)/)) {
+      return;
+    }
+
+    onMouseLeave();
+  }
+
   renderPopover() {
-    var onMouseLeave = this.props.onMouseLeave;
     var _state = this.state,
         top = _state.top,
         left = _state.left,
         orientation = _state.orientation,
         targetMid = _state.targetMid;
 
 
     var arrow = this.getPopoverArrow(orientation, targetMid);
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("popover", { up: orientation === "up" }),
-        onMouseLeave: onMouseLeave,
+        onMouseLeave: this.onMouseLeave,
         style: { top, left }
       },
       arrow,
       this.getChildren()
     );
   }
 
   renderTooltip() {
@@ -26845,156 +27044,52 @@ Popover.defaultProps = {
   type: "popover"
 };
 
 Popover.displayName = "Popover";
 
 exports.default = Popover;
 
 /***/ }),
-/* 699 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 700 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 701 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _react = __webpack_require__(0);
-
-var _lodash = __webpack_require__(2);
-
-var _frame = __webpack_require__(1014);
-
-__webpack_require__(702);
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-function getFunctionName(func) {
-  var name = func.userDisplayName || func.displayName || func.name;
-  return (0, _frame.simplifyDisplayName)(name);
-}
-
-function renderFunctionName(func) {
-  var name = getFunctionName(func);
-  return _react.DOM.span({ className: "function-name" }, name);
-}
-
-function renderParams(func) {
-  var _func$parameterNames = func.parameterNames,
-      parameterNames = _func$parameterNames === undefined ? [] : _func$parameterNames;
-
-  var params = parameterNames.filter(i => i).map(param => _react.DOM.span({ className: "param" }, param));
-
-  var commas = (0, _lodash.times)(params.length - 1).map(() => _react.DOM.span({ className: "delimiter" }, ", "));
-
-  return (0, _lodash.flatten)((0, _lodash.zip)(params, commas));
-}
-
-function renderParen(paren) {
-  return _react.DOM.span({ className: "paren" }, paren);
-}
-
-function previewFunction(func) {
-  return _react.DOM.span.apply(_react.DOM, [{ className: "function-signature" }, renderFunctionName(func), renderParen("(")].concat(_toConsumableArray(renderParams(func)), [renderParen(")")]));
-}
-
-exports.default = previewFunction;
-
-/***/ }),
-/* 702 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 703 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 704 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 705 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 706 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 707 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 708 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 709 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 710 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 699 */,
+/* 700 */,
+/* 701 */,
+/* 702 */,
+/* 703 */,
+/* 704 */,
+/* 705 */,
+/* 706 */,
+/* 707 */,
+/* 708 */,
+/* 709 */,
+/* 710 */,
 /* 711 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.renderConditionalPanel = undefined;
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(703);
+__webpack_require__(873);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderConditionalPanel(_ref) {
   var condition = _ref.condition,
       closePanel = _ref.closePanel,
       setBreakpoint = _ref.setBreakpoint;
 
@@ -27016,57 +27111,59 @@ function renderConditionalPanel(_ref) {
   function onKey(e) {
     if (e.key === "Enter") {
       saveAndClose();
     } else if (e.key === "Escape") {
       closePanel();
     }
   }
 
-  _reactDom2.default.render(_react.DOM.div({ className: "conditional-breakpoint-panel" }, _react.DOM.div({ className: "prompt" }, "»"), _react.DOM.input({
-    defaultValue: condition,
-    placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
-    onKeyDown: onKey,
-    ref: setInput
-  }), (0, _Close2.default)({
-    handleClick: closePanel,
-    buttonClass: "big",
-    tooltip: L10N.getStr("editor.conditionalPanel.close")
-  })), panel);
+  _reactDom2.default.render(_react2.default.createElement(
+    "div",
+    { className: "conditional-breakpoint-panel" },
+    _react2.default.createElement(
+      "div",
+      { className: "prompt" },
+      "\xBB"
+    ),
+    _react2.default.createElement("input", {
+      defaultValue: condition,
+      placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
+      onKeyDown: onKey,
+      ref: setInput
+    }),
+    _react2.default.createElement(_Close2.default, {
+      handleClick: closePanel,
+      buttonClass: "big",
+      tooltip: L10N.getStr("editor.conditionalPanel.close")
+    })
+  ), panel);
 
   return panel;
 }
 
 exports.renderConditionalPanel = renderConditionalPanel;
 
 /***/ }),
-/* 712 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 713 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 712 */,
+/* 713 */,
 /* 714 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _devtoolsConfig = __webpack_require__(828);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _classnames = __webpack_require__(175);
 
@@ -27076,17 +27173,17 @@ var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _editor = __webpack_require__(257);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var breakpointSvg = document.createElement("div");
-_reactDom2.default.render((0, _Svg2.default)("breakpoint"), breakpointSvg);
+_reactDom2.default.render(_react2.default.createElement(_Svg2.default, { name: "breakpoint" }), breakpointSvg);
 
 function makeMarker(isDisabled) {
   var bp = breakpointSvg.cloneNode(true);
   bp.className = (0, _classnames2.default)("editor new-breakpoint", {
     "breakpoint-disabled": isDisabled,
     "folding-enabled": (0, _devtoolsConfig.isEnabled)("codeFolding")
   });
 
@@ -27101,19 +27198,24 @@ class Breakpoint extends _react.Componen
   }
 
   addBreakpoint() {
     var _props = this.props,
         breakpoint = _props.breakpoint,
         editor = _props.editor,
         selectedSource = _props.selectedSource;
 
+    // Hidden Breakpoints are never rendered on the client
+
+    if (breakpoint.hidden) {
+      return;
+    }
+
     // NOTE: we need to wait for the breakpoint to be loaded
     // to get the generated location
-
     if (!selectedSource || breakpoint.loading) {
       return;
     }
 
     var sourceId = selectedSource.get("id");
     var line = (0, _editor.toEditorLine)(sourceId, breakpoint.location.line);
 
     (0, _editor.showSourceText)(editor, selectedSource.toJS());
@@ -27129,17 +27231,17 @@ class Breakpoint extends _react.Componen
   }
 
   shouldComponentUpdate(nextProps) {
     var _props2 = this.props,
         editor = _props2.editor,
         breakpoint = _props2.breakpoint,
         selectedSource = _props2.selectedSource;
 
-    return editor !== nextProps.editor || breakpoint.disabled !== nextProps.breakpoint.disabled || breakpoint.condition !== nextProps.breakpoint.condition || breakpoint.loading !== nextProps.breakpoint.loading || selectedSource !== nextProps.selectedSource;
+    return editor !== nextProps.editor || breakpoint.disabled !== nextProps.breakpoint.disabled || breakpoint.hidden !== nextProps.breakpoint.hidden || breakpoint.condition !== nextProps.breakpoint.condition || breakpoint.loading !== nextProps.breakpoint.loading || selectedSource !== nextProps.selectedSource;
   }
 
   componentDidMount() {
     this.addBreakpoint();
   }
 
   componentDidUpdate() {
     this.addBreakpoint();
@@ -27246,40 +27348,32 @@ class HitMarker extends _react.Component
   }
 }
 
 HitMarker.displayName = "HitMarker";
 
 exports.default = HitMarker;
 
 /***/ }),
-/* 716 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 717 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 716 */,
+/* 717 */,
 /* 718 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
 var _reactImmutableProptypes = __webpack_require__(150);
 
 var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
 
@@ -27292,112 +27386,113 @@ var _selectors = __webpack_require__(242
 var _devtoolsConfig = __webpack_require__(828);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _prefs = __webpack_require__(226);
 
-var _Breakpoints2 = __webpack_require__(725);
-
-var _Breakpoints3 = _interopRequireDefault(_Breakpoints2);
-
-var _Expressions2 = __webpack_require__(719);
-
-var _Expressions3 = _interopRequireDefault(_Expressions2);
+var _Breakpoints = __webpack_require__(725);
+
+var _Breakpoints2 = _interopRequireDefault(_Breakpoints);
+
+var _Expressions = __webpack_require__(719);
+
+var _Expressions2 = _interopRequireDefault(_Expressions);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
-var _Frames2 = __webpack_require__(1012);
-
-var _Frames3 = _interopRequireDefault(_Frames2);
-
-var _EventListeners2 = __webpack_require__(736);
-
-var _EventListeners3 = _interopRequireDefault(_EventListeners2);
-
-var _Accordion2 = __webpack_require__(739);
-
-var _Accordion3 = _interopRequireDefault(_Accordion2);
-
-var _CommandBar2 = __webpack_require__(742);
-
-var _CommandBar3 = _interopRequireDefault(_CommandBar2);
+var _Frames = __webpack_require__(1012);
+
+var _Frames2 = _interopRequireDefault(_Frames);
+
+var _EventListeners = __webpack_require__(736);
+
+var _EventListeners2 = _interopRequireDefault(_EventListeners);
+
+var _Workers = __webpack_require__(1147);
+
+var _Workers2 = _interopRequireDefault(_Workers);
+
+var _Accordion = __webpack_require__(739);
+
+var _Accordion2 = _interopRequireDefault(_Accordion);
+
+var _CommandBar = __webpack_require__(742);
+
+var _CommandBar2 = _interopRequireDefault(_CommandBar);
 
 var _ChromeScopes = __webpack_require__(728);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(731);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
-__webpack_require__(730);
+__webpack_require__(921);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
-var Breakpoints = (0, _react.createFactory)(_Breakpoints3.default);
-
-var Expressions = (0, _react.createFactory)(_Expressions3.default);
-
-var SplitBox = (0, _react.createFactory)(_devtoolsSplitter2.default);
-
-var Frames = (0, _react.createFactory)(_Frames3.default);
-
-var EventListeners = (0, _react.createFactory)(_EventListeners3.default);
-
-var Accordion = (0, _react.createFactory)(_Accordion3.default);
-
-var CommandBar = (0, _react.createFactory)(_CommandBar3.default);
-
-var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? (0, _react.createFactory)(_ChromeScopes2.default) : (0, _react.createFactory)(_Scopes3.default);
+var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? _ChromeScopes2.default : _Scopes3.default;
 
 function debugBtn(onClick, type, className, tooltip) {
-  className = `${type} ${className}`;
-  return _react.DOM.button({ onClick, className, key: type, title: tooltip }, (0, _Svg2.default)(type, { title: tooltip, "aria-label": tooltip }));
-}
+  return _react2.default.createElement(
+    "button",
+    {
+      onClick: onClick,
+      className: `${type} ${className}`,
+      key: type,
+      title: tooltip
+    },
+    _react2.default.createElement(_Svg2.default, { name: type, title: tooltip, "aria-label": tooltip })
+  );
+}
+debugBtn.displayName = "DebugButton";
 
 class SecondaryPanes extends _react.Component {
   renderBreakpointsToggle() {
     var _props = this.props,
         toggleAllBreakpoints = _props.toggleAllBreakpoints,
         breakpoints = _props.breakpoints,
         breakpointsDisabled = _props.breakpointsDisabled,
         breakpointsLoading = _props.breakpointsLoading;
 
     var boxClassName = "breakpoints-toggle";
     var isIndeterminate = !breakpointsDisabled && breakpoints.some(x => x.disabled);
 
     if (breakpoints.size == 0) {
       return null;
     }
 
-    return _react.DOM.input({
+    var inputProps = {
       type: "checkbox",
       "aria-label": breakpointsDisabled ? L10N.getStr("breakpoints.enable") : L10N.getStr("breakpoints.disable"),
       className: boxClassName,
       disabled: breakpointsLoading,
       onChange: e => {
         e.stopPropagation();
         toggleAllBreakpoints(!breakpointsDisabled);
       },
       onClick: e => e.stopPropagation(),
       checked: !breakpointsDisabled && !isIndeterminate,
       ref: input => {
         if (input) {
           input.indeterminate = isIndeterminate;
         }
       },
       title: breakpointsDisabled ? L10N.getStr("breakpoints.enable") : L10N.getStr("breakpoints.disable")
-    });
+    };
+
+    return _react2.default.createElement("input", inputProps);
   }
 
   watchExpressionHeaderButtons() {
     return [debugBtn(evt => {
       evt.stopPropagation();
       this.props.evaluateExpressions();
     }, "refresh", "refresh", L10N.getStr("watchExpressions.refreshButton"))];
   }
@@ -27415,58 +27510,63 @@ class SecondaryPanes extends _react.Comp
       shouldOpen: isPaused
     };
   }
 
   getWatchItem() {
     return {
       header: L10N.getStr("watchExpressions.header"),
       buttons: this.watchExpressionHeaderButtons(),
-      component: Expressions,
+      component: _Expressions2.default,
       opened: true
     };
   }
 
   getStartItems() {
     var scopesContent = this.props.horizontal ? this.getScopeItem() : null;
     var isPaused = () => !!this.props.pauseData;
 
     var items = [{
       header: L10N.getStr("breakpoints.header"),
       buttons: this.renderBreakpointsToggle(),
-      component: Breakpoints,
+      component: _Breakpoints2.default,
       opened: true
     }, {
       header: L10N.getStr("callStack.header"),
-      component: Frames,
+      component: _Frames2.default,
       opened: _prefs.prefs.callStackVisible,
       onToggle: opened => {
         _prefs.prefs.callStackVisible = opened;
       },
       shouldOpen: isPaused
     }, scopesContent];
 
     if ((0, _devtoolsConfig.isEnabled)("eventListeners")) {
       items.push({
         header: L10N.getStr("eventListenersHeader"),
-        component: EventListeners
+        component: _EventListeners2.default
+      });
+    }
+
+    if ((0, _devtoolsConfig.isEnabled)("workers")) {
+      items.push({
+        header: L10N.getStr("workersHeader"),
+        component: _Workers2.default
       });
     }
 
     if (this.props.horizontal) {
       items.unshift(this.getWatchItem());
     }
 
     return items.filter(item => item);
   }
 
   renderHorizontalLayout() {
-    return Accordion({
-      items: this.getItems()
-    });
+    return _react2.default.createElement(_Accordion2.default, { items: this.getItems() });
   }
 
   getEndItems() {
     var items = [];
 
     if (!this.props.horizontal) {
       items.unshift(this.getScopeItem());
     }
@@ -27478,31 +27578,34 @@ class SecondaryPanes extends _react.Comp
     return items;
   }
 
   getItems() {
     return [].concat(_toConsumableArray(this.getStartItems()), _toConsumableArray(this.getEndItems()));
   }
 
   renderVerticalLayout() {
-    return SplitBox({
+    return _react2.default.createElement(_devtoolsSplitter2.default, {
       style: { width: "100vw" },
       initialSize: "300px",
       minSize: 10,
       maxSize: "50%",
       splitterSize: 1,
-      startPanel: Accordion({ items: this.getStartItems() }),
-      endPanel: Accordion({ items: this.getEndItems() })
-    });
-  }
-
-  render() {
-    return _react.DOM.div({
-      className: "secondary-panes secondary-panes--sticky-commandbar"
-    }, CommandBar(), this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout());
+      startPanel: _react2.default.createElement(_Accordion2.default, { items: this.getStartItems() }),
+      endPanel: _react2.default.createElement(_Accordion2.default, { items: this.getEndItems() })
+    });
+  }
+
+  render() {
+    return _react2.default.createElement(
+      "div",
+      { className: "secondary-panes secondary-panes--sticky-commandbar" },
+      _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
+      this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
+    );
   }
 }
 
 SecondaryPanes.propTypes = {
   evaluateExpressions: _react.PropTypes.func.isRequired,
   pauseData: _react.PropTypes.object,
   horizontal: _react.PropTypes.bool,
   breakpoints: _reactImmutableProptypes2.default.map.isRequired,
@@ -27550,17 +27653,17 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(721);
+__webpack_require__(908);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getValue(expression) {
   var value = expression.value;
   if (!value) {
     return {
       path: expression.from,
@@ -27779,63 +27882,40 @@ class Expressions extends _react.PureCom
     );
   }
 }
 
 Expressions.displayName = "Expressions";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
-  expressions: (0, _selectors.getVisibleExpressions)(state),
+  expressions: (0, _selectors.getExpressions)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Expressions);
 
 /***/ }),
-/* 720 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 721 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 722 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 723 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 724 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 720 */,
+/* 721 */,
+/* 722 */,
+/* 723 */,
+/* 724 */,
 /* 725 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _reactRedux = __webpack_require__(151);
 
 var _reselect = __webpack_require__(993);
 
@@ -27860,42 +27940,51 @@ var _utils = __webpack_require__(234);
 var _source = __webpack_require__(233);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(720);
+__webpack_require__(907);
 
 var _lodash = __webpack_require__(2);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
 function isCurrentlyPausedAtBreakpoint(pause, breakpoint) {
   if (!pause || pause.isInterrupted) {
     return false;
   }
 
   var bpId = (0, _breakpoint.makeLocationId)(breakpoint.location);
   var pausedId = (0, _breakpoint.makeLocationId)((0, _lodash.get)(pause, "frame.location"));
   return bpId === pausedId;
 }
 
 function renderSourceLocation(source, line, column) {
   var filename = source ? (0, _source.getFilename)(source.toJS()) : null;
   var isWasm = source && source.get("isWasm");
   var columnVal = (0, _devtoolsConfig.isEnabled)("columnBreakpoints") && column ? `:${column}` : "";
   var bpLocation = isWasm ? `0x${line.toString(16).toUpperCase()}` : `${line}${columnVal}`;
 
-  return filename ? _react.DOM.div({ className: "location" }, `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`) : null;
-}
+  if (!filename) {
+    return null;
+  }
+
+  return _react2.default.createElement(
+    "div",
+    { className: "location" },
+    `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`
+  );
+}
+renderSourceLocation.displayName = "SourceLocation";
 
 class Breakpoints extends _react.PureComponent {
 
   shouldComponentUpdate(nextProps, nextState) {
     var breakpoints = this.props.breakpoints;
 
     return breakpoints !== nextProps.breakpoints;
   }
@@ -28053,47 +28142,77 @@ class Breakpoints extends _react.PureCom
   renderBreakpoint(breakpoint) {
     var snippet = breakpoint.text || "";
     var locationId = breakpoint.locationId;
     var line = breakpoint.location.line;
     var column = breakpoint.location.column;
     var isCurrentlyPaused = breakpoint.isCurrentlyPaused;
     var isDisabled = breakpoint.disabled;
     var isConditional = !!breakpoint.condition;
-
-    return _react.DOM.div({
-      className: (0, _classnames2.default)({
-        breakpoint,
-        paused: isCurrentlyPaused,
-        disabled: isDisabled,
-        "is-conditional": isConditional
+    var isHidden = breakpoint.hidden;
+
+    if (isHidden) {
+      return;
+    }
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)({
+          breakpoint,
+          paused: isCurrentlyPaused,
+          disabled: isDisabled,
+          "is-conditional": isConditional
+        }),
+        key: locationId,
+        onClick: () => this.selectBreakpoint(breakpoint),
+        onContextMenu: e => this.showContextMenu(e, breakpoint)
+      },
+      _react2.default.createElement("input", {
+        type: "checkbox",
+        className: "breakpoint-checkbox",
+        checked: !isDisabled,
+        onChange: () => this.handleCheckbox(breakpoint),
+        onClick: ev => ev.stopPropagation()
       }),
-      key: locationId,
-      onClick: () => this.selectBreakpoint(breakpoint),
-      onContextMenu: e => this.showContextMenu(e, breakpoint)
-    }, _react.DOM.input({
-      type: "checkbox",
-      className: "breakpoint-checkbox",
-      checked: !isDisabled,
-      onChange: () => this.handleCheckbox(breakpoint),
-      // Prevent clicking on the checkbox from triggering the onClick of
-      // the surrounding div
-      onClick: ev => ev.stopPropagation()
-    }), _react.DOM.div({ className: "breakpoint-label", title: breakpoint.text }, _react.DOM.div({}, renderSourceLocation(breakpoint.location.source, line, column))), _react.DOM.div({ className: "breakpoint-snippet" }, snippet), (0, _Close2.default)({
-      handleClick: ev => this.removeBreakpoint(ev, breakpoint),
-      tooltip: L10N.getStr("breakpoints.removeBreakpointTooltip")
-    }));
+      _react2.default.createElement(
+        "div",
+        { className: "breakpoint-label", title: breakpoint.text },
+        _react2.default.createElement(
+          "div",
+          null,
+          renderSourceLocation(breakpoint.location.source, line, column)
+        )
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "breakpoint-snippet" },
+        snippet
+      ),
+      _react2.default.createElement(_Close2.default, {
+        handleClick: ev => this.removeBreakpoint(ev, breakpoint),
+        tooltip: L10N.getStr("breakpoints.removeBreakpointTooltip")
+      })
+    );
   }
 
   render() {
     var breakpoints = this.props.breakpoints;
 
-    return _react.DOM.div({ className: "pane breakpoints-list" }, breakpoints.size === 0 ? _react.DOM.div({ className: "pane-info" }, L10N.getStr("breakpoints.none")) : breakpoints.valueSeq().map(bp => {
-      return this.renderBreakpoint(bp);
-    }));
+    var children = breakpoints.size === 0 ? _react2.default.createElement(
+      "div",
+      { className: "pane-info" },
+      L10N.getStr("breakpoints.none")
+    ) : breakpoints.valueSeq().map(bp => this.renderBreakpoint(bp));
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane breakpoints-list" },
+      children
+    );
   }
 }
 
 Breakpoints.displayName = "Breakpoints";
 
 function updateLocation(sources, pause, bp) {
   var source = (0, _selectors.getSourceInSources)(sources, bp.location.sourceId);
   var isCurrentlyPaused = isCurrentlyPausedAtBreakpoint(pause, bp);
@@ -28109,28 +28228,18 @@ function updateLocation(sources, pause, 
   return localBP;
 }
 
 var _getBreakpoints = (0, _reselect.createSelector)(_selectors.getBreakpoints, _selectors.getSources, _selectors.getPause, (breakpoints, sources, pause) => breakpoints.map(bp => updateLocation(sources, pause, bp)).filter(bp => bp.location.source && !bp.location.source.get("isBlackBoxed")));
 
 exports.default = (0, _reactRedux.connect)((state, props) => ({ breakpoints: _getBreakpoints(state) }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Breakpoints);
 
 /***/ }),
-/* 726 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 727 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 726 */,
+/* 727 */,
 /* 728 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28155,29 +28264,23 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(679);
-
-var _ManagedTree2 = __webpack_require__(419);
-
-var _ManagedTree3 = _interopRequireDefault(_ManagedTree2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ManagedTree = (0, _react.createFactory)(_ManagedTree3.default);
-
-function info(text) {
-  return _react.DOM.div({ className: "pane-info" }, text);
-}
+var _ManagedTree = __webpack_require__(419);
+
+var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
+
+__webpack_require__(850);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 // check to see if its an object with propertie
 function nodeHasProperties(item) {
   return !nodeHasChildren(item) && item.contents.value.type === "object";
 }
 
 function nodeIsPrimitive(item) {}
 
@@ -28233,33 +28336,53 @@ class Scopes extends _react.Component {
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
     var notEnumberable = false;
     var objectValue = "";
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("node object-node", {
-        focused: false,
-        "not-enumerable": notEnumberable
+    return React.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("node object-node", {
+          focused: false,
+          "not-enumerable": notEnumberable
+        }),
+        style: { marginLeft: depth * 15 },
+        key: item.path,
+        onClick: e => {
+          e.stopPropagation();
+          setExpanded(item, !expanded);
+        }
+      },
+      React.createElement(_Svg2.default, {
+        name: "arrow",
+        className: (0, _classnames2.default)({
+          expanded,
+          hidden: nodeIsPrimitive(item)
+        })
       }),
-      style: { marginLeft: depth * 15 },
-      key: item.path,
-      onClick: e => {
-        e.stopPropagation();
-        setExpanded(item, !expanded);
-      }
-    }, (0, _Svg2.default)("arrow", {
-      className: (0, _classnames2.default)({
-        expanded: expanded,
-        hidden: nodeIsPrimitive(item)
-      })
-    }), _react.DOM.span({ className: "object-label" }, item.name), _react.DOM.span({ className: "object-delimiter" }, objectValue ? ": " : ""), _react.DOM.span({ className: "object-value" }, objectValue || ""));
+      React.createElement(
+        "span",
+        { className: "object-label" },
+        item.name
+      ),
+      React.createElement(
+        "span",
+        { className: "object-delimiter" },
+        objectValue ? ": " : ""
+      ),
+      React.createElement(
+        "span",
+        { className: "object-value" },
+        objectValue || ""
+      )
+    );
   }
 
   getObjectProperties(item) {
     this.props.loadedObjects[item.contents.value.objectId];
   }
 
   getChildren(item) {
     var obj = item.contents;
@@ -28314,34 +28437,46 @@ class Scopes extends _react.Component {
     });
   }
 
   render() {
     var pauseInfo = this.props.pauseInfo;
 
 
     if (!pauseInfo) {
-      return _react.DOM.div({ className: "pane scopes-list" }, info(L10N.getStr("scopes.notPaused")));
+      return React.createElement(
+        "div",
+        { className: (0, _classnames2.default)("pane", "scopes-list") },
+        React.createElement(
+          "div",
+          { className: "pane-info" },
+          L10N.getStr("scopes.notPaused")
+        )
+      );
     }
 
     var roots = this.getRoots();
 
-    return _react.DOM.div({ className: "pane scopes-list" }, ManagedTree({
-      itemHeight: 20,
-      getParent: item => null,
-      getChildren: this.getChildren,
-      getRoots: () => roots,
-      getPath: item => item.path,
-      autoExpand: 0,
-      autoExpandDepth: 1,
-      autoExpandAll: false,
-      disabledFocus: true,
-      onExpand: this.onExpand,
-      renderItem: this.renderItem
-    }));
+    return React.createElement(
+      "div",
+      { className: (0, _classnames2.default)("pane", "scopes-list") },
+      React.createElement(_ManagedTree2.default, {
+        itemHeight: 20,
+        getParent: item => null,
+        getChildren: this.getChildren,
+        getRoots: () => roots,
+        getPath: item => item.path,
+        autoExpand: 0,
+        autoExpandDepth: 1,
+        autoExpandAll: false,
+        disabledFocus: true,
+        onExpand: this.onExpand,
+        renderItem: this.renderItem
+      })
+    );
   }
 }
 
 Scopes.propTypes = {
   scopes: _react.PropTypes.array,
   loadedObjects: _reactImmutableProptypes2.default.map,
   loadObjectProperties: _react.PropTypes.func,
   pauseInfo: _react.PropTypes.object
@@ -28351,28 +28486,18 @@ Scopes.displayName = "Scopes";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state),
   scopes: (0, _selectors.getChromeScopes)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Scopes);
 
 /***/ }),
-/* 729 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 730 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 729 */,
+/* 730 */,
 /* 731 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28391,17 +28516,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _scopes = __webpack_require__(732);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(679);
+__webpack_require__(850);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Scopes extends _react.PureComponent {
 
   constructor(props) {
     var pauseInfo = props.pauseInfo,
         selectedFrame = props.selectedFrame,
@@ -28635,34 +28760,19 @@ function getScopes(pauseInfo, selectedFr
     }
     scopeIndex++;
   } while (scope = scope.parent); // eslint-disable-line no-cond-assign
 
   return scopes;
 }
 
 /***/ }),
-/* 733 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 734 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 735 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 733 */,
+/* 734 */,
+/* 735 */,
 /* 736 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28681,17 +28791,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(726);
+__webpack_require__(915);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EventListeners extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -28779,28 +28889,18 @@ exports.default = (0, _reactRedux.connec
       line: l.line
     })
   }));
 
   return { listeners };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EventListeners);
 
 /***/ }),
-/* 737 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 738 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 737 */,
+/* 738 */,
 /* 739 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28809,17 +28909,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(727);
+__webpack_require__(917);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 class Accordion extends _react.Component {
 
   constructor(props) {
@@ -28872,17 +28972,17 @@ class Accordion extends _react.Component
     var containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
 
     return _react2.default.createElement(
       "div",
       { className: containerClassName, key: i },
       _react2.default.createElement(
         "div",
         { className: "_header", onClick: () => this.handleHeaderClick(i) },
-        (0, _Svg2.default)("arrow", { className: opened[i] ? "expanded" : "" }),
+        _react2.default.createElement(_Svg2.default, { name: "arrow", className: opened[i] ? "expanded" : "" }),
         item.header,
         item.buttons ? _react2.default.createElement(
           "div",
           { className: "header-buttons" },
           item.buttons
         ) : null
       ),
       created[i] || opened[i] ? _react2.default.createElement(
@@ -28943,17 +29043,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _text = __webpack_require__(389);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
-__webpack_require__(729);
+__webpack_require__(918);
 
 var _devtoolsModules = __webpack_require__(830);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var appinfo = _devtoolsModules.Services.appinfo;
 
 
@@ -29013,17 +29113,17 @@ function debugBtn(onClick, type, classNa
     "aria-label": tooltip,
     title: tooltip,
     disabled
   };
 
   return _react2.default.createElement(
     "button",
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
-    (0, _Svg2.default)(type)
+    _react2.default.createElement(_Svg2.default, { name: type })
   );
 }
 
 debugBtn.displayName = "CommandBarButton";
 
 class CommandBar extends _react.Component {
 
   componentWillUnmount() {
@@ -29101,17 +29201,21 @@ class CommandBar extends _react.Componen
     }
 
     return debugBtn(() => pauseOnExceptions(false, false), "pause-exceptions", "all enabled", L10N.getStr("pauseOnExceptions"));
   }
 
   render() {
     return _react2.default.createElement(
       "div",
-      { className: "command-bar" },
+      {
+        className: (0, _classnames2.default)("command-bar", {
+          vertical: !this.props.horizontal
+        })
+      },
       this.renderPauseButton(),
       this.renderStepButtons(),
       this.renderPauseOnExceptions()
     );
   }
 }
 
 CommandBar.contextTypes = {
@@ -29159,19 +29263,22 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _text = __webpack_require__(389);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(733);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+__webpack_require__(922);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _require = __webpack_require__(828),
+    isEnabled = _require.isEnabled;
 
 class WelcomeBox extends _react.Component {
 
   renderToggleButton() {
     var _props = this.props,
         horizontal = _props.horizontal,
         endPanelCollapsed = _props.endPanelCollapsed,
         togglePaneCollapse = _props.togglePaneCollapse;
@@ -29184,23 +29291,55 @@ class WelcomeBox extends _react.Componen
       position: "end",
       collapsed: !endPanelCollapsed,
       horizontal: horizontal,
       handleClick: togglePaneCollapse
     });
   }
 
   render() {
-    var searchLabel = L10N.getFormatStr("welcome.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2")));
+    var keyCombinationOne = (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"));
+
+    var keyCombinationTwo = (0, _text.formatKeyShortcut)(L10N.getStr("projectTextSearch.key"));
+
+    var searchSourcesLabel = L10N.getStr("welcome.search").substring(2);
+    var searchProjectLabel = L10N.getStr("welcome.findInFiles").substring(2);
+
+    var searchProjectLabelComp = _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(
+        "b",
+        null,
+        keyCombinationTwo
+      ),
+      searchProjectLabel
+    );
+
+    var searchSourcesLabelComp = _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(
+        "b",
+        null,
+        keyCombinationOne
+      ),
+      searchSourcesLabel
+    );
 
     return _react2.default.createElement(
       "div",
       { className: "welcomebox" },
-      searchLabel,
-      this.renderToggleButton()
+      _react2.default.createElement(
+        "div",
+        { className: "alignlabel" },
+        searchSourcesLabelComp,
+        isEnabled("searchNav") ? searchProjectLabelComp : null,
+        this.renderToggleButton()
+      )
     );
   }
 }
 
 WelcomeBox.displayName = "WelcomeBox";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
@@ -29254,17 +29393,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _lodash = __webpack_require__(2);
 
 var _text = __webpack_require__(389);
 
-__webpack_require__(734);
+__webpack_require__(923);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 var _Dropdown = __webpack_require__(751);
 
 var _Dropdown2 = _interopRequireDefault(_Dropdown);
@@ -29639,17 +29778,17 @@ class SourceTabs extends _react.PureComp
 
     return _react2.default.createElement(
       "div",
       {
         className: "new-tab-btn",
         onClick: onButtonClick,
         title: newTabTooltip
       },
-      (0, _Svg2.default)("plus")
+      _react2.default.createElement(_Svg2.default, { name: "plus" })
     );
   }
 
   renderDropdown() {
     var hiddenSourceTabs = this.state.hiddenSourceTabs;
     if (!hiddenSourceTabs || hiddenSourceTabs.size == 0) {
       return null;
     }
@@ -29683,20 +29822,20 @@ class SourceTabs extends _react.PureComp
       horizontal: this.props.horizontal
     });
   }
 
   getSourceAnnotation(source) {
     var sourceObj = source.toJS();
 
     if ((0, _source.isPretty)(sourceObj)) {
-      return (0, _Svg2.default)("prettyPrint");
+      return _react2.default.createElement(_Svg2.default, { name: "prettyPrint" });
     }
     if (sourceObj.isBlackBoxed) {
-      return (0, _Svg2.default)("blackBox");
+      return _react2.default.createElement(_Svg2.default, { name: "blackBox" });
     }
   }
 
   render() {
     return _react2.default.createElement(
       "div",
       { className: "source-header" },
       this.renderStartPanelToggleButton(),
@@ -29730,17 +29869,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(735);
+__webpack_require__(935);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Dropdown extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = {
@@ -29959,30 +30098,610 @@ function sortTree(tree) {
     }
     return previousNode.name.localeCompare(currentNode.name);
   });
 }
 
 /***/ }),
 /* 795 */,
 /* 796 */,
-/* 797 */,
-/* 798 */,
+/* 797 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getGeneratedLocation = undefined;
+
+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; };
+
+var getGeneratedLocation = exports.getGeneratedLocation = (() => {
+  var _ref = _asyncToGenerator(function* (state, source, location, sourceMaps) {
+    if (!sourceMaps.isOriginalId(location.sourceId)) {
+      return location;
+    }
+
+    var generatedLocation = yield sourceMaps.getGeneratedLocation(location, source);
+    var generatedSource = (0, _selectors.getSource)(state, generatedLocation.sourceId);
+    var sourceUrl = generatedSource.get("url");
+    return _extends({}, generatedLocation, { sourceUrl });
+  });
+
+  return function getGeneratedLocation(_x, _x2, _x3, _x4) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var _selectors = __webpack_require__(242);
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+/***/ }),
+/* 798 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _lodash = __webpack_require__(2);
+
+var _frame = __webpack_require__(1014);
+
+__webpack_require__(872);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function getFunctionName(func) {
+  var name = func.userDisplayName || func.displayName || func.name;
+  return (0, _frame.simplifyDisplayName)(name);
+}
+
+class PreviewFunction extends _react.Component {
+  renderFunctionName(func) {
+    var name = getFunctionName(func);
+    return _react2.default.createElement(
+      "span",
+      { className: "function-name" },
+      name
+    );
+  }
+
+  renderParams(func) {
+    var _func$parameterNames = func.parameterNames,
+        parameterNames = _func$parameterNames === undefined ? [] : _func$parameterNames;
+
+    var params = parameterNames.filter(i => i).map(param => _react2.default.createElement(
+      "span",
+      { className: "param", key: param },
+      param
+    ));
+
+    var commas = (0, _lodash.times)(params.length - 1).map((_, i) => _react2.default.createElement(
+      "span",
+      { className: "delimiter", key: i },
+      ", "
+    ));
+
+    return (0, _lodash.flatten)((0, _lodash.zip)(params, commas));
+  }
+
+  render() {
+    return _react2.default.createElement(
+      "span",
+      { className: "function-signature" },
+      this.renderFunctionName(this.props.func),
+      _react2.default.createElement(
+        "span",
+        { className: "paren" },
+        "("
+      ),
+      this.renderParams(this.props.func),
+      _react2.default.createElement(
+        "span",
+        { className: "paren" },
+        ")"
+      )
+    );
+  }
+}
+
+exports.default = PreviewFunction;
+PreviewFunction.displayName = "PreviewFunction";
+
+/***/ }),
 /* 799 */,
 /* 800 */,
 /* 801 */,
 /* 802 */,
 /* 803 */,
-/* 804 */,
-/* 805 */,
-/* 806 */,
+/* 804 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.findScopeByName = exports.getASTLocation = undefined;
+
+var getASTLocation = exports.getASTLocation = (() => {
+  var _ref = _asyncToGenerator(function* (source, location) {
+    var symbols = yield (0, _parser.getSymbols)(source);
+    var functions = [].concat(_toConsumableArray(symbols.functions), _toConsumableArray(symbols.memberExpressions));
+
+    var scope = findClosestScope(functions, location);
+    if (scope) {
+      var line = location.line - scope.location.start.line;
+      var column = location.column;
+      return { name: scope.name, offset: { line, column } };
+    }
+    return { name: undefined, offset: location };
+  });
+
+  return function getASTLocation(_x, _x2) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var findScopeByName = exports.findScopeByName = (() => {
+  var _ref2 = _asyncToGenerator(function* (source, name) {
+    var symbols = yield (0, _parser.getSymbols)(source);
+    var functions = symbols.functions;
+
+    return functions.find(function (node) {
+      return node.name === name;
+    });
+  });
+
+  return function findScopeByName(_x3, _x4) {
+    return _ref2.apply(this, arguments);
+  };
+})();
+
+var _parser = __webpack_require__(827);
+
+var _contains = __webpack_require__(1127);
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function findClosestScope(functions, location) {
+  return functions.reduce((found, currNode) => {
+    if (currNode.name === "anonymous" || !(0, _contains.containsPosition)(currNode.location, location)) {
+      return found;
+    }
+
+    if (!found) {
+      return currNode;
+    }
+
+    if (found.location.start.line > currNode.location.start.line || found.location.start.column > currNode.location.start.column) {
+      return found;
+    }
+
+    return currNode;
+  }, null);
+}
+
+/***/ }),
+/* 805 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = isSelectedFrameVisible;
+
+var _pause = __webpack_require__(239);
+
+var _sources = __webpack_require__(232);
+
+/*
+ * Checks to if the selected frame's source is currently
+ * selected.
+ */
+function isSelectedFrameVisible(state) {
+  var selectedLocation = (0, _sources.getSelectedLocation)(state);
+  var selectedFrame = (0, _pause.getSelectedFrame)(state);
+
+  return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
+}
+
+/***/ }),
+/* 806 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 256 256\"><defs><style>.cls-1{isolation:isolate;}.cls-17,.cls-2,.cls-25{fill:none;}.cls-17,.cls-2{stroke-miterlimit:10;}.cls-2{stroke-width:0.75px;stroke:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:#f15a24;}.cls-5{fill:#ed1c24;}.cls-6{fill:#c1272d;}.cls-7{fill:url(#linear-gradient-3);}.cls-8{fill:url(#linear-gradient-4);}.cls-9{fill:url(#linear-gradient-5);}.cls-10{fill:url(#linear-gradient-6);}.cls-11{opacity:0.49;fill:url(#linear-gradient-7);}.cls-12{fill:url(#linear-gradient-8);}.cls-13{fill:#2db5f9;}.cls-13,.cls-14{mix-blend-mode:screen;}.cls-14{fill:#5fd2ff;}.cls-15{fill:#219058;}.cls-16{fill:url(#linear-gradient-9);}.cls-17{stroke:#fff;stroke-width:1.87px;}.cls-18{fill:#f7b852;}.cls-19{fill:#ff8431;}.cls-20{fill:#fffb69;}.cls-21{fill:#44c688;}.cls-22{fill:#29b36e;}.cls-23{fill:#6fd191;}.cls-24{fill:#c83ad7;}.cls-26{fill:#fba9ff;}.cls-27{fill:#ff737d;}.cls-28{fill:#fdc666;}</style><linearGradient id=\"linear-gradient\" x1=\"67.45\" y1=\"154.72\" x2=\"67.29\" y2=\"155.43\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ff1d25\" stop-opacity=\"0.5\"></stop><stop offset=\"0.06\" stop-color=\"#ff1d25\" stop-opacity=\"0.54\"></stop><stop offset=\"0.37\" stop-color=\"#ff1d25\" stop-opacity=\"0.74\"></stop><stop offset=\"0.64\" stop-color=\"#ff1d25\" stop-opacity=\"0.88\"></stop><stop offset=\"0.86\" stop-color=\"#ff1d25\" stop-opacity=\"0.97\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient><linearGradient id=\"linear-gradient-2\" x1=\"73.09\" y1=\"170.74\" x2=\"73.09\" y2=\"153.5\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ffdd42\"></stop><stop offset=\"1\" stop-color=\"#fb784b\"></stop></linearGradient><linearGradient id=\"linear-gradient-3\" x1=\"201.52\" y1=\"95.13\" x2=\"207.88\" y2=\"89.89\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#5bcb99\"></stop><stop offset=\"1\" stop-color=\"#85a8e8\"></stop></linearGradient><linearGradient id=\"linear-gradient-4\" x1=\"81.17\" y1=\"158.3\" x2=\"279.32\" y2=\"55.49\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#34e28b\"></stop><stop offset=\"1\"></stop></linearGradient><linearGradient id=\"linear-gradient-5\" x1=\"117.57\" y1=\"178.22\" x2=\"133.15\" y2=\"178.22\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#c297ff\"></stop><stop offset=\"1\" stop-color=\"#ae31bb\"></stop></linearGradient><linearGradient id=\"linear-gradient-6\" x1=\"54.05\" y1=\"253.29\" x2=\"251.08\" y2=\"99.63\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-color=\"#d23de2\"></stop></linearGradient><linearGradient id=\"linear-gradient-7\" x1=\"199.8\" y1=\"86.45\" x2=\"191.83\" y2=\"113.37\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-opacity=\"0\"></stop></linearGradient><linearGradient id=\"linear-gradient-8\" x1=\"126.87\" y1=\"190.63\" x2=\"182.9\" y2=\"204.2\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#2db5f9\"></stop><stop offset=\"1\" stop-color=\"#092432\"></stop></linearGradient><linearGradient id=\"linear-gradient-9\" x1=\"83.08\" y1=\"49.55\" x2=\"46.06\" y2=\"151.24\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"0.21\" stop-color=\"#48080a\"></stop><stop offset=\"0.42\" stop-color=\"#891014\"></stop><stop offset=\"0.61\" stop-color=\"#bc151b\"></stop><stop offset=\"0.78\" stop-color=\"#e01a21\"></stop><stop offset=\"0.91\" stop-color=\"#f71c24\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient></defs><title>dojo_square</title><g class=\"cls-1\"><g id=\"Layer_1\" data-name=\"Layer 1\"><line class=\"cls-2\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-3\" d=\"M42.28,150.4l.52.82A58,58,0,0,0,52,161.49a45.23,45.23,0,0,0,28.74,10.25c.65,0,1.31,0,2,0a67.32,67.32,0,0,0,21.13-5.26,67.38,67.38,0,0,1-9.09.83,36.92,36.92,0,0,1-27.44-12.17A66.82,66.82,0,0,1,42.28,150.4Z\"></path><path class=\"cls-4\" d=\"M80.79,80.88a45.4,45.4,0,0,1,38.89,21.94A37,37,0,0,0,84.43,94.7c8.29,4,19.66,7.08,35.28,8.15,0,0-.77-14.87-19.8-22.64-26.57-10.84-30.33-8.69-37.06-19.9a30.09,30.09,0,0,0,6,22.15A45.45,45.45,0,0,1,80.79,80.88Z\"></path><path class=\"cls-5\" d=\"M99.92,80.21c-9.1-3.71-15.52-5.9-20.3-7.62A33.4,33.4,0,0,0,84.54,81a45.42,45.42,0,0,1,35.13,21.78,36.87,36.87,0,0,0-20.54-9.34,109,109,0,0,0,20,9.32l.59,0S118.94,88,99.92,80.21Z\"></path><path class=\"cls-6\" d=\"M119.69,102.85h.1c.29-1.62,2.07-14.46-12.4-25.7C85.78,60.37,81.56,58.82,80.53,49.94a27.8,27.8,0,0,0-.91,22.65c4.78,1.72,11.21,3.91,20.3,7.62,19,7.77,19.8,22.64,19.8,22.64Z\"></path><path class=\"cls-7\" d=\"M185.28,88.22a33.64,33.64,0,0,1,22.08,8.23,29.8,29.8,0,0,1,19,8S208.22,78,176.19,89a41.72,41.72,0,0,0-8.2,4A33.64,33.64,0,0,1,185.28,88.22Z\"></path><path class=\"cls-8\" d=\"M185.28,88.22A33.62,33.62,0,0,0,168,93l.93-.56c-25.88,15.24-57.6,62.06-101.56,62.65h0a36.92,36.92,0,0,0,27.44,12.17,67.38,67.38,0,0,0,9.09-.83c28.6-11.79,56.09-40,68.55-53.64,11.56-12.67,24.22-17,34.91-16.34A33.64,33.64,0,0,0,185.28,88.22Z\"></path><path class=\"cls-9\" d=\"M118.48,179a20.94,20.94,0,0,0-.92,5.86,22.25,22.25,0,0,0,1,6.74,16.56,16.56,0,0,1,5.5-14.74c0-.17.09-.34.14-.51a20.37,20.37,0,0,1,8.91-11.47l-.08,0a37.84,37.84,0,0,0-4,1.53A20.87,20.87,0,0,0,118.48,179Z\"></path><path class=\"cls-10\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-11\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-12\" d=\"M137.8,201.88a20.44,20.44,0,0,1-13.68-25.12h0l0,.08a16.56,16.56,0,0,0-5.5,14.73,20.94,20.94,0,0,0,33.63,9.38A20.37,20.37,0,0,1,137.8,201.88Z\"></path><path class=\"cls-13\" d=\"M144.91,200.4c2.12-6.17,9-15.7,16.33-11.34,0,0,6,3.36,7.23-6.11,0,0,4.49,22.28-17.1,21.53,0,0,4.86-3.55,4.81-7.2A24.73,24.73,0,0,1,144.91,200.4Z\"></path><path class=\"cls-14\" d=\"M153.52,186.75c2.14-1.09,4.16-2.18,8.08-.44,3,1.35,6.88-3.94,3.56-8.66,0,0,.21,4.88-3.72,4.84A8.81,8.81,0,0,0,153.52,186.75Z\"></path><path class=\"cls-15\" d=\"M175.21,115.88c-5.17,7-12.75,12.95-13.64,14.39s1.5,6.11,5,6.45.82-1.36.52-3,1.06,1,5.27.42-1.53-2.2-1.14-4.33,4.74-6.17,6.47-10.25,4.7,0,3.18,3.18c-.6,1.26,4.81-3.54,2.08-7.21S178.22,111.77,175.21,115.88Z\"></path><path class=\"cls-15\" d=\"M160.47,131.28c-.76.73-3,2.37-3,2.37s2.19,3.05,5,3c0,0,.61-.29-.27-1.18S160.27,131.82,160.47,131.28Z\"></path><path class=\"cls-16\" d=\"M84.43,94.7c-7.35-3.56-12.27-7.88-15.54-12.24A45.42,45.42,0,0,0,42.28,150.4a66.82,66.82,0,0,0,25.09,4.67h0A37,37,0,0,1,84.43,94.7Z\"></path><line class=\"cls-17\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-18\" d=\"M84.52,81c2,2.91,7.81,7.94,14.63,12.44a36.87,36.87,0,0,1,20.52,9.33A45.42,45.42,0,0,0,84.52,81Z\"></path><path class=\"cls-19\" d=\"M84.52,81c-1.23-.1-2.48-.16-3.74-.16a45.45,45.45,0,0,0-11.89,1.58c3.27,4.36,8.19,8.67,15.54,12.24a36.72,36.72,0,0,1,14.72-1.22C92.33,89,86.54,83.95,84.52,81Z\"></path><path class=\"cls-20\" d=\"M109.73,91.38a33.29,33.29,0,0,0-12.21-7.29C100.46,89.66,103,91.38,109.73,91.38Z\"></path><path class=\"cls-6\" d=\"M96.89,67.66a63.16,63.16,0,0,1,6.54,4.58c.52.39-.93-3.55-2.62-4.3A7.5,7.5,0,0,0,96.89,67.66Z\"></path><path class=\"cls-6\" d=\"M105,73.37a70.75,70.75,0,0,1,6.5,4.64c.53.38-.9-3.56-2.57-4.33A7.5,7.5,0,0,0,105,73.37Z\"></path><path class=\"cls-6\" d=\"M112.55,79a19.59,19.59,0,0,1,3.52,4.39c.26.38.07-2.58-.92-3.42A5.28,5.28,0,0,0,112.55,79Z\"></path><path class=\"cls-21\" d=\"M77.55,151c-.2-.65,2.35-1.48,3-1.51a11.91,11.91,0,0,1,3.57,1.19,16.34,16.34,0,0,1-4.89,1A4.46,4.46,0,0,1,77.55,151Z\"></path><path class=\"cls-21\" d=\"M86.73,148.78c-.22-.51,1.75-1.38,2.29-1.46a9.58,9.58,0,0,1,3,.65,13.15,13.15,0,0,1-3.83,1.23A3.59,3.59,0,0,1,86.73,148.78Z\"></path><path class=\"cls-21\" d=\"M94.41,146c-.22-.4,1.32-1.29,1.76-1.41a7.92,7.92,0,0,1,2.48.27,10.87,10.87,0,0,1-3,1.35A3,3,0,0,1,94.41,146Z\"></path><path class=\"cls-21\" d=\"M100.52,143.19c-.23-.35,1.11-1.27,1.5-1.41a7.25,7.25,0,0,1,2.29.07,10,10,0,0,1-2.67,1.45A2.72,2.72,0,0,1,100.52,143.19Z\"></path><path class=\"cls-21\" d=\"M106.23,140.07c-.22-.29.9-1.16,1.24-1.3a6.31,6.31,0,0,1,2,0,8.66,8.66,0,0,1-2.25,1.39A2.36,2.36,0,0,1,106.23,140.07Z\"></path><path class=\"cls-21\" d=\"M68.34,151.69c-.11-.73,2.73-1.16,3.46-1.09a12.76,12.76,0,0,1,3.57,1.86,17.51,17.51,0,0,1-5.35.26A4.78,4.78,0,0,1,68.34,151.69Z\"></path><path class=\"cls-6\" d=\"M70.08,65.82c2,2.27,6.68,3.74,6.68,3.74A19,19,0,0,1,75.83,62c0-.18-5.75-.09-6.73-4.81C68.91,56.23,68.1,63.55,70.08,65.82Z\"></path><path class=\"cls-4\" d=\"M50.54,174.68a5.49,5.49,0,0,1,2.24-3.88l.19-.11a14,14,0,0,0-1.43-.25c-6.85-1-8.59,3.06-8.95,7.64,0,.26,0,.53,0,.78a8.31,8.31,0,0,1,7.89-4.2Z\"></path><path class=\"cls-4\" d=\"M58.88,173.19c-6.81-4.13-10.63-4.43-12.15,7.14,0,0,7.17-5.67,10.55-1.92,3.68,4.07,8.68.32,6.05-2.06A18.77,18.77,0,0,0,58.88,173.19Z\"></path><path class=\"cls-4\" d=\"M56.06,174.53c-3.86,2.57-3.86,8.62-3.86,8.62s7-3.81,6.5-6.19A2.93,2.93,0,0,0,56.06,174.53Z\"></path><path class=\"cls-4\" d=\"M24,127a5.49,5.49,0,0,1,4.43-.68l.2.08a14,14,0,0,0-.7-1.27c-3.49-6-7.76-4.79-11.56-2.21-.22.15-.43.31-.63.47a8.31,8.31,0,0,1,8.21,3.53Z\"></path><path class=\"cls-4\" d=\"M31.29,134.08c-2.48-9.82-4.47-13.62-14-6.83,0,0,8.13-2.34,9.06,9.22.44,5.47,5.69,6.57,5.63,3A18.77,18.77,0,0,0,31.29,134.08Z\"></path><path class=\"cls-4\" d=\"M27.83,128.82c-4.52-1.07-8.94,3.06-8.94,3.06s6.94-.24,7.78,4C27.14,138.23,27.83,128.82,27.83,128.82Z\"></path><path class=\"cls-22\" d=\"M172.45,112.79a55.39,55.39,0,0,1,15.49-12.5c5.64-3,13.66-4.84,18.5-4.61l1.85,1.59-1-.08a37.75,37.75,0,0,0-19,3.76A55,55,0,0,0,172.45,112.79Z\"></path><path class=\"cls-23\" d=\"M207.12,95.74a34.5,34.5,0,0,1,10.45,2.68,27.42,27.42,0,0,1,8.81,6,27.05,27.05,0,0,0-9.09-5.29,43.65,43.65,0,0,0-9-1.84l-1.84-1.59Z\"></path><path class=\"cls-24\" d=\"M124.52,175.47a27.43,27.43,0,0,1,3.11-1.9,25.35,25.35,0,0,1,2.31-1c.78-.34,1.58-.58,2.38-.84a45.63,45.63,0,0,1,9.84-1.81,95.67,95.67,0,0,1,19.84.78,194.33,194.33,0,0,0,19.66,1.89,66.25,66.25,0,0,0,19.6-1.93,66.44,66.44,0,0,1-19.6,2.3,194.82,194.82,0,0,1-19.75-1.52,94.77,94.77,0,0,0-19.65-.41,44.43,44.43,0,0,0-9.55,1.94c-.76.27-1.53.52-2.27.85a24,24,0,0,0-2.18,1,21.38,21.38,0,0,0-3.93,2.7l-.53.47A18.42,18.42,0,0,1,124.52,175.47Z\"></path><line class=\"cls-25\" x1=\"124.09\" y1=\"176.84\" x2=\"124.09\" y2=\"176.84\"></line><path class=\"cls-6\" d=\"M85.66,97.64c-6.36,1.4-5.37,6.45-5.37,6.45s2-2.43,13.09-3.74A52.36,52.36,0,0,1,85.66,97.64Z\"></path><path class=\"cls-26\" d=\"M118.59,191.58a16.4,16.4,0,0,1-.08-4.24,18.64,18.64,0,0,1,.91-4.18,18.86,18.86,0,0,1,1.87-3.9,19.81,19.81,0,0,1,2.78-3.38l.46-.42s-.63,2-.7,2.51a19.27,19.27,0,0,0-1.61,1.93,17.84,17.84,0,0,0-3.33,7.5A16.22,16.22,0,0,0,118.59,191.58Z\"></path><path class=\"cls-27\" d=\"M65.89,155.08c-3.61-4-6.65-10.29-7.95-16.2a36.79,36.79,0,0,1-.82-9.49l.14-2.38.33-2.36a23,23,0,0,1,.47-2.33,19.65,19.65,0,0,1,.6-2.3,35.6,35.6,0,0,1,3.83-8.64,39.45,39.45,0,0,1,2.68-3.89l1.53-1.8c.51-.6,1.1-1.13,1.64-1.69a37.2,37.2,0,0,1,7.47-5.68,39.82,39.82,0,0,1,8.62-3.62A39.67,39.67,0,0,0,76,98.56a36.78,36.78,0,0,0-7.22,5.83c-.52.57-1.08,1.11-1.56,1.71l-1.45,1.81a38.67,38.67,0,0,0-2.51,3.89,34.62,34.62,0,0,0-3.48,8.52,18.77,18.77,0,0,0-.52,2.24,21.9,21.9,0,0,0-.38,2.27l-.25,2.28-.06,2.3a35.25,35.25,0,0,0,1.06,9.07,36.17,36.17,0,0,0,8.62,15.83l.66.71S66.44,155.12,65.89,155.08Z\"></path><path class=\"cls-28\" d=\"M103.89,166.42A47.14,47.14,0,0,1,94,167.55,37.09,37.09,0,0,1,84,165.91,46.7,46.7,0,0,1,74.71,162a34.57,34.57,0,0,1-8.12-6.17l-.69-.74s2.38,0,3-.06a33.57,33.57,0,0,0,6.72,5.5,45.26,45.26,0,0,0,8.82,4.27A36.2,36.2,0,0,0,94,166.91,47.78,47.78,0,0,0,103.89,166.42Z\"></path></g></g></svg>"
+
+/***/ }),
 /* 807 */,
 /* 808 */,
-/* 809 */,
-/* 810 */,
+/* 809 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(151);
+
+var _debounce = __webpack_require__(651);
+
+var _debounce2 = _interopRequireDefault(_debounce);
+
+var _Popup = __webpack_require__(810);
+
+var _Popup2 = _interopRequireDefault(_Popup);
+
+var _selectors = __webpack_require__(242);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _editor = __webpack_require__(257);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class Preview extends _react.PureComponent {
+
+  constructor() {
+    super();
+
+    var self = this;
+    self.onScroll = this.onScroll.bind(this);
+    self.onMouseOver = (0, _debounce2.default)(this.onMouseOver, 40);
+  }
+
+  componentDidMount() {
+    var codeMirror = this.props.editor.codeMirror;
+
+    var codeMirrorWrapper = codeMirror.getWrapperElement();
+
+    codeMirror.on("scroll", this.onScroll);
+    codeMirrorWrapper.addEventListener("mouseover", e => this.onMouseOver(e));
+    codeMirrorWrapper.addEventListener("mouseup", e => this.onMouseUp(e));
+    codeMirrorWrapper.addEventListener("mousedown", e => this.onMouseDown(e));
+  }
+
+  onMouseOver(e) {
+    var target = e.target;
+
+    if (this.props.selectedFrameVisible) {
+      (0, _editor.updatePreview)(target, this.props.editor, this.props);
+    }
+  }
+
+  onMouseUp() {
+    this.currentlySelecting = false;
+  }
+
+  onMouseDown() {
+    this.currentlySelecting = true;
+  }
+
+  onScroll() {
+    this.props.clearPreview();
+  }
+
+  onClose(e) {
+    this.props.clearPreview();
+  }
+
+  render() {
+    var _props = this.props,
+        selectedSource = _props.selectedSource,
+        preview = _props.preview;
+
+
+    if (!this.props.editor || !selectedSource || this.currentlySelecting) {
+      return null;
+    }
+
+    if (!preview || preview.updating) {
+      return null;
+    }
+
+    var result = preview.result,
+        expression = preview.expression,
+        location = preview.location,
+        cursorPos = preview.cursorPos;
+
+    var value = result;
+    if (typeof value == "undefined" || value.optimizedOut) {
+      return null;
+    }
+
+    var editorRange = (0, _editor.toEditorRange)(selectedSource.get("id"), location);
+
+    return _react2.default.createElement(_Popup2.default, {
+      value: value,
+      editor: this.props.editor,
+      range: editorRange,
+      expression: expression,
+      popoverPos: cursorPos,
+      onClose: e => this.onClose(e)
+    });
+  }
+}
+
+Preview.displayName = "Preview";
+
+exports.default = (0, _reactRedux.connect)(state => ({
+  preview: (0, _selectors.getPreview)(state),
+  selectedSource: (0, _selectors.getSelectedSource)(state),
+  linesInScope: (0, _selectors.getInScopeLines)(state),
+  selectedFrameVisible: (0, _selectors.isSelectedFrameVisible)(state)
+}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Preview);
+
+/***/ }),
+/* 810 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Popup = undefined;
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _reactRedux = __webpack_require__(151);
+
+var _redux = __webpack_require__(3);
+
+var _devtoolsConfig = __webpack_require__(828);
+
+var _devtoolsReps = __webpack_require__(924);
+
+var _devtoolsReps2 = _interopRequireDefault(_devtoolsReps);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _selectors = __webpack_require__(242);
+
+var _Popover = __webpack_require__(698);
+
+var _Popover2 = _interopRequireDefault(_Popover);
+
+var _PreviewFunction = __webpack_require__(798);
+
+var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
+
+var _editor = __webpack_require__(257);
+
+__webpack_require__(881);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var Rep = _devtoolsReps2.default.REPS.Rep,
+    MODE = _devtoolsReps2.default.MODE,
+    ObjectInspectorUtils = _devtoolsReps2.default.ObjectInspectorUtils;
+var ObjectInspector = _devtoolsReps2.default.ObjectInspector;
+var getChildren = ObjectInspectorUtils.getChildren;
+class Popup extends _react.Component {
+
+  componentDidMount() {
+    var _props = this.props,
+        loadObjectProperties = _props.loadObjectProperties,
+        loadedObjects = _props.loadedObjects,
+        value = _props.value,
+        editor = _props.editor,
+        range = _props.range;
+
+
+    this.marker = (0, _editor.markText)(editor, "preview-selection", range);
+
+    if (!value || !value.type == "object") {
+      return;
+    }
+
+    if (value.actor && !loadedObjects[value.actor]) {
+      loadObjectProperties(value);
+    }
+  }
+
+  componentWillUnmount() {
+    if (this.marker) {
+      this.marker.clear();
+    }
+  }
+
+  getChildren(root, getObjectProperties) {
+    var actors = {};
+
+    var children = getChildren({
+      getObjectProperties,
+      actors,
+      item: root
+    });
+
+    if (children.length > 0) {
+      return children;
+    }
+
+    return null;
+  }
+
+  renderFunctionPreview(value, root) {
+    var selectSourceURL = this.props.selectSourceURL;
+    var location = value.location;
+
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: "preview-popup",
+        onClick: () => selectSourceURL(location.url, { line: location.line })
+      },
+      _react2.default.createElement(_PreviewFunction2.default, { func: value })
+    );
+  }
+
+  renderObjectPreview(expression, root) {
+    return _react2.default.createElement(
+      "div",
+      { className: "preview-popup" },
+      this.renderObjectInspector(root)
+    );
+  }
+
+  renderSimplePreview(value) {
+    return _react2.default.createElement(
+      "div",
+      { className: "preview-popup" },
+      Rep({ object: value, mode: MODE.LONG })
+    );
+  }
+
+  renderObjectInspector(root) {
+    var _props2 = this.props,
+        loadObjectProperties = _props2.loadObjectProperties,
+        loadedObjects = _props2.loadedObjects;
+
+
+    var getObjectProperties = id => loadedObjects[id];
+    var roots = this.getChildren(root, getObjectProperties);
+
+    if (!roots) {
+      return null;
+    }
+
+    return _react2.default.createElement(ObjectInspector, {
+      roots: roots,
+      autoExpandDepth: 0,
+      disableWrap: true,
+      disabledFocus: true,
+      getObjectProperties: getObjectProperties,
+      loadObjectProperties: loadObjectProperties
+      // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
+      , getObjectEntries: actor => {},
+      loadObjectEntries: grip => {}
+    });
+  }
+
+  renderAddToExpressionBar(expression) {
+    if (!(0, _devtoolsConfig.isEnabled)("previewWatch")) {
+      return null;
+    }
+
+    var addExpression = this.props.addExpression;
+
+    return _react2.default.createElement(
+      "div",
+      { className: "add-to-expression-bar" },
+      _react2.default.createElement(
+        "div",
+        { className: "prompt" },
+        "\xBB"
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "expression-to-save-label" },
+        expression
+      ),
+      _react2.default.createElement(
+        "div",
+        {
+          className: "expression-to-save-button",
+          onClick: event => addExpression(event)
+        },
+        L10N.getStr("addWatchExpressionButton")
+      )
+    );
+  }
+
+  renderPreview(expression, value) {
+    var root = {
+      name: expression,
+      path: expression,
+      contents: { value }
+    };
+
+    if (value.class === "Function") {
+      return this.renderFunctionPreview(value, root);
+    }
+
+    if (value.type === "object") {
+      return _react2.default.createElement(
+        "div",
+        null,
+        this.renderObjectPreview(expression, root),
+        this.renderAddToExpressionBar(expression)
+      );
+    }
+
+    return this.renderSimplePreview(value);
+  }
+
+  getPreviewType(value) {
+    if (typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
+      return "tooltip";
+    }
+
+    return "popover";
+  }
+
+  render() {
+    var _props3 = this.props,
+        popoverPos = _props3.popoverPos,
+        onClose = _props3.onClose,
+        value = _props3.value,
+        expression = _props3.expression;
+
+
+    var type = this.getPreviewType(value);
+
+    return _react2.default.createElement(
+      _Popover2.default,
+      { targetPosition: popoverPos, onMouseLeave: onClose, type: type },
+      this.renderPreview(expression, value)
+    );
+  }
+}
+
+exports.Popup = Popup;
+Popup.displayName = "Popup";
+
+exports.default = (0, _reactRedux.connect)(state => ({
+  loadedObjects: (0, _selectors.getLoadedObjects)(state)
+}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Popup);
+
+/***/ }),
 /* 811 */,
 /* 812 */,
 /* 813 */,
 /* 814 */,
 /* 815 */,
 /* 816 */,
 /* 817 */,
 /* 818 */,
@@ -29998,32 +30717,34 @@ function sortTree(tree) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
+exports.getEmptyLines = exports.getNextStep = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
 
 var _devtoolsUtils = __webpack_require__(900);
 
 var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
 
 
 var dispatcher = new WorkerDispatcher();
 var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
 var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
 
 var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
 var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
 var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
 var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
 var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
+var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
+var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
 
 /***/ }),
 /* 828 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -30179,49 +30900,214 @@ module.exports = {
 /* 842 */,
 /* 843 */,
 /* 844 */,
 /* 845 */,
 /* 846 */,
 /* 847 */,
 /* 848 */,
 /* 849 */,
-/* 850 */,
-/* 851 */,
-/* 852 */,
-/* 853 */,
-/* 854 */,
-/* 855 */,
-/* 856 */,
-/* 857 */,
-/* 858 */,
-/* 859 */,
-/* 860 */,
-/* 861 */,
-/* 862 */,
-/* 863 */,
-/* 864 */,
-/* 865 */,
-/* 866 */,
-/* 867 */,
-/* 868 */,
-/* 869 */,
-/* 870 */,
-/* 871 */,
-/* 872 */,
-/* 873 */,
-/* 874 */,
-/* 875 */,
-/* 876 */,
-/* 877 */,
-/* 878 */,
-/* 879 */,
-/* 880 */,
-/* 881 */,
-/* 882 */,
+/* 850 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 851 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 852 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 853 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 854 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 855 */
+/***/ (function(module, exports) {
+
+module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABqCAMAAAAC5xbnAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CkzCJ1kAAAMAUExURUxpcf/fQOF4Wf6qob2GSbyGTP61q++hVlpCNO+ATLuESaZzPYdWLZ1uN/KOQywvJ/OGDfeTGWRSMlpFNvqrQ/yNkPipLfeTGviRGyobJAYCC5BgL/y2MKJrRg0gKH5ULfSTIWhnYyIeJv5/g7K1tfiSGviWIIZgPP+jn6KnqJxqNvmWH/qdTJNkM/6GjPmdKX5JIKiIafeVHTcuLK9uHvTn0/iUH5NiKQUbM/eTH0ExL/6hmv/TStTCqvidK/6Oi/uTkOnZv/mgNLaHbZppFu6ooPeMGYJVJOzbu5pqOap2RY+WnZaOgv+cmahkY/LjzvaEE+vew/2blzs+Ov6enQohIsVvb/+QkP6Bg4+YntB4de7Ru7yfg6KEaf+movj07s7Husx9atqYPJVKKLqESf/47v22GuJOM/3LLf/////ZY//37fyzGP3y4v2rFv3JLP3z5fuiEt9HM/3CKAAAAN1BL//+9f7NLtk7KP726NY0ILB4P/7XYvukH95HLf/88v65Gvy6J/7IKPPizLZ7QPqPEPru3N1AJ7+ITP+vprqAQ+p5IPiZGbV/Rfz8/PyzJv+lmP7VOfitIvqzT/zozeTMtf/RLvycCcSKTP29Hv/ocf/Btv3LOOdpHQQaI/7RY+JcJaltNP66r/3AM6OEMPCMH+nq6/Lz9JpiLzk3M/nYxE40H7WTMcgvHk9AMsLEwyQsL/u8ANrEqurWwJp2Jtrc3WRNR//76fzPsmJHI+FZHvfo1+WiHf3BV/p4dHVdMwABKfDALbV6Kt9PJ91+YHY/L6OVhJksJyIdGcUjB4VrMLd9OMqiL7EqIEJAP/3LXtu5maAFBP7OQ/yWj5GXl7w7K8GLHH1RLNyuLXklJ83Q0WYzLs2THIJJC/+PeXp4cIoABOe4LTUlJ//hbMWXYISKivqqA8udeemXhXtaHOiHc9YLAM1AKI+Ec7ideFVgYNs0BrgSAJh3YcRwII1ZGMCsj2QCAteBEXqDgviWNfW4esd1S8e4ofbDnNVeSrxWUew/xBkAAABkdFJOUwD+EP7//v4CAwX8/mb9HhH/MP3+/TT9TdYm/oP90bA4bPtYefztff7J+buL991SyUn+Y9v62T+cfp3S9P5co9TrkLj++vmqnHCp90X+nf3EvKx27ZH14bSWoqznwX6h/sly7fPC0KykAAAQBUlEQVRo3tyYe0xTWR7Hb+nwKKs4IK9UnAED+CIiLMvE9ZH1Oc64Pnc0O7O7/0nDo8/0BtKUptQ+VgzSUqCVR0oKXWhpAx0oQsOrGDWkQ8AVFggBFBWVSZTERxzHcXZ/59wWWakOGdl/9isgve39nO/9nd/5/c6BIP6/Fcj4X4EDA+Eb/4+00nTkPJAICcW/en6sJB2FJTQmJgp+i00lVtQ/wLYmJ0bFRpfQEnYk7tPx0vGzrNyEhtbR1BKuurpEreaqS0qi4SGIFZpmwIRG19FiWGxZdYlMxpJVVxcpD6UTKxIhYDASi7iyEhmFxz8lXIHyUOgKzDDQ05PrhDKMV9ct4LkCQULsB/Ph9tTIEhpNpi6pk7FldTRZhQfPZXMlWz+QD95jY2ggoZomZHO16jqtlqsVYjyL9cF8BhGlRvQSobYuMjy8lFJ4JODZLDbwUz8EzyBCIhE8kyeMLO0eqqnJR6qp6Q4XAB7xE0KAH8hgMH5d4PdA3Et4vDx1aU12dr5H2fmlAqADnsXdQfzq9QWrKQbRMzMBn79I2d0YD3x2AqSn3+5TET5X4/tGDoIH3lqC6bw82X/h73rwMIAkkTj8l4Ba+qkl3hjvK334OiOZRuN58DWL8JVDXvcsffJJToAmoDZg2+IigStSYOg7Fx5c/XTd51siaTqgv42/Wzkk8eDVyiRR7TCdHlC1aQFFtYOQ2H3h4e9I3EAi6JurPVevqkuw+UweK3wBn323ksKzIfQS/UvNMF2D8H7YPlVJ/aL2JHXDHaVRvgoffOLP06Akdh4Puxe+wQO8srJGgtKexRYIJMokOoVn4BRFt4cmJpcO1UCCZQ/t8Z0yERrNTo1m+j4PWT8nRPhsr3WEj2QVQFYK9Hrlxy81dE1hQNVRz2yGpO4LR8bxx2uSQnzYZxDbAgI0GA8SgioQ3sOuvAt4rqRIiVUE/MKAgMJtuKVF7YCgLCyR7PzuWJ/4CHpt4cOHSXqJRKvVqtVqbThatDVDQ90gKAuIXQRvqiH4SRpqZqmg5NekxN3btWvXTdCu/Jp9PiYXSvymqoOXX9TdrNMWUZJERkokEgEWlLaYOpCMfV9f9PTL/RvXHoS8REEZGtq1yzbY1NQ3PnMOKfNmeKjv6NQetL6IjLlJo1XfrPaKl5kH0unOfYt0X69/+Y9nrvl5O/PBV4zkGLBbzTvXZxkYcJtclnH4JEQ2JtF3UztaldJvvfbiPgJVfEsJHMeAIsNLf/zx9euOxk5V24h98PJpw3oiNaY6D+zydLawTN2AxdZks5n6YARhtJ+P1A8k/DZV7Tcw48obGzs6Hr7uQLqRlvb06VPz1HV+hrQ4Kwu+srIaNpPMy2dCiER1Jg+nWa9jfMbkmAmzNbl6+/ryzhVF+VpZDOAXriVnGwBRb59ApKwJst8sNjrJWQxui6tHIzSTd85AQQstEiK+LtPhOu0IGze5HW6bZSDMMS7Y4TM6ML1Hn5A/FAOimYzH+M3kmOKiwsycBy51FeN/j3N7nwxqx8yArs80MGC3rbWFjdvcpqbT9iLcEnzuP1aRcQ0Y34x4DXGk+YJCYbSSE+hlGzmCxownNxBowcZKhJk6k3t8QKfrC3OZTO4ZGMI9OaoVpPreETGINX9itgG+fnMDZddqVIjF4jEUHfg324zcz5J/I4JQX0tg5fF6bb0mGzzBTN9a+1q3ze4arWBxT7yrrh1+To7gOCPVz5PXxK9eKRTmfngar9qYU+sDcZHcIxGOh7mbIGdMjj7duLt3IOzAZBcLdxyfdc3vd3IrM76+obi4oaF+4hZ559nVnp6eV0Yr83IzXIXcaWi7Rf5GvB1uh6ZfVDBqt/eGmUx2l6lvJk83bjA4cN1L9I3fm6V60M+c/2F29lbcIEnap4wYL3522kAOxs2OjIzMzpNjwZe2UGaiuXOuXnvvQNO422RymYQFXQfmtAXQ76MZS6MDdUeVm9N6z0lSsjqnzGKx8WcjTO6U9Y7nKukU+5//8lM8uVslcw63axwnfa/bNTnZVUE1zKL0JfahoRwvzskQNd54nPLkScqTKbPRKEYTi2Q0ms0bx65Zr21crfjobPD5dajUQ+pztc8cWsuAyW1yTjpHnaOjk97txNv2YV6l0pycDKmqDCRvfZCWRqEVlIzmMeuY+IK/v//Z4Evr1xBBcH8yt0DL7rIarKNOg8uRZp1zjVI9Lfrt1EfzCuYz4Isjb5XDCC33FIoLFxUKsdG82jzmtPYbmAeuXElL+84/GEUnCKc+G5rM5NykY+7ZXJfT5ewqADirgpuwFH84F7FBIlX54+vPf2q5sd/8bAo0t9pJMg12i+HxjfLW8hv3rpz1P7sKRyckAbXIgoKCtEmHY9RlmKyAVyzY6u55Kzhe86AcPoff+Ueyv99iSXn8+Dkg5U9Ii2WQvCUv44hEfFXLd8GX1lEN+pAAB4PFKhh1OA84RyvYbDgIRCf6LTG/my+l8Bl8DkfEeURa7OTjMg6H097efp0ctNj7W8rk8JKTkVsefOkLXKOIKKV3e1XQNdplvcLVKxN2RDF8TOze3IyMBbyqvdViHyQfcdo5ZRw+5zoJ5h/J5Sp4iyPKyG25soXA0fGL1gu4XgmevlCeiA0hfB6Sjhd78SLkUQSODU1ywKva2x/+s8lwx2Oen5Mj7aTco9RXCjzSK5XRW0MXNj5L8ibXExsUfMC3kBbDvzra28vK2jume3puPyrzms+Rqu595jn6pn+sx2wIyqEoP7zTDPRdbhbwlP3Wy8x/90x3lEHv0tALNT3lco95jF+HowvxOaHHex8qKEGMd+0wg46/wUP0+Sr5rdtQb6Y1AYWwqYFtTaPXPOA7L26HvMeFJFaJgpJO/Y3gPdvvk960R+EBfNlPP08P02sDKNFr5Z0eOuAbD6zB+CAi6JOxNE9Q3n8u2d0ufWMfwqNqHB4upESn0wsbVRwvPUfa8jllPYjYMGjYQPzyHwQWLauF8Hc2VtUiVXU0NnZyvN7BPH//dk9FXPPbwU+I5ZyGFq8rD58v4nNUWBw+n5pVCp/xV5w3EQxiQxNzAzULv6y9uYv5OD35lHDKiLxv5PIjUKhDdh6N+AP9m2WfCoNOSqUZix8AY7H4b+Bgfu8RtBMJKaw9M4wOEYHLPBYSezszUMl/8wQibF60cA33g+b45t2QNat2Hjw2XPjVMo/p8KEjX8fL+ainLBrhzVBI0lyRfGKieGL9Z1+sN35/7Bi96uDy3EPqfB3fVh+f0sqBEGHYIix+JZVKOY0P4toaiidSLp0//5HxzrHhnaeWeTw/srkNth8jt//+fXnnfzq1vpC2rjAe9F4bc80MhhZCpqIWnDJLhw8V+2BhD4Wtb13pnvZ0axzahN6QeU0w/ol6r0muFldbRSK2I7F/Fh2KsqogGmOUzGGpobMOdFKmqN10o66Ubuw79yaptrGc5PeQnHvP+X7fd77z7zvnnpq6iApJRx1CTcv9f2d2t/cLPG0jswSsiQ/XN3uSk3DOqI7JPj/paWvzjIzOm7Z3P371o62lRuQET4H/r47bOhdffXtLtWtm5tVP2zyzdppX/tCb+dUXSXieKYAoqd9TsMZYGZ/qlsoxs7nY2Tk8PGwDDP31n297W/W70+0yWZm1l/39BTQhPOwt1uA5Ri7LvjAoGc/omL4T39W6tre3d3e5efXwuK3lwtqu2WRyfNiud/oYHbs/+PXgJ/a7vXO5YriAwa4pCs4+7fcsgfE6k8NYXeVgdDrGxDFrS5XfjKh3dAx6bSjXu0w63d6fnpFZYaA3S4Y1YGFAFXYR5NLI4IMdE/C4DQaRRsT+YOXLRyjB9HVUdOvdVkitLXlOrs7NYU4HctlpC6Gwf1qQs2ey6hhfbYXB2ceI5IzOO7oakBSZ3GD+tT7Q61WfLPh5DtN4sF5LkDTN5yxzyHhXA+yPfEzYet3CfjhhcrVXG/UOoGcWLubMzWkw5zK5TAuBEU892OGsopHVRuSDMEL+SMpXa6joRvViTP5L61m4M6XkHDojYEWOtQKJ0c2aIgj5GcbEILBu2Kx1IPN1oXuXcI1Hc0Yh35W/bDazJisHLQj0LkcEf/v7wrA6GlAWC6rZALbxYsdUCgMhl8vhdjtrgcPQADCKaJx4cqK9o70DQcyqdTscrr6d4vR4+LMv3u5oB0bxNKdC3OoDIHXzl8mpmxWRJ/Gox9jQ3l57uyQu89VTYXHEAGg0RqyfnKo2iK8MYo6ovaJxIh7zZVk/3ZTEgbYbUF9eHglNn/zWaKg4BIOxobzqbi5+19FkgPFQ7W4IzlEw+gZ695OJ+vLublQRBHSShILu+l9xhxV0nZLvq43l+mvOZpUKGs7lGovCNeb/B96qmpudTlCmr6qSIu76jgwN7qSQXjqhd6ugQ/isVqm3M1HsrOzAW6vP5xvrg77lULmdSEt5/XQJLn2uHzEj0uhgZaxh7KyEoqpAL8tyvjGXQ9Wsn8D0jlxWEmCjzCKvVAWOY1nWuxIyA9iDgGduzIHrHVnWAhfl5oAUxL3zYeythLiDxPCDikDKj9V3IMwt9cJ0gJhZs9e7EAgs7y/7/aMS1OuP9h6FsbfnNYerwsHEUIJHn14sSQHz8opanZH/4vXroaFOCUOro6vPL8wCnj9fzVlZDgQWxNIsF8rC7ThexA3Uk/lKCrbhGzcgPKgJY3wcYu+WlvEbNlvnH3fzJzPUoANUcKFSvJYF55gXlgcmlZYmu91O03Rww3al7ko4yqkTgx74rxzegGzYpivzkYqFUCnWvHAMmjZwL59qEqkRyCA/BOGmqKGyBoWYEPDYFsmglA06LMpJ9co9DZ7zc9cHlE0RbpHfPv1syHZVCs9QhDY+vMhP28loAYIghPySdMwpp5iyC/RBkGTTNL+BNvw223Dn0ItnQSAnD5YQD40wh22acEhUUmAPTgftBI/+p4M0+VYJBX8GM/aG1YTiFfS7CkjkZ2gRkiTfzRXSsEOF9Myud+nf6IgBBU9l4y/mWuII+qMArpfjrycxvfM+4PtG7ACF8dEr+KI41tpU2en4zCcFbRwrOXj/DB2rDRUIsYzPlMfzZRU6TxFBvsVLkoQEkjysRMErs+MxXgw0lQIflSf5ri6eoAVBsAgCbKR4eIoqIGkqLT52VNPzSguaSwiQJ2gqs/CMVpsmQQvb2M8EqJ1YF1qgzsf9TRu5x0JRYKygIJTa7Lemq3RNWhGtgMpAGSqeXnNg5rEIlBJAFWVLNZKnSpC4NEWQd5uiBEtaAhcuYIuVOYPQZQdx+eFNn1wuT5WlzWxtbm5tbWUmYDzQHz93J6U1+fHZx3mxB8flnp6UO9eTW88dT+Bzf6osr+d+T0pKMsgnxTzeb0XZ6NguLwHnpMpOtYJ4a2tya1ls+rOIHZ2s5SV22SXv8kdlZWWXvzwe+/5F3rnrwH39cVkizhFFUpOSUo/O/uBUHuBUkiwxRD+tH3V/5HC5hO5zvUcWhsCx9991OIT/AVwXLXUhLDYVAAAAAElFTkSuQmCC"
+
+/***/ }),
+/* 856 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 857 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 858 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 859 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 860 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 861 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 862 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 863 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 864 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 865 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 866 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 867 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 868 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 869 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 870 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 871 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 872 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 873 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 874 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 875 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 876 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 877 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 878 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 879 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 880 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 881 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 882 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 883 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(884);
 var fs = __webpack_require__(118);
 
 function Iterator(text) {
 	var pos = 0, length = text.length;
@@ -31104,16 +31990,17 @@ var onConnect = (() => {
 
     window.getGlobalsForTesting = function () {
       return {
         store,
         actions,
         selectors,
         client: client.clientCommands,
         prefs: _prefs.prefs,
+        features: _prefs.features,
         connection
       };
     };
 
     if (!(0, _devtoolsConfig.isFirefoxPanel)()) {
       console.group("Development Notes");
       var baseUrl = "https://devtools-html.github.io/debugger.html";
       var localDevelopmentUrl = `${baseUrl}/docs/local-development.html`;
@@ -31588,17 +32475,18 @@ function createSource(source, _ref) {
   var supportsWasm = _ref.supportsWasm;
 
   return {
     id: source.actor,
     url: source.url,
     isPrettyPrinted: false,
     isWasm: supportsWasm && source.introductionType === "wasm",
     sourceMapURL: source.sourceMapURL,
-    isBlackBoxed: false
+    isBlackBoxed: false,
+    loadedState: "unloaded"
   };
 }
 
 function createPause(packet, response) {
   // NOTE: useful when the debugger is already paused
   var frame = packet.frame || response.frames[0];
 
   return Object.assign({}, packet, {
@@ -32436,22 +33324,27 @@ WorkerDispatcher.prototype = {
 };
 
 function workerHandler(publicInterface) {
   return function (msg) {
     const { id, method, args } = msg.data;
     try {
       const response = publicInterface[method].apply(undefined, args);
       if (response instanceof Promise) {
-        response.then(val => self.postMessage({ id, response: val }), err => self.postMessage({ id, error: err }));
+        response.then(val => self.postMessage({ id, response: val }),
+        // Error can't be sent via postMessage, so be sure to
+        // convert to string.
+        err => self.postMessage({ id, error: err.toString() }));
       } else {
         self.postMessage({ id, response });
       }
     } catch (error) {
-      self.postMessage({ id, error });
+      // Error can't be sent via postMessage, so be sure to convert to
+      // string.
+      self.postMessage({ id, error: error.toString() });
     }
   };
 }
 
 function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
   let streamingWorker = (() => {
     var _ref = _asyncToGenerator(function* (id, tasks) {
       let isWorking = true;
@@ -32569,17 +33462,17 @@ var _prettyPrint = dispatcher.task("pret
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getTokenLocation = getTokenLocation;
-exports.updateSelection = updateSelection;
+exports.updatePreview = updatePreview;
 
 var _lodash = __webpack_require__(2);
 
 function getTokenLocation(codeMirror, tokenEl) {
   var _tokenEl$getBoundingC = tokenEl.getBoundingClientRect(),
       left = _tokenEl$getBoundingC.left,
       top = _tokenEl$getBoundingC.top,
       width = _tokenEl$getBoundingC.width,
@@ -32593,56 +33486,81 @@ function getTokenLocation(codeMirror, to
       ch = _codeMirror$coordsCha.ch;
 
   return {
     line: line + 1,
     column: ch
   };
 }
 
-function updateSelection(target, editor, _ref) {
+function updatePreview(target, editor, _ref) {
   var linesInScope = _ref.linesInScope,
-      selection = _ref.selection,
-      setSelection = _ref.setSelection,
-      clearSelection = _ref.clearSelection;
+      preview = _ref.preview,
+      setPreview = _ref.setPreview,
+      clearPreview = _ref.clearPreview;
 
   var location = getTokenLocation(editor.codeMirror, target);
   var tokenText = target.innerText ? target.innerText.trim() : "";
   var cursorPos = target.getBoundingClientRect();
 
-  if (selection) {
+  if (preview) {
     // We are mousing over the same token as before
-    if ((0, _lodash.isEqual)(selection.tokenPos, location)) {
-      return;
-    }
-
-    // We are mousing over a new token that is not in the selection
+    if ((0, _lodash.isEqual)(preview.tokenPos, location)) {
+      return;
+    }
+
+    // We are mousing over a new token that is not in the preview
     if (!target.classList.contains("debug-expression")) {
-      clearSelection();
+      clearPreview();
     }
   }
 
   var invalidToken = tokenText === "" || tokenText.match(/[(){},.;\s]/);
   var invalidTarget = target.parentElement && !target.parentElement.closest(".CodeMirror-line") || cursorPos.top == 0;
-  var isUpdating = selection && selection.updating;
+  var isUpdating = preview && preview.updating;
   var inScope = linesInScope && linesInScope.includes(location.line);
 
   if (invalidTarget || !inScope || isUpdating || invalidToken) {
     return;
   }
 
-  setSelection(tokenText, location, cursorPos);
-}
-
-/***/ }),
-/* 905 */,
-/* 906 */,
-/* 907 */,
-/* 908 */,
-/* 909 */,
+  setPreview(tokenText, location, cursorPos);
+}
+
+/***/ }),
+/* 905 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 906 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 907 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 908 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 909 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 910 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var SplitBox = __webpack_require__(911);
 
@@ -32657,17 +33575,17 @@ module.exports = SplitBox;
 
 var React = __webpack_require__(0);
 var ReactDOM = __webpack_require__(4);
 var Draggable = React.createFactory(__webpack_require__(912));
 var dom = React.DOM,
     PropTypes = React.PropTypes;
 
 
-__webpack_require__(689);
+__webpack_require__(861);
 
 /**
  * This component represents a Splitter. The splitter supports vertical
  * as well as horizontal mode.
  */
 var SplitBox = React.createClass({
   propTypes: {
     // Custom class name. You can use more names separated by a space.
@@ -32960,19 +33878,34 @@ var Draggable = React.createClass({
       onMouseDown: this.startDragging
     });
   }
 });
 
 module.exports = Draggable;
 
 /***/ }),
-/* 913 */,
-/* 914 */,
-/* 915 */,
+/* 913 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 914 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 915 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 916 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */
 ;(function(root) {
 
 	/** Detect free variables */
 	var freeExports = typeof exports == 'object' && exports &&
@@ -33502,33 +34435,58 @@ module.exports = Draggable;
 		root.punycode = punycode;
 	}
 
 }(this));
 
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(793)(module), __webpack_require__(792)))
 
 /***/ }),
-/* 917 */,
-/* 918 */,
+/* 917 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 918 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 919 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
 /* 920 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
-/* 921 */,
-/* 922 */,
-/* 923 */,
+/* 921 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 922 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 923 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 924 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -33587,17 +34545,17 @@ module.exports = {
 
 "use strict";
 
 
 /* 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/. */
 
-__webpack_require__(707);
+__webpack_require__(877);
 
 // Load all existing rep templates
 var Undefined = __webpack_require__(929);
 var Null = __webpack_require__(930);
 var StringRep = __webpack_require__(931);
 var LongStringRep = __webpack_require__(932);
 var Number = __webpack_require__(933);
 var ArrayRep = __webpack_require__(934);
@@ -34672,17 +35630,22 @@ maxLengthMap.set(MODE.LONG, 10);
 // Exports from this module
 module.exports = {
   rep: wrapRender(ArrayRep),
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
-/* 935 */,
+/* 935 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 936 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
@@ -36355,17 +37318,22 @@ function supportsObject(object) {
 
 // Exports from this module
 module.exports = {
   rep: wrapRender(ElementNode),
   supportsObject
 };
 
 /***/ }),
-/* 952 */,
+/* 952 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 953 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -37205,21 +38173,26 @@ module.exports = {
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
 /* 960 */
 /***/ (function(module, exports) {
 
-module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\n\n# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from\n# the context menu.\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy Stack Trace\n\n# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from\n# the context menu.\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step Over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step In %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step Out %S\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event Listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.deleteAll=Remove all breakpoints\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteSelf.accesskey): Access key to remove the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.deleteSelf.accesskey=r\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableSelf.accesskey): Access key to enable the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.enableSelf.accesskey=e\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableSelf.accesskey): Access key to disable the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.disableSelf.accesskey=d\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteAll.accesskey): Access key to remove all \n# the breakpoints from the context menu\nbreakpointMenuItem.deleteAll.accesskey=a\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableAll.accesskey): Access key to enable all \n# the breakpoints from the context menu\nbreakpointMenuItem.enableAll.accesskey=b\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableAll.accesskey): Access key to disable all \n# the breakpoints from the context menu\nbreakpointMenuItem.disableAll.accesskey=c\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteOthers.accesskey): Access key to remove  \n# other breakpoints from the context menu\nbreakpointMenuItem.deleteOthers.accesskey=p\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableOthers.accesskey): Access key to enable  \n# other breakpoints from the context menu\nbreakpointMenuItem.enableOthers.accesskey=q\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableOthers.accesskey): Access key to disable  \n# other breakpoints from the context menu\nbreakpointMenuItem.disableOthers.accesskey=s\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove Breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call Stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not Paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse Rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand Rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=no results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next Result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous Result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add Breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable Breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable Breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove Breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit Breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add Conditional Breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable Framework Grouping\n\n# LOCALIZATION NOTE (framework.disableGrouping.accesskey): Access key to toggle\n# framework grouping from the context menu.\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable Framework Grouping\n\n# LOCALIZATION NOTE (framework.enableGrouping.accesskey): Access key to toggle\n# framework grouping from the context menu.\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add Watch Expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select\n# source tab from the editor context menu item.\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close others\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs\n# from the editor context menu.\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs\n# after the selected tab from the editor context menu.\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the\n# editor context menu.\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in Tree\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the\n# tree from the context menu.\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy Link Address\n\n# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the\n# editor context menu.\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty Print Source\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from\n# the editor context menu.\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.blackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes Unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not Paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch Expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search Sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous Sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n"
+module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy Stack Trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step Over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step In %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step Out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event Listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove Breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call Stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not Paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse Rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand Rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=no results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next Result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous Result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add Breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable Breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable Breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove Breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit Breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add Conditional Breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable Framework Grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable Framework Grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add Watch Expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close others\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in Tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy Link Address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty Print Source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes Unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not Paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch Expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search Sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous Sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n"
 
 /***/ }),
 /* 961 */,
-/* 962 */,
+/* 962 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 963 */,
 /* 964 */,
 /* 965 */
 /***/ (function(module, exports) {
 
 
 /**
  * slice() reference.
@@ -39563,16 +40536,18 @@ var Tree = module.exports = createClass(
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getAndProcessFrames = getAndProcessFrames;
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 var _reselect = __webpack_require__(993);
 
 var _lodash = __webpack_require__(2);
 
@@ -39593,17 +40568,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _frame = __webpack_require__(1014);
 
 var _clipboard = __webpack_require__(423);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(724);
+__webpack_require__(914);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var FrameComponent = (0, _react.createFactory)(_Frame2.default);
 
 var Group = (0, _react.createFactory)(_Group3.default);
 
 var NUM_FRAMES_SHOWN = 7;
@@ -39675,59 +40650,81 @@ class Frames extends _react.Component {
         selectedFrame = _props3.selectedFrame,
         toggleBlackBox = _props3.toggleBlackBox,
         frameworkGroupingOn = _props3.frameworkGroupingOn;
 
 
     var framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
 
 
-    return _react.DOM.ul({}, framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
-      frame: frameOrGroup,
-      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
-      copyStackTrace: this.copyStackTrace,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frameOrGroup.id
-    }) : Group({
-      group: frameOrGroup,
-      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
-      copyStackTrace: this.copyStackTrace,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frameOrGroup[0].id
-    })));
+    return _react2.default.createElement(
+      "ul",
+      null,
+      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
+        frame: frameOrGroup,
+        toggleFrameworkGrouping: this.toggleFrameworkGrouping,
+        copyStackTrace: this.copyStackTrace,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frameOrGroup.id
+      }) : Group({
+        group: frameOrGroup,
+        toggleFrameworkGrouping: this.toggleFrameworkGrouping,
+        copyStackTrace: this.copyStackTrace,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frameOrGroup[0].id
+      }))
+    );
   }
 
   renderToggleButton(frames) {
     var buttonMessage = this.state.showAllFrames ? L10N.getStr("callStack.collapse") : L10N.getStr("callStack.expand");
 
     frames = this.collapseFrames(frames);
     if (frames.length <= NUM_FRAMES_SHOWN) {
       return null;
     }
 
-    return _react.DOM.div({ className: "show-more", onClick: this.toggleFramesDisplay }, buttonMessage);
+    return _react2.default.createElement(
+      "div",
+      { className: "show-more", onClick: this.toggleFramesDisplay },
+      buttonMessage
+    );
   }
 
   render() {
     var _props4 = this.props,
         frames = _props4.frames,
         pause = _props4.pause;
 
 
     if (!frames) {
-      return _react.DOM.div({ className: "pane frames" }, _react.DOM.div({ className: "pane-info empty" }, L10N.getStr("callStack.notPaused")));
-    }
-
-    return _react.DOM.div({ className: "pane frames" }, this.renderFrames(frames), (0, _WhyPaused2.default)({ pause }), this.renderToggleButton(frames));
+      return _react2.default.createElement(
+        "div",
+        { className: "pane frames" },
+        _react2.default.createElement(
+          "div",
+          { className: "pane-info empty" },
+          L10N.getStr("callStack.notPaused")
+        )
+      );
+    }
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane frames" },
+      this.renderFrames(frames),
+      (0, _WhyPaused2.default)({ pause }),
+      this.renderToggleButton(frames)
+    );
   }
 }
 
 Frames.propTypes = {
   frames: _react.PropTypes.array,
   frameworkGroupingOn: _react.PropTypes.bool.isRequired,
   toggleFrameworkGrouping: _react.PropTypes.func.isRequired,
   selectedFrame: _react.PropTypes.object,
@@ -39775,16 +40772,18 @@ exports.default = (0, _reactRedux.connec
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
@@ -39793,37 +40792,55 @@ var _frame = __webpack_require__(1014);
 var _source = __webpack_require__(233);
 
 var _FrameMenu = __webpack_require__(1032);
 
 var _FrameMenu2 = _interopRequireDefault(_FrameMenu);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function renderFrameTitle(frame, options) {
+function FrameTitle(_ref) {
+  var frame = _ref.frame,
+      options = _ref.options;
+
   var displayName = (0, _frame.formatDisplayName)(frame, options);
-  return _react.DOM.div({ className: "title" }, displayName);
-}
-
-function renderFrameLocation(_ref) {
-  var source = _ref.source,
-      location = _ref.location,
-      library = _ref.library;
-
-  if (!source) {
+  return _react2.default.createElement(
+    "div",
+    { className: "title" },
+    displayName
+  );
+}
+
+FrameTitle.displayName = "FrameTitle";
+
+function FrameLocation(_ref2) {
+  var frame = _ref2.frame;
+
+  if (!frame.source) {
     return;
   }
 
-  if (library) {
-    return _react.DOM.div({ className: "location" }, library, (0, _Svg2.default)(library.toLowerCase(), { className: "annotation-logo" }));
-  }
-
-  var filename = (0, _source.getFilename)(source);
-  return _react.DOM.div({ className: "location" }, `${filename}: ${location.line}`);
-}
+  if (frame.library) {
+    return _react2.default.createElement(
+      "div",
+      { className: "location" },
+      frame.library,
+      _react2.default.createElement(_Svg2.default, { name: frame.library.toLowerCase(), className: "annotation-logo" })
+    );
+  }
+
+  var filename = (0, _source.getFilename)(frame.source);
+  return _react2.default.createElement(
+    "div",
+    { className: "location" },
+    `${filename}: ${frame.location.line}`
+  );
+}
+
+FrameLocation.displayName = "FrameLocation";
 
 class FrameComponent extends _react.Component {
 
   constructor() {
     super();
   }
 
   onContextMenu(event) {
@@ -39854,26 +40871,32 @@ class FrameComponent extends _react.Comp
   render() {
     var _props2 = this.props,
         frame = _props2.frame,
         selectedFrame = _props2.selectedFrame,
         hideLocation = _props2.hideLocation,
         shouldMapDisplayName = _props2.shouldMapDisplayName;
 
 
-    return _react.DOM.li({
-      key: frame.id,
-      className: (0, _classnames2.default)("frame", {
-        selected: selectedFrame && selectedFrame.id === frame.id
-      }),
-      onMouseDown: e => this.onMouseDown(e, frame, selectedFrame),
-      onKeyUp: e => this.onKeyUp(e, frame, selectedFrame),
-      onContextMenu: e => this.onContextMenu(e),
-      tabIndex: 0
-    }, renderFrameTitle(frame, { shouldMapDisplayName }), !hideLocation ? renderFrameLocation(frame) : null);
+    var className = (0, _classnames2.default)("frame", {
+      selected: selectedFrame && selectedFrame.id === frame.id
+    });
+    return _react2.default.createElement(
+      "li",
+      {
+        key: frame.id,
+        className: className,
+        onMouseDown: e => this.onMouseDown(e, frame, selectedFrame),
+        onKeyUp: e => this.onKeyUp(e, frame, selectedFrame),
+        onContextMenu: e => this.onContextMenu(e),
+        tabIndex: 0
+      },
+      _react2.default.createElement(FrameTitle, { frame: frame, options: { shouldMapDisplayName } }),
+      !hideLocation && _react2.default.createElement(FrameLocation, { frame: frame })
+    );
   }
 }
 
 exports.default = FrameComponent;
 FrameComponent.defaultProps = {
   hideLocation: false,
   shouldMapDisplayName: true
 };
@@ -39974,16 +40997,20 @@ function isRxJs(frame) {
 function isAngular(frame) {
   return getFrameUrl(frame).match(/angular/i);
 }
 
 function isRedux(frame) {
   return getFrameUrl(frame).match(/redux/i);
 }
 
+function isDojo(frame) {
+  return getFrameUrl(frame).match(/dojo/i);
+}
+
 function getLibraryFromUrl(frame) {
   // @TODO each of these fns calls getFrameUrl, just call it once
   // (assuming there's not more complex logic to identify a lib)
 
   if (isBackbone(frame)) {
     return "Backbone";
   }
 
@@ -40038,16 +41065,20 @@ function getLibraryFromUrl(frame) {
   if (isAngular(frame)) {
     return "Angular";
   }
 
   if (isRedux(frame)) {
     return "Redux";
   }
 
+  if (isDojo(frame)) {
+    return "Dojo";
+  }
+
   if (isImmutable(frame)) {
     return "Immutable";
   }
 }
 
 var displayNameMap = {
   Backbone: {
     "extend/child": "Create Class",
@@ -40205,49 +41236,59 @@ function collapseLastFrames(frames) {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _frame = __webpack_require__(1014);
 
 var _FrameMenu = __webpack_require__(1032);
 
 var _FrameMenu2 = _interopRequireDefault(_FrameMenu);
 
-__webpack_require__(722);
+__webpack_require__(909);
 
 var _Frame = __webpack_require__(1013);
 
 var _Frame2 = _interopRequireDefault(_Frame);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var FrameComponent = (0, _react.createFactory)(_Frame2.default);
 
-
-function renderFrameLocation(frame) {
+function FrameLocation(_ref) {
+  var frame = _ref.frame;
+
   var library = (0, _frame.getLibraryFromUrl)(frame);
   if (!library) {
     return null;
   }
 
-  return _react.DOM.div({ className: "location" }, library, (0, _Svg2.default)(library.toLowerCase(), { className: "annotation-logo" }));
-}
+  return _react2.default.createElement(
+    "div",
+    { className: "location" },
+    library,
+    _react2.default.createElement(_Svg2.default, { name: library.toLowerCase(), className: "annotation-logo" })
+  );
+}
+
+FrameLocation.displayName = "FrameLocation";
 
 class Group extends _react.Component {
 
   constructor() {
     super(...arguments);
     this.state = { expanded: false };
     var self = this;
 
@@ -40279,48 +41320,67 @@ class Group extends _react.Component {
         frameworkGroupingOn = _props2.frameworkGroupingOn,
         toggleBlackBox = _props2.toggleBlackBox,
         copyStackTrace = _props2.copyStackTrace;
     var expanded = this.state.expanded;
 
     if (!expanded) {
       return null;
     }
-    return _react.DOM.div({ className: "frames-list" }, group.map(frame => FrameComponent({
-      frame,
-      copyStackTrace,
-      toggleFrameworkGrouping,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frame.id,
-      hideLocation: true,
-      shouldMapDisplayName: false
-    })));
+
+    return _react2.default.createElement(
+      "div",
+      { className: "frames-list" },
+      group.map(frame => FrameComponent({
+        frame,
+        copyStackTrace,
+        toggleFrameworkGrouping,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frame.id,
+        hideLocation: true,
+        shouldMapDisplayName: false
+      }))
+    );
   }
 
   renderDescription() {
     var frame = this.props.group[0];
     var displayName = (0, _frame.formatDisplayName)(frame);
-    return _react.DOM.li({
-      key: frame.id,
-      className: (0, _classnames2.default)("group"),
-      onClick: this.toggleFrames,
-      tabIndex: 0
-    }, _react.DOM.div({ className: "title" }, displayName), renderFrameLocation(frame));
+    return _react2.default.createElement(
+      "li",
+      {
+        key: frame.id,
+        className: (0, _classnames2.default)("group"),
+        onClick: this.toggleFrames,
+        tabIndex: 0
+      },
+      _react2.default.createElement(
+        "div",
+        { className: "title" },
+        displayName
+      ),
+      _react2.default.createElement(FrameLocation, { frame: frame })
+    );
   }
 
   render() {
     var expanded = this.state.expanded;
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("frames-group", { expanded }),
-      onContextMenu: e => this.onContextMenu(e)
-    }, this.renderDescription(), this.renderFrames());
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("frames-group", { expanded }),
+        onContextMenu: e => this.onContextMenu(e)
+      },
+      this.renderDescription(),
+      this.renderFrames()
+    );
   }
 }
 
 exports.default = Group;
 Group.displayName = "Group";
 
 /***/ }),
 /* 1016 */,
@@ -40441,17 +41501,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(709);
+__webpack_require__(879);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var BracketArrow = (_ref) => {
   var orientation = _ref.orientation,
       left = _ref.left,
       top = _ref.top,
       bottom = _ref.bottom;
@@ -40593,32 +41653,32 @@ module.exports = "<svg viewBox=\"0 0 14 
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getGeneratedLocation = undefined;
-
-var getGeneratedLocation = exports.getGeneratedLocation = (() => {
-  var _ref2 = _asyncToGenerator(function* (source, sourceMaps, location) {
-    if (!sourceMaps.isOriginalId(location.sourceId)) {
-      return location;
-    }
-
-    return yield sourceMaps.getGeneratedLocation(location, source.toJS());
-  });
-
-  return function getGeneratedLocation(_x2, _x3, _x4) {
-    return _ref2.apply(this, arguments);
-  };
-})();
-
+exports.findScopeByName = exports.getASTLocation = undefined;
+
+var _astBreakpointLocation = __webpack_require__(804);
+
+Object.defineProperty(exports, "getASTLocation", {
+  enumerable: true,
+  get: function () {
+    return _astBreakpointLocation.getASTLocation;
+  }
+});
+Object.defineProperty(exports, "findScopeByName", {
+  enumerable: true,
+  get: function () {
+    return _astBreakpointLocation.findScopeByName;
+  }
+});
 exports.firstString = firstString;
 exports.locationMoved = locationMoved;
 exports.makeLocationId = makeLocationId;
 exports.makePendingLocationId = makePendingLocationId;
 exports.assertBreakpoint = assertBreakpoint;
 exports.assertPendingBreakpoint = assertPendingBreakpoint;
 exports.assertLocation = assertLocation;
 exports.assertPendingLocation = assertPendingLocation;
@@ -40632,18 +41692,16 @@ var _devtoolsConfig = __webpack_require_
 var _selectors = __webpack_require__(242);
 
 var _assert = __webpack_require__(223);
 
 var _assert2 = _interopRequireDefault(_assert);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
 // Return the first argument that is a string, or null if nothing is a
 // string.
 function firstString() {
   for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
     args[_key] = arguments[_key];
   }
 
   for (var arg of args) {
@@ -40733,42 +41791,43 @@ function breakpointExists(state, locatio
   var currentBp = (0, _selectors.getBreakpoint)(state, location);
   return currentBp && !currentBp.disabled;
 }
 
 function createBreakpoint(location) {
   var overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
   var condition = overrides.condition,
       disabled = overrides.disabled,
+      hidden = overrides.hidden,
       generatedLocation = overrides.generatedLocation;
 
   var properties = {
     condition: condition || null,
     disabled: disabled || false,
+    hidden: hidden || false,
     generatedLocation: generatedLocation || location,
     location
   };
 
   return properties;
 }
 
 function createPendingLocation(location) {
   var sourceUrl = location.sourceUrl,
       line = location.line,
       column = location.column;
 
-  return { sourceUrl: sourceUrl, line, column };
+  return { sourceUrl, line, column };
 }
 
 function createPendingBreakpoint(bp) {
   var pendingLocation = createPendingLocation(bp.location);
   var pendingGeneratedLocation = createPendingLocation(bp.generatedLocation);
 
   assertPendingLocation(pendingLocation);
-  assertPendingLocation(pendingLocation);
 
   return {
     condition: bp.condition,
     disabled: bp.disabled,
     location: pendingLocation,
     generatedLocation: pendingGeneratedLocation
   };
 }
@@ -40781,18 +41840,20 @@ function createPendingBreakpoint(bp) {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.initialState = initialState;
 exports.getSymbols = getSymbols;
 exports.hasSymbols = hasSymbols;
+exports.isEmptyLineInSource = isEmptyLineInSource;
+exports.getEmptyLines = getEmptyLines;
 exports.getOutOfScopeLocations = getOutOfScopeLocations;
-exports.getSelection = getSelection;
+exports.getPreview = getPreview;
 
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
@@ -40804,62 +41865,71 @@ function _interopRequireWildcard(obj) { 
 /**
  * UI reducer
  * @module reducers/ui
  */
 
 function initialState() {
   return (0, _makeRecord2.default)({
     symbols: I.Map(),
+    emptyLines: I.Map(),
     outOfScopeLocations: null,
-    selection: null
+    preview: null
   })();
 }
 
 function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState();
   var action = arguments[1];
 
   switch (action.type) {
     case "SET_SYMBOLS":
       {
         var source = action.source,
             _symbols = action.symbols;
 
         return state.setIn(["symbols", source.id], _symbols);
       }
 
+    case "SET_EMPTY_LINES":
+      {
+        var _source = action.source,
+            _emptyLines = action.emptyLines;
+
+        return state.setIn(["emptyLines", _source.id], _emptyLines);
+      }
+
     case "OUT_OF_SCOPE_LOCATIONS":
       {
         return state.set("outOfScopeLocations", action.locations);
       }
 
     case "CLEAR_SELECTION":
       {
-        return state.set("selection", null);
-      }
-
-    case "SET_SELECTION":
+        return state.set("preview", null);
+      }
+
+    case "SET_PREVIEW":
       {
         if (action.status == "start") {
-          return state.set("selection", { updating: true });
+          return state.set("preview", { updating: true });
         }
 
         if (!action.value) {
-          return state.set("selection", null);
+          return state.set("preview", null);
         }
 
         var _action$value = action.value,
             _expression = _action$value.expression,
             _location = _action$value.location,
             _result = _action$value.result,
             _tokenPos = _action$value.tokenPos,
             _cursorPos = _action$value.cursorPos;
 
-        return state.set("selection", {
+        return state.set("preview", {
           updating: false,
           expression: _expression,
           location: _location,
           result: _result,
           tokenPos: _tokenPos,
           cursorPos: _cursorPos
         });
       }
@@ -40891,40 +41961,54 @@ function getSymbols(state, source) {
 function hasSymbols(state, source) {
   if (!source) {
     return false;
   }
 
   return !!state.ast.getIn(["symbols", source.id]);
 }
 
+function isEmptyLineInSource(state, line, selectedSource) {
+  var emptyLines = getEmptyLines(state, selectedSource);
+  return emptyLines.includes(line);
+}
+
+function getEmptyLines(state, source) {
+  if (!source) {
+    return [];
+  }
+
+  return state.ast.getIn(["emptyLines", source.id]) || [];
+}
+
 function getOutOfScopeLocations(state) {
   return state.ast.get("outOfScopeLocations");
 }
 
-function getSelection(state) {
-  return state.ast.get("selection");
+function getPreview(state) {
+  return state.ast.get("preview");
 }
 
 exports.default = update;
 
 /***/ }),
 /* 1059 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.setSymbols = setSymbols;
+exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
-exports.clearSelection = clearSelection;
-exports.setSelection = setSelection;
+exports.clearPreview = clearPreview;
+exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(242);
 
 var _promise = __webpack_require__(193);
 
 var _parser = __webpack_require__(827);
 
 var parser = _interopRequireWildcard(_parser);
@@ -40959,22 +42043,53 @@ function setSymbols(sourceId) {
     });
 
     return function (_x) {
       return _ref.apply(this, arguments);
     };
   })();
 }
 
-function setOutOfScopeLocations() {
+function setEmptyLines(sourceId) {
   return (() => {
     var _ref3 = _asyncToGenerator(function* (_ref4) {
       var dispatch = _ref4.dispatch,
           getState = _ref4.getState;
 
+      var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
+      if (!sourceRecord) {
+        return;
+      }
+
+      var source = sourceRecord.toJS();
+      if (!source.text) {
+        return;
+      }
+
+      var emptyLines = yield parser.getEmptyLines(source);
+
+      dispatch({
+        type: "SET_EMPTY_LINES",
+        source,
+        emptyLines
+      });
+    });
+
+    return function (_x2) {
+      return _ref3.apply(this, arguments);
+    };
+  })();
+}
+
+function setOutOfScopeLocations() {
+  return (() => {
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState;
+
       var location = (0, _selectors.getSelectedLocation)(getState());
       if (!location) {
         return;
       }
 
       var source = (0, _selectors.getSource)(getState(), location.sourceId);
 
       if (!location.line || !source) {
@@ -40987,29 +42102,29 @@ function setOutOfScopeLocations() {
       var locations = yield parser.getOutOfScopeLocations(source.toJS(), location);
 
       return dispatch({
         type: "OUT_OF_SCOPE_LOCATIONS",
         locations
       });
     });
 
-    return function (_x2) {
-      return _ref3.apply(this, arguments);
+    return function (_x3) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
-function clearSelection() {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch,
-        getState = _ref5.getState,
-        client = _ref5.client;
-
-    var currentSelection = (0, _selectors.getSelection)(getState());
+function clearPreview() {
+  return (_ref7) => {
+    var dispatch = _ref7.dispatch,
+        getState = _ref7.getState,
+        client = _ref7.client;
+
+    var currentSelection = (0, _selectors.getPreview)(getState());
     if (!currentSelection) {
       return;
     }
 
     return dispatch({
       type: "CLEAR_SELECTION"
     });
   };
@@ -41027,30 +42142,30 @@ function findBestMatch(symbols, tokenPos
     if (overlaps) {
       return expression;
     }
 
     return found;
   }, {});
 }
 
-function setSelection(token, tokenPos, cursorPos) {
+function setPreview(token, tokenPos, cursorPos) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
-
-      var currentSelection = (0, _selectors.getSelection)(getState());
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          client = _ref9.client;
+
+      var currentSelection = (0, _selectors.getPreview)(getState());
       if (currentSelection && currentSelection.updating) {
         return;
       }
 
       yield dispatch({
-        type: "SET_SELECTION",
+        type: "SET_PREVIEW",
         [_promise.PROMISE]: _asyncToGenerator(function* () {
           var source = (0, _selectors.getSelectedSource)(getState());
           var _symbols = yield parser.getSymbols(source.toJS());
 
           var found = findBestMatch(_symbols, tokenPos, token);
           if (!found) {
             return;
           }
@@ -41060,38 +42175,38 @@ function setSelection(token, tokenPos, c
 
 
           if (!expression) {
             return;
           }
 
           var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
 
-          var _ref9 = yield client.evaluate(expression, {
+          var _ref11 = yield client.evaluate(expression, {
             frameId: selectedFrame.id
           }),
-              result = _ref9.result;
+              result = _ref11.result;
 
           if (!result) {
             return;
           }
 
           return {
             expression,
             result,
             location,
             tokenPos,
             cursorPos
           };
         })()
       });
     });
 
-    return function (_x3) {
-      return _ref6.apply(this, arguments);
+    return function (_x4) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 1060 */,
 /* 1061 */,
 /* 1062 */,
@@ -41123,17 +42238,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(694);
+__webpack_require__(866);
 
 var _sourcesTree = __webpack_require__(39);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 class TextSearch extends _react.Component {
@@ -41202,35 +42317,27 @@ class TextSearch extends _react.Componen
     this.props.selectSource(matchItem.sourceId, { line: matchItem.line });
   }
 
   renderFile(file, focused, expanded, setExpanded) {
     if (focused) {
       this.focused = { setExpanded, file, expanded };
     }
 
-    var svgArrow = (0, _Svg2.default)("arrow", {
-      className: (0, _classnames2.default)({
-        expanded
-      })
-    });
-
-    var svgFile = (0, _Svg2.default)("file");
-
     var matches = ` (${file.matches.length} match${file.matches.length > 1 ? "es" : ""})`;
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("file-result", { focused }),
         key: file.sourceId,
         onClick: e => setExpanded(file, !expanded)
       },
-      svgArrow,
-      svgFile,
+      _react2.default.createElement(_Svg2.default, { name: "arrow", className: (0, _classnames2.default)({ expanded }) }),
+      _react2.default.createElement(_Svg2.default, { name: "file" }),
       _react2.default.createElement(
         "span",
         { className: "file-path" },
         (0, _sourcesTree.getRelativePath)(file.filepath)
       ),
       _react2.default.createElement(
         "span",
         { className: "matches-summary" },
@@ -41269,42 +42376,46 @@ class TextSearch extends _react.Componen
     while ((match = re.exec(value)) !== null) {
       matchIndexes.push(match.index);
     }
 
     matchIndexes.forEach((matchIndex, index) => {
       if (matchIndex > 0 && index === 0) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case1-${index}` },
           value.slice(0, matchIndex)
         ));
       }
       if (matchIndex > matchIndexes[index - 1] + len) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case2-${index}` },
           value.slice(matchIndexes[index - 1] + len, matchIndex)
         ));
       }
       matches.push(_react2.default.createElement(
         "span",
         { className: "query-match", key: index },
         value.substr(matchIndex, len)
       ));
       if (index === matchIndexes.length - 1) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case3-${index}` },
           value.slice(matchIndex + len, value.length)
         ));
       }
     });
 
-    return _react.DOM.span.apply(_react.DOM, [{ className: "line-value" }].concat(matches));
+    return _react2.default.createElement(
+      "span",
+      { className: "line-value" },
+      matches
+    );
   }
 
   getResults() {
     var results = this.props.results;
 
     return results.filter(result => result.filepath && result.matches.length > 0);
   }
 
@@ -41319,17 +42430,17 @@ class TextSearch extends _react.Componen
       var setExpanded = _ref.setExpanded;
 
       return item.filepath ? this.renderFile(item, focused, expanded, setExpanded) : this.renderMatch(item, focused);
     };
 
     return _react2.default.createElement(_ManagedTree2.default, {
       getRoots: () => results,
       getChildren: file => file.matches || [],
-      itemHeight: 20,
+      itemHeight: 24,
       autoExpand: 1,
       autoExpandDepth: 1,
       focused: results[0],
       getParent: item => null,
       getPath: getFilePath,
       renderItem: renderItem
     });
   }
@@ -41501,17 +42612,17 @@ exports.default = renderWhyPaused;
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _lodash = __webpack_require__(2);
 
 var _pause = __webpack_require__(255);
 
-__webpack_require__(723);
+__webpack_require__(913);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderExceptionSummary(exception) {
   if ((0, _lodash.isString)(exception)) {
     return exception;
   }
 
@@ -41621,18 +42732,49 @@ function getInScopeLines(state) {
     return sourceLines;
   }
 
   return _lodash.without.apply(undefined, [sourceLines].concat(_toConsumableArray(linesOutOfScope)));
 }
 
 /***/ }),
 /* 1125 */,
-/* 1126 */,
-/* 1127 */,
+/* 1126 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg enable-background=\"new 0 0 800 800\" id=\"GUIDE\" version=\"1.1\" viewBox=\"0 0 800 800\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><path d=\"M580.562,219.439c-12.721-12.723-29.637-19.728-47.623-19.728c-17.987,0-34.903,7.005-47.625,19.728 c-12.72,12.72-19.725,29.634-19.725,47.621c0,17.99,7.005,34.904,19.725,47.625c12.722,12.721,29.633,19.723,47.618,19.726 c0.007,0,0.007,0,0.007,0c17.986,0,34.902-7.005,47.623-19.726c12.721-12.723,19.726-29.636,19.726-47.625 C600.286,249.073,593.281,232.16,580.562,219.439z M553.771,287.895c-5.566,5.568-12.96,8.636-20.834,8.636l0,0 c-7.872-0.002-15.271-3.068-20.834-8.636c-5.566-5.562-8.633-12.96-8.633-20.834c0-7.868,3.065-15.269,8.633-20.834 c5.563-5.565,12.967-8.63,20.834-8.63c7.868,0,15.268,3.063,20.834,8.63C565.263,257.715,565.263,276.407,553.771,287.895z\" fill=\"#041C3F\"></path><g><path d=\"M62.282,627.218c-4.847,0-9.693-1.847-13.392-5.546c-7.398-7.397-7.398-19.395,0-26.79L158.42,485.35 c7.398-7.397,19.392-7.397,26.79,0s7.398,19.395,0,26.792L75.676,621.672C71.978,625.371,67.131,627.218,62.282,627.218z\" fill=\"#041C3F\"></path></g><g><path d=\"M86.774,732.172c-4.85,0-9.696-1.85-13.395-5.549c-7.398-7.397-7.398-19.389,0-26.786L187.545,585.67 c7.398-7.398,19.392-7.398,26.787,0c7.398,7.398,7.398,19.393,0,26.79L100.168,726.623C96.47,730.322,91.62,732.172,86.774,732.172 z\" fill=\"#041C3F\"></path></g><g><path d=\"M191.725,756.661c-4.849,0-9.696-1.847-13.395-5.546c-7.398-7.397-7.398-19.393,0-26.789L287.863,614.79 c7.396-7.394,19.392-7.396,26.787,0c7.398,7.397,7.398,19.395,0,26.793L205.12,751.115 C201.421,754.813,196.574,756.661,191.725,756.661z\" fill=\"#041C3F\"></path></g><path d=\"M751.113,48.891c-4.302-4.3-10.409-6.278-16.403-5.311c-2.202,0.357-54.705,8.98-126.25,36.316 c-41.974,16.034-81.85,35.237-118.529,57.076c-45.039,26.814-85.356,57.721-119.899,91.871l-143.055,27.85 c-3.693,0.718-7.086,2.524-9.753,5.177L87.618,391.06c-5.907,5.886-7.267,14.938-3.36,22.301c3.33,6.27,9.818,10.059,16.725,10.059 c1.202,0,2.415-0.114,3.628-0.347l146.185-28.463c-9.516,18.672-18.419,38.055-26.683,58.144 c-2.904,7.072-1.279,15.194,4.125,20.603l35.811,35.811l-33.27,33.27c-7.398,7.398-7.398,19.39,0,26.787 c3.699,3.699,8.545,5.549,13.397,5.549c4.847,0,9.693-1.85,13.392-5.546l33.27-33.271l35.811,35.813 c3.625,3.619,8.469,5.548,13.4,5.548c2.423,0,4.871-0.467,7.199-1.426c20.091-8.262,39.475-17.165,58.141-26.678l-28.455,146.186 c-1.593,8.183,2.35,16.443,9.709,20.352c2.806,1.488,5.852,2.213,8.879,2.213c4.917,0,9.778-1.918,13.417-5.573l129.188-129.604 c2.656-2.663,4.459-6.061,5.181-9.753l27.845-143.055c34.148-34.547,65.06-74.859,91.876-119.901 c21.834-36.683,41.04-76.558,57.077-118.529c27.33-71.551,35.958-124.048,36.313-126.25 C757.386,59.292,755.407,53.188,751.113,48.891z M158.393,374.001l81.489-81.224l87.674-17.069 c-19.015,23.391-36.655,48.634-52.847,75.648L158.393,374.001z M507.219,560.121l-81.222,81.489l22.643-116.316 c27.021-16.192,52.259-33.83,75.648-52.848L507.219,560.121z M684.359,178.936c-23.915,62.371-68.01,152.302-142.237,226.531 c-34.171,34.168-73.96,64.54-118.89,90.838c-0.804,0.401-1.585,0.854-2.322,1.366c-24.049,13.943-49.566,26.728-76.476,38.302 l-26.806-26.809l54.11-54.106c7.395-7.397,7.395-19.392,0-26.79c-7.398-7.397-19.392-7.396-26.79,0l-54.109,54.106l-26.806-26.809 c11.578-26.913,24.361-52.433,38.308-76.488c0.508-0.732,0.951-1.5,1.35-2.295c26.298-44.938,56.672-84.732,90.849-118.909 c74.225-74.225,164.156-118.319,226.527-142.235c37.897-14.537,70.522-23.601,92.09-28.797 C707.959,108.412,698.894,141.038,684.359,178.936z\" fill=\"#041C3F\"></path></svg>"
+
+/***/ }),
+/* 1127 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.containsPosition = containsPosition;
+exports.containsLocation = containsLocation;
+exports.nodeContainsPosition = nodeContainsPosition;
+function containsPosition(a, b) {
+  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
+  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
+
+  return startsBefore && endsAfter;
+}
+function containsLocation(a, b) {
+  return containsPosition(a, b.start) && containsPosition(a, b.end);
+}
+
+function nodeContainsPosition(node, position) {
+  return containsPosition(node.loc, position);
+}
+
+/***/ }),
 /* 1128 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -41664,17 +42806,17 @@ var _require = __webpack_require__(830),
     Menu = _require.Menu,
     MenuItem = _require.MenuItem;
 
 function inToolbox() {
   return window.parent.document.documentURI == "about:devtools-toolbox";
 }
 
 if (!inToolbox()) {
-  __webpack_require__(683);
+  __webpack_require__(854);
 }
 
 function createPopup(doc) {
   var popup = doc.createElement("menupopup");
   popup.className = "landing-popup";
   if (popup.openPopupAtScreen) {
     return popup;
   }
@@ -41800,17 +42942,59 @@ function buildMenu(items) {
 
 module.exports = {
   showMenu,
   buildMenu
 };
 
 /***/ }),
 /* 1131 */,
-/* 1132 */,
+/* 1132 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = update;
+exports.getSourceSearchQuery = getSourceSearchQuery;
+
+var _makeRecord = __webpack_require__(230);
+
+var _makeRecord2 = _interopRequireDefault(_makeRecord);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function InitialState() {
+  return (0, _makeRecord2.default)({
+    queryString: ""
+  })();
+}
+
+function update() {
+  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : InitialState();
+  var action = arguments[1];
+
+  switch (action.type) {
+    case "SET_QUERY_STRING":
+      return state.update("queryString", value => action.queryString);
+    case "CLEAR_QUERY_STRING":
+      return state.update("queryString", value => "");
+    default:
+      return state;
+  }
+}
+
+function getSourceSearchQuery(state) {
+  return state.sourceSearch.get("queryString");
+}
+
+/***/ }),
 /* 1133 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -42029,26 +43213,28 @@ var _devtoolsSourceMap = __webpack_requi
 
 function getLocation(breakpoint, isGeneratedSource) {
   return isGeneratedSource ? breakpoint.generatedLocation || breakpoint.location : breakpoint.location;
 }
 
 function formatBreakpoint(breakpoint, selectedSource) {
   var condition = breakpoint.condition,
       loading = breakpoint.loading,
-      disabled = breakpoint.disabled;
+      disabled = breakpoint.disabled,
+      hidden = breakpoint.hidden;
 
   var sourceId = selectedSource.get("id");
   var isGeneratedSource = (0, _devtoolsSourceMap.isGeneratedId)(sourceId);
 
   return {
     location: getLocation(breakpoint, isGeneratedSource),
     condition,
     loading,
-    disabled
+    disabled,
+    hidden
   };
 }
 
 function isVisible(breakpoint, selectedSource) {
   var sourceId = selectedSource.get("id");
   var isGeneratedSource = (0, _devtoolsSourceMap.isGeneratedId)(sourceId);
 
   var location = getLocation(breakpoint, isGeneratedSource);
@@ -42076,66 +43262,55 @@ function getVisibleBreakpoints(state) {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: 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; };
 
-var _getGeneratedLocation = (() => {
-  var _ref = _asyncToGenerator(function* (state, source, sourceMaps, location) {
-    var generatedLocation = yield (0, _breakpoint.getGeneratedLocation)(source, sourceMaps, location);
-
-    var generatedSource = (0, _selectors.getSource)(state, generatedLocation.sourceId);
-    var sourceUrl = generatedSource.get("url");
-    return _extends({}, generatedLocation, { sourceUrl });
-  });
-
-  return function _getGeneratedLocation(_x, _x2, _x3, _x4) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
 var _breakpoint = __webpack_require__(1057);
 
 var _selectors = __webpack_require__(242);
 
+var _sourceMaps = __webpack_require__(797);
+
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 exports.default = (() => {
-  var _ref2 = _asyncToGenerator(function* (getState, client, sourceMaps, _ref3) {
-    var breakpoint = _ref3.breakpoint;
+  var _ref = _asyncToGenerator(function* (getState, client, sourceMaps, _ref2) {
+    var breakpoint = _ref2.breakpoint;
 
     var state = getState();
 
     var source = (0, _selectors.getSource)(state, breakpoint.location.sourceId);
     var location = _extends({}, breakpoint.location, { sourceUrl: source.get("url") });
-    var generatedLocation = yield _getGeneratedLocation(state, source, sourceMaps, location);
+    var generatedLocation = yield (0, _sourceMaps.getGeneratedLocation)(state, source.toJS(), location, sourceMaps);
 
     (0, _breakpoint.assertLocation)(location);
     (0, _breakpoint.assertLocation)(generatedLocation);
 
     if ((0, _breakpoint.breakpointExists)(state, location)) {
       var _newBreakpoint = _extends({}, breakpoint, { location, generatedLocation });
       (0, _breakpoint.assertBreakpoint)(_newBreakpoint);
       return { breakpoint: _newBreakpoint };
     }
 
-    var _ref4 = yield client.setBreakpoint(generatedLocation, breakpoint.condition, sourceMaps.isOriginalId(location.sourceId)),
-        id = _ref4.id,
-        hitCount = _ref4.hitCount,
-        actualLocation = _ref4.actualLocation;
+    var _ref3 = yield client.setBreakpoint(generatedLocation, breakpoint.condition, sourceMaps.isOriginalId(location.sourceId)),
+        id = _ref3.id,
+        hitCount = _ref3.hitCount,
+        actualLocation = _ref3.actualLocation;
 
     var newGeneratedLocation = actualLocation || generatedLocation;
     var newLocation = yield sourceMaps.getOriginalLocation(newGeneratedLocation);
 
     var newBreakpoint = {
       id,
       disabled: false,
+      hidden: breakpoint.hidden,
       loading: false,
       condition: breakpoint.condition,
       location: newLocation,
       hitCount,
       generatedLocation: newGeneratedLocation
     };
 
     (0, _breakpoint.assertBreakpoint)(newBreakpoint);
@@ -42143,72 +43318,52 @@ exports.default = (() => {
     var previousLocation = (0, _breakpoint.locationMoved)(location, newLocation) ? location : null;
 
     return {
       breakpoint: newBreakpoint,
       previousLocation
     };
   });
 
-  function addBreakpoint(_x5, _x6, _x7, _x8) {
-    return _ref2.apply(this, arguments);
+  function addBreakpoint(_x, _x2, _x3, _x4) {
+    return _ref.apply(this, arguments);
   }
 
   return addBreakpoint;
 })();
 
 /***/ }),
 /* 1137 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.syncClientBreakpoint = undefined;
-var _selectors = __webpack_require__(242);
 
 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; };
 
-async function getGeneratedLocation(
-  state,
-  source,
-  location,
-  sourceMaps
-) {
-  if (!sourceMaps.isOriginalId(location.sourceId)) {
-    return location;
-  }
-
-  const generatedLocation = await sourceMaps.getGeneratedLocation(
-    location,
-    source
-  );
-  const generatedSource = _selectors.getSource(state, generatedLocation.sourceId);
-  const sourceUrl = generatedSource.get("url");
-  return { ...generatedLocation, sourceUrl };
-}
-
 // we have three forms of syncing: disabled syncing, existing server syncing
 // and adding a new breakpoint
 var syncClientBreakpoint = exports.syncClientBreakpoint = (() => {
   var _ref = _asyncToGenerator(function* (getState, client, sourceMaps, source, pendingBreakpoint) {
-		var sourceId = source.id;
-		var generatedSourceId = sourceMaps.isOriginalId(sourceId) ? (0, _devtoolsSourceMap.originalToGeneratedId)(sourceId) : sourceId;
+    var sourceId = source.id;
+    var generatedSourceId = sourceMaps.isOriginalId(sourceId) ? (0, _devtoolsSourceMap.originalToGeneratedId)(sourceId) : sourceId;
 
     // this is the generatedLocation of the pending breakpoint, with
     // the source id updated to reflect the new connection
     var generatedLocation = _extends({}, pendingBreakpoint.generatedLocation, {
       sourceId: generatedSourceId
     });
 
     var location = _extends({}, pendingBreakpoint.location, {
-      sourceId: sourceId
+      sourceId
     });
 
     (0, _breakpoint3.assertPendingBreakpoint)(pendingBreakpoint);
 
     /** ******* CASE 1: Disabled ***********/
     // early return if breakpoint is disabled, send overrides to update
     // the id as expected
     if (pendingBreakpoint.disabled) {
@@ -42227,42 +43382,31 @@ var syncClientBreakpoint = exports.syncC
     }
 
     /** ******* CASE 2: Merge Server Breakpoint ***********/
     // early return if breakpoint exists on the server, send overrides
     // to update the id as expected
     var existingClient = client.getBreakpointByLocation(generatedLocation);
 
     if (existingClient) {
-			const newGeneratedLocation = yield getGeneratedLocation(
-	      getState(),
-	      source,
-	      location,
-	      sourceMaps
-	    );
-
-	    if ((0, _breakpoint3.locationMoved)(generatedLocation, newGeneratedLocation)) {
-	      yield client.removeBreakpoint(generatedLocation);
-	      yield client.setBreakpoint(
-	        newGeneratedLocation,
-	        pendingBreakpoint.condition,
-	        sourceMaps.isOriginalId(sourceId)
-	      );
-	    }
-
-	    const breakpoint = {
-	      ...pendingBreakpoint,
-	      id: (0, _breakpoint3.makeLocationId)(location),
-	      generatedLocation: newGeneratedLocation,
-	      location: location
-	    };
-
-	    (0, _breakpoint3.assertPendingBreakpoint)(breakpoint);
-	    return { breakpoint, previousLocation: location };
-
+      var _newGeneratedLocation = yield (0, _sourceMaps.getGeneratedLocation)(getState(), source, location, sourceMaps);
+
+      if ((0, _breakpoint3.locationMoved)(generatedLocation, _newGeneratedLocation)) {
+        yield client.removeBreakpoint(generatedLocation);
+        yield client.setBreakpoint(_newGeneratedLocation, pendingBreakpoint.condition, sourceMaps.isOriginalId(sourceId));
+      }
+
+      var _breakpoint2 = _extends({}, pendingBreakpoint, {
+        id: (0, _breakpoint3.makeLocationId)(location),
+        generatedLocation: _newGeneratedLocation,
+        location: location
+      });
+
+      (0, _breakpoint3.assertBreakpoint)(_breakpoint2);
+      return { breakpoint: _breakpoint2, previousLocation: location };
     }
 
     /** ******* CASE 3: Add New Breakpoint ***********/
     // If we are not disabled, set the breakpoint on the server and get
     // that info so we can set it on our breakpoints.
     var clientBreakpoint = yield client.setBreakpoint(generatedLocation, pendingBreakpoint.condition, sourceMaps.isOriginalId(sourceId));
 
     var newGeneratedLocation = clientBreakpoint.actualLocation;
@@ -42273,23 +43417,25 @@ var syncClientBreakpoint = exports.syncC
       generatedLocation: newGeneratedLocation,
       location: newLocation
     });
 
     (0, _breakpoint3.assertBreakpoint)(breakpoint);
     return { breakpoint, previousLocation: location };
   });
 
-  return function syncClientBreakpoint(_x, _x2, _x3, _x4) {
+  return function syncClientBreakpoint(_x, _x2, _x3, _x4, _x5) {
     return _ref.apply(this, arguments);
   };
 })();
 
 var _breakpoint3 = __webpack_require__(1057);
 
+var _sourceMaps = __webpack_require__(797);
+
 var _devtoolsSourceMap = __webpack_require__(898);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /***/ }),
 /* 1138 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -42410,17 +43556,17 @@ var _SourceSearch2 = _interopRequireDefa
 var _ToggleSearch = __webpack_require__(284);
 
 var _ToggleSearch2 = _interopRequireDefault(_ToggleSearch);
 
 var _prefs = __webpack_require__(226);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(697);
+__webpack_require__(869);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ProjectSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
@@ -42487,43 +43633,49 @@ class ProjectSearch extends _react.Compo
   isSourceSearchEnabled() {
     return this.props.activeSearch === "source";
   }
 
   renderSourceSearch() {
     var _props3 = this.props,
         sources = _props3.sources,
         selectSource = _props3.selectSource,
-        closeActiveSearch = _props3.closeActiveSearch;
+        closeActiveSearch = _props3.closeActiveSearch,
+        sourceSearchQuery = _props3.sourceSearchQuery,
+        setSourceSearchQuery = _props3.setSourceSearchQuery,
+        clearSourceSearchQuery = _props3.clearSourceSearchQuery;
 
     return _react2.default.createElement(_SourceSearch2.default, {
       sources: sources,
       selectSource: selectSource,
       closeActiveSearch: closeActiveSearch,
-      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "sources", toggle: this.toggleProjectTextSearch })
+      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "sources", toggle: this.toggleProjectTextSearch }),
+      query: sourceSearchQuery,
+      setQuery: setSourceSearchQuery,
+      clearQuery: clearSourceSearchQuery
     });
   }
 
   renderTextSearch() {
     var _props4 = this.props,
         sources = _props4.sources,
         results = _props4.results,
         searchSources = _props4.searchSources,
         closeActiveSearch = _props4.closeActiveSearch,
         selectSource = _props4.selectSource,
-        query = _props4.query;
+        textSearchQuery = _props4.textSearchQuery;
 
 
     return _react2.default.createElement(_TextSearch2.default, {
       sources: sources,
       results: results.valueSeq().toJS(),
       searchSources: searchSources,
       closeActiveSearch: closeActiveSearch,
       selectSource: selectSource,
-      query: query,
+      query: textSearchQuery,
       searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "project", toggle: this.toggleSourceSearch })
     });
   }
 
   render() {
     if (!(this.isProjectSearchEnabled() || this.isSourceSearchEnabled())) {
       return null;
     }
@@ -42534,35 +43686,39 @@ class ProjectSearch extends _react.Compo
       this.isProjectSearchEnabled() ? this.renderTextSearch() : this.renderSourceSearch()
     );
   }
 }
 
 ProjectSearch.propTypes = {
   sources: _react.PropTypes.object.isRequired,
   results: _react.PropTypes.object,
-  query: _react.PropTypes.string,
+  textSearchQuery: _react.PropTypes.string,
   setActiveSearch: _react.PropTypes.func.isRequired,
   closeActiveSearch: _react.PropTypes.func.isRequired,
   searchSources: _react.PropTypes.func,
   activeSearch: _react.PropTypes.string,
-  selectSource: _react.PropTypes.func.isRequired
+  selectSource: _react.PropTypes.func.isRequired,
+  sourceSearchQuery: _react.PropTypes.string,
+  setSourceSearchQuery: _react.PropTypes.func,
+  clearSourceSearchQuery: _react.PropTypes.func
 };
 
 ProjectSearch.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 ProjectSearch.displayName = "ProjectSearch";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearchState)(state),
   results: (0, _selectors.getTextSearchResults)(state),
-  query: (0, _selectors.getTextSearchQuery)(state)
+  textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
+  sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ProjectSearch);
 
 /***/ }),
 /* 1140 */,
 /* 1141 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -42587,20 +43743,16 @@ var _Autocomplete2 = _interopRequireDefa
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
     this.close = this.close.bind(this);
-
-    this.state = {
-      inputValue: ""
-    };
   }
 
   componentWillUnmount() {
     var shortcuts = this.context.shortcuts;
     shortcuts.off("Escape", this.onEscape);
   }
 
   componentDidMount() {
@@ -42620,37 +43772,40 @@ class SourceSearch extends _react.Compon
       value: (0, _source.getSourcePath)(source),
       title: (0, _source.getSourcePath)(source).split("/").pop(),
       subtitle: (0, _utils.endTruncateStr)((0, _source.getSourcePath)(source), 100),
       id: source.id
     }));
   }
 
   close() {
-    this.setState({ inputValue: "" });
+    this.props.clearQuery();
     this.props.closeActiveSearch();
   }
 
   render() {
     var _props = this.props,
         sources = _props.sources,
         searchBottomBar = _props.searchBottomBar,
-        selectSource = _props.selectSource;
+        selectSource = _props.selectSource,
+        query = _props.query,
+        setQuery = _props.setQuery;
 
     return _react2.default.createElement(
       _Autocomplete2.default,
       {
         selectItem: (e, result) => {
           selectSource(result.id);
           this.close();
         },
         close: this.close,
         items: this.searchResults(sources),
-        inputValue: this.state.inputValue,
+        inputValue: query,
         placeholder: L10N.getStr("sourceSearch.search"),
+        onChangeHandler: setQuery,
         size: "big"
       },
       searchBottomBar
     );
   }
 }
 
 exports.default = SourceSearch;
@@ -42668,49 +43823,47 @@ SourceSearch.displayName = "SourceSearch
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 var _text = __webpack_require__(389);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-__webpack_require__(699);
+__webpack_require__(870);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-var _Outline2 = __webpack_require__(1145);
-
-var _Outline3 = _interopRequireDefault(_Outline2);
-
-var _SourcesTree2 = __webpack_require__(1148);
-
-var _SourcesTree3 = _interopRequireDefault(_SourcesTree2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var Outline = (0, _react.createFactory)(_Outline3.default);
-
-var SourcesTree = (0, _react.createFactory)(_SourcesTree3.default);
+var _Outline = __webpack_require__(1145);
+
+var _Outline2 = _interopRequireDefault(_Outline);
+
+var _SourcesTree = __webpack_require__(1148);
+
+var _SourcesTree2 = _interopRequireDefault(_SourcesTree);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PrimaryPanes extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = { selectedPane: "sources" };
 
     this.renderShortcut = this.renderShortcut.bind(this);
@@ -42722,90 +43875,229 @@ class PrimaryPanes extends _react.Compon
     this.setState({ selectedPane });
   }
 
   renderOutlineTabs() {
     if (!(0, _devtoolsConfig.isEnabled)("outline")) {
       return;
     }
 
-    return [_react.DOM.div({
-      className: (0, _classnames2.default)("tab", {
-        active: this.state.selectedPane === "sources"
-      }),
-      onClick: () => this.showPane("sources"),
-      key: "sources-tab"
-    }, "Sources View"), _react.DOM.div({
-      className: (0, _classnames2.default)("tab", {
-        active: this.state.selectedPane === "outline"
-      }),
-      onClick: () => this.showPane("outline"),
-      key: "outline-tab"
-    }, "Outline View")];
+    return [_react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("tab", {
+          active: this.state.selectedPane === "sources"
+        }),
+        onClick: () => this.showPane("sources"),
+        key: "sources-tab"
+      },
+      "Sources View"
+    ), _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("tab", {
+          active: this.state.selectedPane === "outline"
+        }),
+        onClick: () => this.showPane("outline"),
+        key: "outline-tab"
+      },
+      "Outline View"
+    )];
   }
 
   renderFooter() {
-    return _react.DOM.div({
-      className: "source-footer"
-    }, this.renderOutlineTabs());
+    return _react2.default.createElement(
+      "div",
+      { className: "source-footer" },
+      this.renderOutlineTabs()
+    );
   }
 
   renderShortcut() {
     if (this.props.horizontal) {
-      return _react.DOM.span({
-        className: "sources-header-info",
-        dir: "ltr",
-        onClick: () => {
-          if (this.props.sourceSearchOn) {
-            return this.props.closeActiveSearch();
-          }
-          this.props.setActiveSearch("source");
-        }
-      }, L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"))));
+      var onClick = () => {
+        if (this.props.sourceSearchOn) {
+          return this.props.closeActiveSearch();
+        }
+        this.props.setActiveSearch("source");
+      };
+      return _react2.default.createElement(
+        "span",
+        { className: "sources-header-info", dir: "ltr", onClick: onClick },
+        L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2")))
+      );
     }
   }
 
   renderHeader() {
-    return _react.DOM.div({ className: "sources-header" }, this.renderShortcut());
+    return _react2.default.createElement(
+      "div",
+      { className: "sources-header" },
+      this.renderShortcut()
+    );
   }
 
   render() {
     var selectedPane = this.state.selectedPane;
     var _props = this.props,
         sources = _props.sources,
         selectSource = _props.selectSource;
 
 
-    return _react.DOM.div({ className: "sources-panel" }, this.renderHeader(), SourcesTree({
-      sources,
-      selectSource,
-      isHidden: selectedPane === "outline"
-    }), Outline({ selectSource, isHidden: selectedPane === "sources" }), this.renderFooter());
+    return _react2.default.createElement(
+      "div",
+      { className: "sources-panel" },
+      this.renderHeader(),
+      _react2.default.createElement(_SourcesTree2.default, {
+        sources: sources,
+        selectSource: selectSource,
+        isHidden: selectedPane === "outline"
+      }),
+      _react2.default.createElement(_Outline2.default, {
+        selectSource: selectSource,
+        isHidden: selectedPane === "sources"
+      }),
+      this.renderFooter()
+    );
   }
 }
 
 PrimaryPanes.displayName = "PrimaryPanes";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   sourceSearchOn: (0, _selectors.getActiveSearchState)(state) === "source"
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(PrimaryPanes);
 
 /***/ }),
-/* 1143 */,
-/* 1144 */,
+/* 1143 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.setSourceSearchQuery = setSourceSearchQuery;
+exports.clearSourceSearchQuery = clearSourceSearchQuery;
+function setSourceSearchQuery(queryString) {
+  return (_ref) => {
+    var dispatch = _ref.dispatch,
+        getState = _ref.getState;
+
+    dispatch({
+      type: "SET_QUERY_STRING",
+      queryString
+    });
+  };
+}
+
+function clearSourceSearchQuery() {
+  return (_ref2) => {
+    var dispatch = _ref2.dispatch,
+        getState = _ref2.getState;
+
+    dispatch({
+      type: "CLEAR_QUERY_STRING"
+    });
+  };
+}
+
+/***/ }),
+/* 1144 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _reactRedux = __webpack_require__(151);
+
+var _redux = __webpack_require__(3);
+
+var _react = __webpack_require__(0);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _selectors = __webpack_require__(242);
+
+__webpack_require__(1146);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class EmptyLines extends _react.Component {
+
+  componentDidMount() {
+    this.disableEmptyLines();
+  }
+
+  componentDidUpdate() {
+    this.disableEmptyLines();
+  }
+
+  componentWillUnmount() {
+    var _props = this.props,
+        emptyLines = _props.emptyLines,
+        editor = _props.editor;
+
+
+    if (!emptyLines) {
+      return;
+    }
+    editor.codeMirror.operation(() => {
+      emptyLines.forEach(line => editor.codeMirror.removeLineClass(line, "line", "empty-line"));
+    });
+  }
+
+  disableEmptyLines() {
+    var _props2 = this.props,
+        emptyLines = _props2.emptyLines,
+        editor = _props2.editor;
+
+
+    if (!emptyLines) {
+      return;
+    }
+    editor.codeMirror.operation(() => {
+      emptyLines.forEach(line => editor.codeMirror.addLineClass(line, "line", "empty-line"));
+    });
+  }
+
+  render() {
+    return null;
+  }
+}
+
+EmptyLines.displayName = "EmptyLines";
+
+exports.default = (0, _reactRedux.connect)(state => {
+  var selectedSource = (0, _selectors.getSelectedSource)(state);
+  return {
+    selectedSource,
+    emptyLines: selectedSource ? (0, _selectors.getEmptyLines)(state, selectedSource.toJS()) : []
+  };
+}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EmptyLines);
+
+/***/ }),
 /* 1145 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.Outline = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
@@ -42817,31 +44109,26 @@ var _classnames2 = _interopRequireDefaul
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-__webpack_require__(700);
-
-var _previewFunction = __webpack_require__(701);
-
-var _previewFunction2 = _interopRequireDefault(_previewFunction);
+__webpack_require__(871);
+
+var _PreviewFunction = __webpack_require__(798);
+
+var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
 
-  constructor(props) {
-    super(props);
-    this.state = {};
-  }
-
   selectItem(location) {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         selectSource = _props.selectSource;
 
     if (!selectedSource) {
       return;
     }
@@ -42857,17 +44144,17 @@ class Outline extends _react.Component {
 
     return _react2.default.createElement(
       "li",
       {
         key: `${name}:${location.start.line}:${location.start.column}`,
         className: "outline-list__element",
         onClick: () => this.selectItem(location)
       },
-      (0, _previewFunction2.default)({ name })
+      _react2.default.createElement(_PreviewFunction2.default, { func: { name } })
     );
   }
 
   renderFunctions() {
     var symbols = this.props.symbols;
 
 
     return symbols.functions.filter(func => func.name != "anonymous").map(func => this.renderFunction(func));
@@ -42887,62 +44174,130 @@ class Outline extends _react.Component {
         "ul",
         { className: "outline-list" },
         this.renderFunctions()
       )
     );
   }
 }
 
+exports.Outline = Outline;
 Outline.displayName = "Outline";
 
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
     symbols: (0, _selectors.getSymbols)(state, selectedSource && selectedSource.toJS()),
     selectedSource
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Outline);
 
 /***/ }),
-/* 1146 */,
-/* 1147 */,
+/* 1146 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1147 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Workers = undefined;
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+__webpack_require__(1149);
+
+var _reactRedux = __webpack_require__(151);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class Workers extends _react.PureComponent {
+  renderWorkers(workers) {
+    return workers.map(w => _react2.default.createElement(
+      "div",
+      null,
+      w
+    ));
+  }
+
+  renderNoWorkersPlaceholder() {
+    return L10N.getStr("noWorkersText");
+  }
+
+  render() {
+    var workers = this.props.workers;
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane" },
+      _react2.default.createElement(
+        "div",
+        { className: "pane-info" },
+        workers && workers.length > 0 ? this.renderWorkers(workers) : this.renderNoWorkersPlaceholder()
+      )
+    );
+  }
+}
+
+exports.Workers = Workers;
+Workers.displayName = "Workers";
+Workers.propTypes = {
+  workers: _react.PropTypes.array.isRequired
+};
+
+function mapStateToProps(state) {
+  return { workers: [] };
+}
+exports.default = (0, _reactRedux.connect)(mapStateToProps)(Workers);
+
+/***/ }),
 /* 1148 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _reactImmutableProptypes = __webpack_require__(150);
 
 var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
 
 var _immutable = __webpack_require__(146);
 
 var _selectors = __webpack_require__(242);
 
 var _sourcesTree = __webpack_require__(39);
 
-var _ManagedTree2 = __webpack_require__(419);
-
-var _ManagedTree3 = _interopRequireDefault(_ManagedTree2);
+var _ManagedTree = __webpack_require__(419);
+
+var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
@@ -42950,18 +44305,16 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _clipboard = __webpack_require__(423);
 
 var _utils = __webpack_require__(234);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-var ManagedTree = (0, _react.createFactory)(_ManagedTree3.default);
-
 class SourcesTree extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = (0, _sourcesTree.createTree)(this.props.sources, this.props.debuggeeUrl);
 
     this.focusItem = this.focusItem.bind(this);
     this.selectItem = this.selectItem.bind(this);
@@ -43060,24 +44413,24 @@ class SourcesTree extends _react.Compone
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
   getIcon(item, depth) {
     if (depth === 0) {
-      return (0, _Svg2.default)("domain");
+      return _react2.default.createElement(_Svg2.default, { name: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
-      return (0, _Svg2.default)("file");
-    }
-
-    return (0, _Svg2.default)("folder");
+      return _react2.default.createElement(_Svg2.default, { name: "file" });
+    }
+
+    return _react2.default.createElement(_Svg2.default, { name: "folder" });
   }
 
   onContextMenu(event, item) {
     var copySourceUrlLabel = L10N.getStr("copySourceUrl");
     var copySourceUrlKey = L10N.getStr("copySourceUrl.accesskey");
 
     event.stopPropagation();
     event.preventDefault();
@@ -43098,94 +44451,107 @@ class SourcesTree extends _react.Compone
     }
 
     (0, _devtoolsLaunchpad.showMenu)(event, menuOptions);
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
-    var arrow = (0, _Svg2.default)("arrow", {
+    var arrow = _react2.default.createElement(_Svg2.default, {
+      name: "arrow",
       className: (0, _classnames2.default)({
         expanded: expanded,
         hidden: !(0, _sourcesTree.nodeHasChildren)(item)
       }),
       onClick: e => {
         e.stopPropagation();
         setExpanded(item, !expanded);
       }
     });
 
     var icon = this.getIcon(item, depth);
     var paddingDir = "paddingRight";
     if (document.body && document.body.parentElement) {
       paddingDir = document.body.parentElement.dir == "ltr" ? "paddingLeft" : "paddingRight";
     }
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("node", { focused }),
-      style: { [paddingDir]: `${depth * 15}px` },
-      key: item.path,
-      onClick: () => {
-        this.selectItem(item);
-        setExpanded(item, !expanded);
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("node", { focused }),
+        style: { [paddingDir]: `${depth * 15}px` },
+        key: item.path,
+        onClick: () => {
+          this.selectItem(item);
+          setExpanded(item, !expanded);
+        },
+        onContextMenu: e => this.onContextMenu(e, item)
       },
-      onContextMenu: e => this.onContextMenu(e, item)
-    }, _react.DOM.div(null, arrow, icon, item.name));
+      _react2.default.createElement(
+        "div",
+        null,
+        arrow,
+        icon,
+        item.name
+      )
+    );
   }
 
   render() {
     var isHidden = this.props.isHidden;
     var _state = this.state,
         focusedItem = _state.focusedItem,
         sourceTree = _state.sourceTree,
         parentMap = _state.parentMap,
         listItems = _state.listItems,
         highlightItems = _state.highlightItems;
 
 
     var isEmpty = sourceTree.contents.length === 0;
 
-    var tree = ManagedTree({
+    var treeProps = {
       key: isEmpty ? "empty" : "full",
-      getParent: item => {
-        return parentMap.get(item);
-      },
-      getChildren: item => {
-        if ((0, _sourcesTree.nodeHasChildren)(item)) {
-          return item.contents;
-        }
-        return [];
-      },
+      getParent: item => parentMap.get(item),
+      getChildren: item => (0, _sourcesTree.nodeHasChildren)(item) ? item.contents : [],
       getRoots: () => sourceTree.contents,
       getPath: item => `${item.path}/${item.name}`,
       itemHeight: 21,
       autoExpandDepth: 1,
       autoExpandAll: false,
       onFocus: this.focusItem,
       listItems,
       highlightItems,
       renderItem: this.renderItem
-    });
-
-    var noSourcesMessage = _react.DOM.div({
-      className: "no-sources-message"
-    }, L10N.getStr("sources.noSourcesAvailable"));
+    };
+
+    var tree = _react2.default.createElement(_ManagedTree2.default, treeProps);
 
     if (isEmpty) {
-      return noSourcesMessage;
-    }
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("sources-list", { hidden: isHidden }),
-      onKeyDown: e => {
-        if (e.keyCode === 13 && focusedItem) {
-          this.selectItem(focusedItem);
-        }
-      }
-    }, tree);
+      return _react2.default.createElement(
+        "div",
+        { className: "no-sources-message" },
+        L10N.getStr("sources.noSourcesAvailable")
+      );
+    }
+
+    var onKeyDown = e => {
+      if (e.keyCode === 13 && focusedItem) {
+        this.selectItem(focusedItem);
+      }
+    };
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("sources-list", { hidden: isHidden }),
+        onKeyDown: onKeyDown
+      },
+      tree
+    );
   }
 }
 
 SourcesTree.propTypes = {
   isHidden: _react.PropTypes.bool,
   sources: _reactImmutableProptypes2.default.map.isRequired,
   selectSource: _react.PropTypes.func.isRequired,
   shownSource: _react.PropTypes.string,
@@ -43199,17 +44565,22 @@ exports.default = (0, _reactRedux.connec
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
     debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
 
 /***/ }),
-/* 1149 */,
+/* 1149 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1150 */,
 /* 1151 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -43270,17 +44641,17 @@ module.exports = "<!-- This Source Code 
 
 var _require = __webpack_require__(0),
     Component = _require.Component,
     createFactory = _require.createFactory,
     dom = _require.DOM,
     PropTypes = _require.PropTypes;
 
 var Tree = createFactory(__webpack_require__(1007).Tree);
-__webpack_require__(708);
+__webpack_require__(878);
 
 var classnames = __webpack_require__(175);
 var Svg = __webpack_require__(1151);
 
 var _require2 = __webpack_require__(926),
     _require2$REPS = _require2.REPS,
     Rep = _require2$REPS.Rep,
     Grip = _require2$REPS.Grip;
@@ -44164,22 +45535,24 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _visibleBreakpoints = __webpack_require__(1135);
 
 var _visibleBreakpoints2 = _interopRequireDefault(_visibleBreakpoints);
 
 var _breakpoint = __webpack_require__(1057);
 
+var _source = __webpack_require__(233);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Breakpoints extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
-    if (nextProps.selectedSource && nextProps.selectedSource.get("loading")) {
+    if (nextProps.selectedSource && !(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
       return false;
     }
 
     return true;
   }
 
   render() {
     var _props = this.props,
@@ -44224,40 +45597,40 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: 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; };
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
 var _devtoolsConfig = __webpack_require__(828);
 
 var _lodash = __webpack_require__(2);
 
-var _CallSite2 = __webpack_require__(1167);
-
-var _CallSite3 = _interopRequireDefault(_CallSite2);
+var _CallSite = __webpack_require__(1167);
+
+var _CallSite2 = _interopRequireDefault(_CallSite);
 
 var _selectors = __webpack_require__(242);
 
 var _editor = __webpack_require__(257);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-var CallSite = (0, _react.createFactory)(_CallSite3.default);
-
 function getCallSiteAtLocation(callSites, location) {
   return (0, _lodash.find)(callSites, callSite => (0, _lodash.isEqualWith)(callSite.location, location, (cloc, loc) => {
     return loc.line === cloc.start.line && loc.column >= cloc.start.column && loc.column <= cloc.end.column;
   }));
 }
 
 class CallSites extends _react.Component {
 
@@ -44307,27 +45680,27 @@ class CallSites extends _react.Component
 
   onTokenClick(e) {
     var target = e.target;
     var _props = this.props,
         editor = _props.editor,
         selectedLocation = _props.selectedLocation;
 
 
-    if (!(0, _devtoolsConfig.isEnabled)("columnBreakpoints") || !e.altKey || !target.classList.contains("call-site") && !target.classList.contains("call-site-bp")) {
+    if (!(0, _devtoolsConfig.isEnabled)("columnBreakpoints") || !e.altKey && !target.classList.contains("call-site-bp") || !target.classList.contains("call-site") && !target.classList.contains("call-site-bp")) {
       return;
     }
 
     var sourceId = selectedLocation.sourceId;
 
     var _getTokenLocation = (0, _editor.getTokenLocation)(editor.codeMirror, target),
         line = _getTokenLocation.line,
         column = _getTokenLocation.column;
 
-    this.toggleBreakpoint((0, _editor.toSourceLine)(sourceId, line), (0, _editor.isWasm)(sourceId) ? undefined : column - 2);
+    this.toggleBreakpoint(line, (0, _editor.isWasm)(sourceId) ? undefined : column);
   }
 
   toggleBreakpoint(line) {
     var column = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         selectedLocation = _props2.selectedLocation,
         addBreakpoint = _props2.addBreakpoint,
@@ -44376,26 +45749,32 @@ class CallSites extends _react.Component
     var showCallSites = this.state.showCallSites;
 
     var sites = void 0;
     if (!callSites) {
       return null;
     }
 
     editor.codeMirror.operation(() => {
-      sites = _react.DOM.div({}, callSites.map((callSite, index) => {
-        return CallSite({
+      var childCallSites = callSites.map((callSite, index) => {
+        var props = {
           key: index,
           callSite,
           editor,
           source: selectedSource,
           breakpoint: callSite.breakpoint,
           showCallSite: showCallSites
-        });
-      }));
+        };
+        return _react2.default.createElement(_CallSite2.default, props);
+      });
+      sites = _react2.default.createElement(
+        "div",
+        null,
+        childCallSites
+      );
     });
     return sites;
   }
 }
 
 CallSites.displayName = "CallSites";
 function getCallSites(symbols, breakpoints) {
   if (!symbols || !symbols.callExpressions) {
@@ -44473,17 +45852,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(713);
+__webpack_require__(882);
 
 class CallSite extends _react.Component {
 
   constructor() {
     super();
 
     this.marker = undefined;
     var self = this;
@@ -44531,19 +45910,21 @@ class CallSite extends _react.Component 
   componentWillReceiveProps(nextProps) {
     var _props2 = this.props,
         breakpoint = _props2.breakpoint,
         showCallSite = _props2.showCallSite;
 
 
     if (nextProps.breakpoint !== breakpoint) {
       if (this.marker) {
-        this.marker.clear();
-      }
-      this.addCallSite(nextProps);
+        this.clearCallSite();
+      }
+      if (nextProps.showCallSite) {
+        this.addCallSite(nextProps);
+      }
     }
 
     if (nextProps.showCallSite !== showCallSite) {
       if (nextProps.showCallSite) {
         if (!this.marker) {
           this.addCallSite();
         }
       } else if (!nextProps.breakpoint) {
@@ -44605,17 +45986,17 @@ var _Modal2 = _interopRequireDefault(_Mo
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
 
-__webpack_require__(738);
+__webpack_require__(962);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function formatSymbol(symbol) {
   return {
     id: `${symbol.name}:${symbol.location.start.line}`,
     title: symbol.name,
     subtitle: `:${symbol.location.start.line}`,
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -2285,52 +2285,17 @@ module.exports = invariant;
 /* 188 */,
 /* 189 */,
 /* 190 */,
 /* 191 */,
 /* 192 */,
 /* 193 */,
 /* 194 */,
 /* 195 */,
-/* 196 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseToPairs = __webpack_require__(796),
-    getTag = __webpack_require__(198),
-    mapToArray = __webpack_require__(203),
-    setToPairs = __webpack_require__(204);
-
-/** `Object#toString` result references. */
-var mapTag = '[object Map]',
-    setTag = '[object Set]';
-
-/**
- * Creates a `_.toPairs` or `_.toPairsIn` function.
- *
- * @private
- * @param {Function} keysFunc The function to get the keys of a given object.
- * @returns {Function} Returns the new pairs function.
- */
-function createToPairs(keysFunc) {
-  return function(object) {
-    var tag = getTag(object);
-    if (tag == mapTag) {
-      return mapToArray(object);
-    }
-    if (tag == setTag) {
-      return setToPairs(object);
-    }
-    return baseToPairs(object, keysFunc(object));
-  };
-}
-
-module.exports = createToPairs;
-
-
-/***/ }),
+/* 196 */,
 /* 197 */,
 /* 198 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var DataView = __webpack_require__(199),
     Map = __webpack_require__(101),
     Promise = __webpack_require__(200),
     Set = __webpack_require__(201),
@@ -2462,40 +2427,17 @@ function mapToArray(map) {
   });
   return result;
 }
 
 module.exports = mapToArray;
 
 
 /***/ }),
-/* 204 */
-/***/ (function(module, exports) {
-
-/**
- * Converts `set` to its value-value pairs.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the value-value pairs.
- */
-function setToPairs(set) {
-  var index = -1,
-      result = Array(set.size);
-
-  set.forEach(function(value) {
-    result[++index] = [value, value];
-  });
-  return result;
-}
-
-module.exports = setToPairs;
-
-
-/***/ }),
+/* 204 */,
 /* 205 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var arrayLikeKeys = __webpack_require__(206),
     baseKeys = __webpack_require__(217),
     isArrayLike = __webpack_require__(220);
 
 /**
@@ -3590,20 +3532,102 @@ function stubArray() {
 
 module.exports = stubArray;
 
 
 /***/ }),
 /* 291 */,
 /* 292 */,
 /* 293 */,
-/* 294 */,
+/* 294 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsEqual = __webpack_require__(799),
+    get = __webpack_require__(67),
+    hasIn = __webpack_require__(837),
+    isKey = __webpack_require__(71),
+    isStrictComparable = __webpack_require__(801),
+    matchesStrictComparable = __webpack_require__(803),
+    toKey = __webpack_require__(111);
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/**
+ * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
+function baseMatchesProperty(path, srcValue) {
+  if (isKey(path) && isStrictComparable(srcValue)) {
+    return matchesStrictComparable(toKey(path), srcValue);
+  }
+  return function(object) {
+    var objValue = get(object, path);
+    return (objValue === undefined && objValue === srcValue)
+      ? hasIn(object, path)
+      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+  };
+}
+
+module.exports = baseMatchesProperty;
+
+
+/***/ }),
 /* 295 */,
 /* 296 */,
-/* 297 */,
+/* 297 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var castPath = __webpack_require__(69),
+    isArguments = __webpack_require__(208),
+    isArray = __webpack_require__(70),
+    isIndex = __webpack_require__(117),
+    isLength = __webpack_require__(214),
+    toKey = __webpack_require__(111);
+
+/**
+ * Checks if `path` exists on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @param {Function} hasFunc The function to check properties.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ */
+function hasPath(object, path, hasFunc) {
+  path = castPath(path, object);
+
+  var index = -1,
+      length = path.length,
+      result = false;
+
+  while (++index < length) {
+    var key = toKey(path[index]);
+    if (!(result = object != null && hasFunc(object, key))) {
+      break;
+    }
+    object = object[key];
+  }
+  if (result || ++index != length) {
+    return result;
+  }
+  length = object == null ? 0 : object.length;
+  return !!length && isLength(length) && isIndex(key, length) &&
+    (isArray(object) || isArguments(object));
+}
+
+module.exports = hasPath;
+
+
+/***/ }),
 /* 298 */
 /***/ (function(module, exports) {
 
 /**
  * This method returns the first argument it receives.
  *
  * @static
  * @since 0.1.0
@@ -4097,17 +4121,55 @@ var baseCreate = (function() {
     return result;
   };
 }());
 
 module.exports = baseCreate;
 
 
 /***/ }),
-/* 404 */,
+/* 404 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArrayLike = __webpack_require__(220),
+    isObjectLike = __webpack_require__(14);
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+  return isObjectLike(value) && isArrayLike(value);
+}
+
+module.exports = isArrayLikeObject;
+
+
+/***/ }),
 /* 405 */,
 /* 406 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var assignValue = __webpack_require__(114),
     baseAssignValue = __webpack_require__(115);
 
 /**
@@ -12370,17 +12432,17 @@ var global = module.exports = typeof win
   : Function('return this')();
 if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
 
 
 /***/ }),
 /* 452 */
 /***/ (function(module, exports) {
 
-var core = module.exports = { version: '2.5.0' };
+var core = module.exports = { version: '2.5.1' };
 if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
 
 
 /***/ }),
 /* 453 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // optional / simple context binding
@@ -14236,17 +14298,16 @@ var redefine = __webpack_require__(465);
 var META = __webpack_require__(497).KEY;
 var $fails = __webpack_require__(461);
 var shared = __webpack_require__(477);
 var setToStringTag = __webpack_require__(481);
 var uid = __webpack_require__(478);
 var wks = __webpack_require__(482);
 var wksExt = __webpack_require__(498);
 var wksDefine = __webpack_require__(499);
-var keyOf = __webpack_require__(500);