Run js-beautify and fixjsstyle on code

Found this pointer on stackoverflow:
https://stackoverflow.com/a/31660434/5508494

End goal is to get the code formatted well enough that
clang format will run correctly against it.

Change-Id: I80053e78d253d8eee49233e42d55e5807ae8fdc8
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/app/vendors/hterm/hterm_all.js b/app/vendors/hterm/hterm_all.js
index 4bab739..2c551c2 100644
--- a/app/vendors/hterm/hterm_all.js
+++ b/app/vendors/hterm/hterm_all.js
@@ -90,13 +90,15 @@
 
   try {
     throw new Error();
-  } catch (ex) {
+  }
+  catch (ex) {
     var stackArray = ex.stack.split('\n');
     // In Safari, the resulting stackArray will only have 2 elements and the
     // individual strings are formatted differently.
     if (stackArray.length >= 3) {
       source = stackArray[2].replace(/^\s*at\s+/, '');
-    } else {
+    }
+    else {
       source = stackArray[1].replace(/^\s*global code@/, '');
     }
   }
@@ -105,7 +107,8 @@
     var path = arguments[i];
     if (path instanceof Array) {
       lib.rtdep.apply(lib, path);
-    } else {
+    }
+    else {
       var ary = this.runtimeDependencies_[path];
       if (!ary)
         ary = this.runtimeDependencies_[path] = [];
@@ -185,7 +188,8 @@
       if (opt_logFunction)
         opt_logFunction('init: ' + rec[0]);
       rec[1](lib.f.alarm(initNext));
-    } else {
+    }
+    else {
       onInit();
     }
   };
@@ -240,23 +244,23 @@
 
   // CSS rgb color, rgb(rrr,ggg,bbb).
   rgb: new RegExp(
-      ('^/s*rgb/s*/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,' +
-       '/s*(/d{1,3})/s*/)/s*$'
-       ).replace(/\//g, '\\'), 'i'),
+    ('^/s*rgb/s*/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,' +
+      '/s*(/d{1,3})/s*/)/s*$'
+    ).replace(/\//g, '\\'), 'i'),
 
   // CSS rgb color, rgb(rrr,ggg,bbb,aaa).
   rgba: new RegExp(
-      ('^/s*rgba/s*' +
-       '/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,/s*(/d{1,3})/s*' +
-       '(?:,/s*(/d+(?:/./d+)?)/s*)/)/s*$'
-       ).replace(/\//g, '\\'), 'i'),
+    ('^/s*rgba/s*' +
+      '/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,/s*(/d{1,3})/s*' +
+      '(?:,/s*(/d+(?:/./d+)?)/s*)/)/s*$'
+    ).replace(/\//g, '\\'), 'i'),
 
   // Either RGB or RGBA.
   rgbx: new RegExp(
-      ('^/s*rgba?/s*' +
-       '/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,/s*(/d{1,3})/s*' +
-       '(?:,/s*(/d+(?:/./d+)?)/s*)?/)/s*$'
-       ).replace(/\//g, '\\'), 'i'),
+    ('^/s*rgba?/s*' +
+      '/(/s*(/d{1,3})/s*,/s*(/d{1,3})/s*,/s*(/d{1,3})/s*' +
+      '(?:,/s*(/d+(?:/./d+)?)/s*)?/)/s*$'
+    ).replace(/\//g, '\\'), 'i'),
 
   // An X11 "rgb:dddd/dddd/dddd" value.
   x11rgb: /^\s*rgb:([a-f0-9]{1,4})\/([a-f0-9]{1,4})\/([a-f0-9]{1,4})\s*$/i,
@@ -324,9 +328,9 @@
   // Normalize to 16 bits.
   function norm16(v) {
     v = parseInt(v, 16);
-    return size == 2 ? v :         // 16 bit
-           size == 1 ? v << 4 :    // 8 bit
-           v >> (4 * (size - 2));  // 24 or 32 bit
+    return size == 2 ? v : // 16 bit
+      size == 1 ? v << 4 : // 8 bit
+      v >> (4 * (size - 2)); // 24 or 32 bit
   }
   return lib.colors.arrayToRGBA([r, g, b].map(norm16));
 };
@@ -405,7 +409,7 @@
   function convert(hex) {
     if (hex.length == 4) {
       hex = hex.replace(hex16, function(h, r, g, b) {
-        return "#" + r + r + g + g + b + b;
+        return '#' + r + r + g + g + b + b;
       });
     }
     var ary = hex.match(hex24);
@@ -413,15 +417,16 @@
       return null;
 
     return 'rgb(' + parseInt(ary[1], 16) + ', ' +
-        parseInt(ary[2], 16) + ', ' +
-        parseInt(ary[3], 16) + ')';
+      parseInt(ary[2], 16) + ', ' +
+      parseInt(ary[3], 16) + ')';
   }
 
   if (arg instanceof Array) {
     for (var i = 0; i < arg.length; i++) {
       arg[i] = convert(arg[i]);
     }
-  } else {
+  }
+  else {
     arg = convert(arg);
   }
 
@@ -446,15 +451,16 @@
     if (!ary)
       return null;
     return '#' + lib.f.zpad(((parseInt(ary[0]) << 16) |
-                             (parseInt(ary[1]) <<  8) |
-                             (parseInt(ary[2]) <<  0)).toString(16), 6);
+      (parseInt(ary[1]) << 8) |
+      (parseInt(ary[2]) << 0)).toString(16), 6);
   }
 
   if (arg instanceof Array) {
     for (var i = 0; i < arg.length; i++) {
       arg[i] = convert(arg[i]);
     }
-  } else {
+  }
+  else {
     arg = convert(arg);
   }
 
@@ -521,7 +527,8 @@
       ary.shift();
       return ary;
     }
-  } else {
+  }
+  else {
     var ary = color.match(lib.colors.re_.rgb);
     if (ary) {
       ary.shift();
@@ -564,62 +571,61 @@
 /**
  * The stock color palette.
  */
-lib.colors.stockColorPalette = lib.colors.hexToRGB
-  ([// The "ANSI 16"...
-    '#000000', '#CC0000', '#4E9A06', '#C4A000',
-    '#3465A4', '#75507B', '#06989A', '#D3D7CF',
-    '#555753', '#EF2929', '#00BA13', '#FCE94F',
-    '#729FCF', '#F200CB', '#00B5BD', '#EEEEEC',
+lib.colors.stockColorPalette = lib.colors.hexToRGB([ // The "ANSI 16"...
+  '#000000', '#CC0000', '#4E9A06', '#C4A000',
+  '#3465A4', '#75507B', '#06989A', '#D3D7CF',
+  '#555753', '#EF2929', '#00BA13', '#FCE94F',
+  '#729FCF', '#F200CB', '#00B5BD', '#EEEEEC',
 
-    // The 6x6 color cubes...
-    '#000000', '#00005F', '#000087', '#0000AF', '#0000D7', '#0000FF',
-    '#005F00', '#005F5F', '#005F87', '#005FAF', '#005FD7', '#005FFF',
-    '#008700', '#00875F', '#008787', '#0087AF', '#0087D7', '#0087FF',
-    '#00AF00', '#00AF5F', '#00AF87', '#00AFAF', '#00AFD7', '#00AFFF',
-    '#00D700', '#00D75F', '#00D787', '#00D7AF', '#00D7D7', '#00D7FF',
-    '#00FF00', '#00FF5F', '#00FF87', '#00FFAF', '#00FFD7', '#00FFFF',
+  // The 6x6 color cubes...
+  '#000000', '#00005F', '#000087', '#0000AF', '#0000D7', '#0000FF',
+  '#005F00', '#005F5F', '#005F87', '#005FAF', '#005FD7', '#005FFF',
+  '#008700', '#00875F', '#008787', '#0087AF', '#0087D7', '#0087FF',
+  '#00AF00', '#00AF5F', '#00AF87', '#00AFAF', '#00AFD7', '#00AFFF',
+  '#00D700', '#00D75F', '#00D787', '#00D7AF', '#00D7D7', '#00D7FF',
+  '#00FF00', '#00FF5F', '#00FF87', '#00FFAF', '#00FFD7', '#00FFFF',
 
-    '#5F0000', '#5F005F', '#5F0087', '#5F00AF', '#5F00D7', '#5F00FF',
-    '#5F5F00', '#5F5F5F', '#5F5F87', '#5F5FAF', '#5F5FD7', '#5F5FFF',
-    '#5F8700', '#5F875F', '#5F8787', '#5F87AF', '#5F87D7', '#5F87FF',
-    '#5FAF00', '#5FAF5F', '#5FAF87', '#5FAFAF', '#5FAFD7', '#5FAFFF',
-    '#5FD700', '#5FD75F', '#5FD787', '#5FD7AF', '#5FD7D7', '#5FD7FF',
-    '#5FFF00', '#5FFF5F', '#5FFF87', '#5FFFAF', '#5FFFD7', '#5FFFFF',
+  '#5F0000', '#5F005F', '#5F0087', '#5F00AF', '#5F00D7', '#5F00FF',
+  '#5F5F00', '#5F5F5F', '#5F5F87', '#5F5FAF', '#5F5FD7', '#5F5FFF',
+  '#5F8700', '#5F875F', '#5F8787', '#5F87AF', '#5F87D7', '#5F87FF',
+  '#5FAF00', '#5FAF5F', '#5FAF87', '#5FAFAF', '#5FAFD7', '#5FAFFF',
+  '#5FD700', '#5FD75F', '#5FD787', '#5FD7AF', '#5FD7D7', '#5FD7FF',
+  '#5FFF00', '#5FFF5F', '#5FFF87', '#5FFFAF', '#5FFFD7', '#5FFFFF',
 
-    '#870000', '#87005F', '#870087', '#8700AF', '#8700D7', '#8700FF',
-    '#875F00', '#875F5F', '#875F87', '#875FAF', '#875FD7', '#875FFF',
-    '#878700', '#87875F', '#878787', '#8787AF', '#8787D7', '#8787FF',
-    '#87AF00', '#87AF5F', '#87AF87', '#87AFAF', '#87AFD7', '#87AFFF',
-    '#87D700', '#87D75F', '#87D787', '#87D7AF', '#87D7D7', '#87D7FF',
-    '#87FF00', '#87FF5F', '#87FF87', '#87FFAF', '#87FFD7', '#87FFFF',
+  '#870000', '#87005F', '#870087', '#8700AF', '#8700D7', '#8700FF',
+  '#875F00', '#875F5F', '#875F87', '#875FAF', '#875FD7', '#875FFF',
+  '#878700', '#87875F', '#878787', '#8787AF', '#8787D7', '#8787FF',
+  '#87AF00', '#87AF5F', '#87AF87', '#87AFAF', '#87AFD7', '#87AFFF',
+  '#87D700', '#87D75F', '#87D787', '#87D7AF', '#87D7D7', '#87D7FF',
+  '#87FF00', '#87FF5F', '#87FF87', '#87FFAF', '#87FFD7', '#87FFFF',
 
-    '#AF0000', '#AF005F', '#AF0087', '#AF00AF', '#AF00D7', '#AF00FF',
-    '#AF5F00', '#AF5F5F', '#AF5F87', '#AF5FAF', '#AF5FD7', '#AF5FFF',
-    '#AF8700', '#AF875F', '#AF8787', '#AF87AF', '#AF87D7', '#AF87FF',
-    '#AFAF00', '#AFAF5F', '#AFAF87', '#AFAFAF', '#AFAFD7', '#AFAFFF',
-    '#AFD700', '#AFD75F', '#AFD787', '#AFD7AF', '#AFD7D7', '#AFD7FF',
-    '#AFFF00', '#AFFF5F', '#AFFF87', '#AFFFAF', '#AFFFD7', '#AFFFFF',
+  '#AF0000', '#AF005F', '#AF0087', '#AF00AF', '#AF00D7', '#AF00FF',
+  '#AF5F00', '#AF5F5F', '#AF5F87', '#AF5FAF', '#AF5FD7', '#AF5FFF',
+  '#AF8700', '#AF875F', '#AF8787', '#AF87AF', '#AF87D7', '#AF87FF',
+  '#AFAF00', '#AFAF5F', '#AFAF87', '#AFAFAF', '#AFAFD7', '#AFAFFF',
+  '#AFD700', '#AFD75F', '#AFD787', '#AFD7AF', '#AFD7D7', '#AFD7FF',
+  '#AFFF00', '#AFFF5F', '#AFFF87', '#AFFFAF', '#AFFFD7', '#AFFFFF',
 
-    '#D70000', '#D7005F', '#D70087', '#D700AF', '#D700D7', '#D700FF',
-    '#D75F00', '#D75F5F', '#D75F87', '#D75FAF', '#D75FD7', '#D75FFF',
-    '#D78700', '#D7875F', '#D78787', '#D787AF', '#D787D7', '#D787FF',
-    '#D7AF00', '#D7AF5F', '#D7AF87', '#D7AFAF', '#D7AFD7', '#D7AFFF',
-    '#D7D700', '#D7D75F', '#D7D787', '#D7D7AF', '#D7D7D7', '#D7D7FF',
-    '#D7FF00', '#D7FF5F', '#D7FF87', '#D7FFAF', '#D7FFD7', '#D7FFFF',
+  '#D70000', '#D7005F', '#D70087', '#D700AF', '#D700D7', '#D700FF',
+  '#D75F00', '#D75F5F', '#D75F87', '#D75FAF', '#D75FD7', '#D75FFF',
+  '#D78700', '#D7875F', '#D78787', '#D787AF', '#D787D7', '#D787FF',
+  '#D7AF00', '#D7AF5F', '#D7AF87', '#D7AFAF', '#D7AFD7', '#D7AFFF',
+  '#D7D700', '#D7D75F', '#D7D787', '#D7D7AF', '#D7D7D7', '#D7D7FF',
+  '#D7FF00', '#D7FF5F', '#D7FF87', '#D7FFAF', '#D7FFD7', '#D7FFFF',
 
-    '#FF0000', '#FF005F', '#FF0087', '#FF00AF', '#FF00D7', '#FF00FF',
-    '#FF5F00', '#FF5F5F', '#FF5F87', '#FF5FAF', '#FF5FD7', '#FF5FFF',
-    '#FF8700', '#FF875F', '#FF8787', '#FF87AF', '#FF87D7', '#FF87FF',
-    '#FFAF00', '#FFAF5F', '#FFAF87', '#FFAFAF', '#FFAFD7', '#FFAFFF',
-    '#FFD700', '#FFD75F', '#FFD787', '#FFD7AF', '#FFD7D7', '#FFD7FF',
-    '#FFFF00', '#FFFF5F', '#FFFF87', '#FFFFAF', '#FFFFD7', '#FFFFFF',
+  '#FF0000', '#FF005F', '#FF0087', '#FF00AF', '#FF00D7', '#FF00FF',
+  '#FF5F00', '#FF5F5F', '#FF5F87', '#FF5FAF', '#FF5FD7', '#FF5FFF',
+  '#FF8700', '#FF875F', '#FF8787', '#FF87AF', '#FF87D7', '#FF87FF',
+  '#FFAF00', '#FFAF5F', '#FFAF87', '#FFAFAF', '#FFAFD7', '#FFAFFF',
+  '#FFD700', '#FFD75F', '#FFD787', '#FFD7AF', '#FFD7D7', '#FFD7FF',
+  '#FFFF00', '#FFFF5F', '#FFFF87', '#FFFFAF', '#FFFFD7', '#FFFFFF',
 
-    // The greyscale ramp...
-    '#080808', '#121212', '#1C1C1C', '#262626', '#303030', '#3A3A3A',
-    '#444444', '#4E4E4E', '#585858', '#626262', '#6C6C6C', '#767676',
-    '#808080', '#8A8A8A', '#949494', '#9E9E9E', '#A8A8A8', '#B2B2B2',
-    '#BCBCBC', '#C6C6C6', '#D0D0D0', '#DADADA', '#E4E4E4', '#EEEEEE'
-   ]);
+  // The greyscale ramp...
+  '#080808', '#121212', '#1C1C1C', '#262626', '#303030', '#3A3A3A',
+  '#444444', '#4E4E4E', '#585858', '#626262', '#6C6C6C', '#767676',
+  '#808080', '#8A8A8A', '#949494', '#9E9E9E', '#A8A8A8', '#B2B2B2',
+  '#BCBCBC', '#C6C6C6', '#D0D0D0', '#DADADA', '#E4E4E4', '#EEEEEE'
+]);
 
 /**
  * The current color palette, possibly with user changes.
@@ -630,664 +636,664 @@
  * Named colors according to the stock X11 rgb.txt file.
  */
 lib.colors.colorNames = {
-  "aliceblue": "rgb(240, 248, 255)",
-  "antiquewhite": "rgb(250, 235, 215)",
-  "antiquewhite1": "rgb(255, 239, 219)",
-  "antiquewhite2": "rgb(238, 223, 204)",
-  "antiquewhite3": "rgb(205, 192, 176)",
-  "antiquewhite4": "rgb(139, 131, 120)",
-  "aquamarine": "rgb(127, 255, 212)",
-  "aquamarine1": "rgb(127, 255, 212)",
-  "aquamarine2": "rgb(118, 238, 198)",
-  "aquamarine3": "rgb(102, 205, 170)",
-  "aquamarine4": "rgb(69, 139, 116)",
-  "azure": "rgb(240, 255, 255)",
-  "azure1": "rgb(240, 255, 255)",
-  "azure2": "rgb(224, 238, 238)",
-  "azure3": "rgb(193, 205, 205)",
-  "azure4": "rgb(131, 139, 139)",
-  "beige": "rgb(245, 245, 220)",
-  "bisque": "rgb(255, 228, 196)",
-  "bisque1": "rgb(255, 228, 196)",
-  "bisque2": "rgb(238, 213, 183)",
-  "bisque3": "rgb(205, 183, 158)",
-  "bisque4": "rgb(139, 125, 107)",
-  "black": "rgb(0, 0, 0)",
-  "blanchedalmond": "rgb(255, 235, 205)",
-  "blue": "rgb(0, 0, 255)",
-  "blue1": "rgb(0, 0, 255)",
-  "blue2": "rgb(0, 0, 238)",
-  "blue3": "rgb(0, 0, 205)",
-  "blue4": "rgb(0, 0, 139)",
-  "blueviolet": "rgb(138, 43, 226)",
-  "brown": "rgb(165, 42, 42)",
-  "brown1": "rgb(255, 64, 64)",
-  "brown2": "rgb(238, 59, 59)",
-  "brown3": "rgb(205, 51, 51)",
-  "brown4": "rgb(139, 35, 35)",
-  "burlywood": "rgb(222, 184, 135)",
-  "burlywood1": "rgb(255, 211, 155)",
-  "burlywood2": "rgb(238, 197, 145)",
-  "burlywood3": "rgb(205, 170, 125)",
-  "burlywood4": "rgb(139, 115, 85)",
-  "cadetblue": "rgb(95, 158, 160)",
-  "cadetblue1": "rgb(152, 245, 255)",
-  "cadetblue2": "rgb(142, 229, 238)",
-  "cadetblue3": "rgb(122, 197, 205)",
-  "cadetblue4": "rgb(83, 134, 139)",
-  "chartreuse": "rgb(127, 255, 0)",
-  "chartreuse1": "rgb(127, 255, 0)",
-  "chartreuse2": "rgb(118, 238, 0)",
-  "chartreuse3": "rgb(102, 205, 0)",
-  "chartreuse4": "rgb(69, 139, 0)",
-  "chocolate": "rgb(210, 105, 30)",
-  "chocolate1": "rgb(255, 127, 36)",
-  "chocolate2": "rgb(238, 118, 33)",
-  "chocolate3": "rgb(205, 102, 29)",
-  "chocolate4": "rgb(139, 69, 19)",
-  "coral": "rgb(255, 127, 80)",
-  "coral1": "rgb(255, 114, 86)",
-  "coral2": "rgb(238, 106, 80)",
-  "coral3": "rgb(205, 91, 69)",
-  "coral4": "rgb(139, 62, 47)",
-  "cornflowerblue": "rgb(100, 149, 237)",
-  "cornsilk": "rgb(255, 248, 220)",
-  "cornsilk1": "rgb(255, 248, 220)",
-  "cornsilk2": "rgb(238, 232, 205)",
-  "cornsilk3": "rgb(205, 200, 177)",
-  "cornsilk4": "rgb(139, 136, 120)",
-  "cyan": "rgb(0, 255, 255)",
-  "cyan1": "rgb(0, 255, 255)",
-  "cyan2": "rgb(0, 238, 238)",
-  "cyan3": "rgb(0, 205, 205)",
-  "cyan4": "rgb(0, 139, 139)",
-  "darkblue": "rgb(0, 0, 139)",
-  "darkcyan": "rgb(0, 139, 139)",
-  "darkgoldenrod": "rgb(184, 134, 11)",
-  "darkgoldenrod1": "rgb(255, 185, 15)",
-  "darkgoldenrod2": "rgb(238, 173, 14)",
-  "darkgoldenrod3": "rgb(205, 149, 12)",
-  "darkgoldenrod4": "rgb(139, 101, 8)",
-  "darkgray": "rgb(169, 169, 169)",
-  "darkgreen": "rgb(0, 100, 0)",
-  "darkgrey": "rgb(169, 169, 169)",
-  "darkkhaki": "rgb(189, 183, 107)",
-  "darkmagenta": "rgb(139, 0, 139)",
-  "darkolivegreen": "rgb(85, 107, 47)",
-  "darkolivegreen1": "rgb(202, 255, 112)",
-  "darkolivegreen2": "rgb(188, 238, 104)",
-  "darkolivegreen3": "rgb(162, 205, 90)",
-  "darkolivegreen4": "rgb(110, 139, 61)",
-  "darkorange": "rgb(255, 140, 0)",
-  "darkorange1": "rgb(255, 127, 0)",
-  "darkorange2": "rgb(238, 118, 0)",
-  "darkorange3": "rgb(205, 102, 0)",
-  "darkorange4": "rgb(139, 69, 0)",
-  "darkorchid": "rgb(153, 50, 204)",
-  "darkorchid1": "rgb(191, 62, 255)",
-  "darkorchid2": "rgb(178, 58, 238)",
-  "darkorchid3": "rgb(154, 50, 205)",
-  "darkorchid4": "rgb(104, 34, 139)",
-  "darkred": "rgb(139, 0, 0)",
-  "darksalmon": "rgb(233, 150, 122)",
-  "darkseagreen": "rgb(143, 188, 143)",
-  "darkseagreen1": "rgb(193, 255, 193)",
-  "darkseagreen2": "rgb(180, 238, 180)",
-  "darkseagreen3": "rgb(155, 205, 155)",
-  "darkseagreen4": "rgb(105, 139, 105)",
-  "darkslateblue": "rgb(72, 61, 139)",
-  "darkslategray": "rgb(47, 79, 79)",
-  "darkslategray1": "rgb(151, 255, 255)",
-  "darkslategray2": "rgb(141, 238, 238)",
-  "darkslategray3": "rgb(121, 205, 205)",
-  "darkslategray4": "rgb(82, 139, 139)",
-  "darkslategrey": "rgb(47, 79, 79)",
-  "darkturquoise": "rgb(0, 206, 209)",
-  "darkviolet": "rgb(148, 0, 211)",
-  "debianred": "rgb(215, 7, 81)",
-  "deeppink": "rgb(255, 20, 147)",
-  "deeppink1": "rgb(255, 20, 147)",
-  "deeppink2": "rgb(238, 18, 137)",
-  "deeppink3": "rgb(205, 16, 118)",
-  "deeppink4": "rgb(139, 10, 80)",
-  "deepskyblue": "rgb(0, 191, 255)",
-  "deepskyblue1": "rgb(0, 191, 255)",
-  "deepskyblue2": "rgb(0, 178, 238)",
-  "deepskyblue3": "rgb(0, 154, 205)",
-  "deepskyblue4": "rgb(0, 104, 139)",
-  "dimgray": "rgb(105, 105, 105)",
-  "dimgrey": "rgb(105, 105, 105)",
-  "dodgerblue": "rgb(30, 144, 255)",
-  "dodgerblue1": "rgb(30, 144, 255)",
-  "dodgerblue2": "rgb(28, 134, 238)",
-  "dodgerblue3": "rgb(24, 116, 205)",
-  "dodgerblue4": "rgb(16, 78, 139)",
-  "firebrick": "rgb(178, 34, 34)",
-  "firebrick1": "rgb(255, 48, 48)",
-  "firebrick2": "rgb(238, 44, 44)",
-  "firebrick3": "rgb(205, 38, 38)",
-  "firebrick4": "rgb(139, 26, 26)",
-  "floralwhite": "rgb(255, 250, 240)",
-  "forestgreen": "rgb(34, 139, 34)",
-  "gainsboro": "rgb(220, 220, 220)",
-  "ghostwhite": "rgb(248, 248, 255)",
-  "gold": "rgb(255, 215, 0)",
-  "gold1": "rgb(255, 215, 0)",
-  "gold2": "rgb(238, 201, 0)",
-  "gold3": "rgb(205, 173, 0)",
-  "gold4": "rgb(139, 117, 0)",
-  "goldenrod": "rgb(218, 165, 32)",
-  "goldenrod1": "rgb(255, 193, 37)",
-  "goldenrod2": "rgb(238, 180, 34)",
-  "goldenrod3": "rgb(205, 155, 29)",
-  "goldenrod4": "rgb(139, 105, 20)",
-  "gray": "rgb(190, 190, 190)",
-  "gray0": "rgb(0, 0, 0)",
-  "gray1": "rgb(3, 3, 3)",
-  "gray10": "rgb(26, 26, 26)",
-  "gray100": "rgb(255, 255, 255)",
-  "gray11": "rgb(28, 28, 28)",
-  "gray12": "rgb(31, 31, 31)",
-  "gray13": "rgb(33, 33, 33)",
-  "gray14": "rgb(36, 36, 36)",
-  "gray15": "rgb(38, 38, 38)",
-  "gray16": "rgb(41, 41, 41)",
-  "gray17": "rgb(43, 43, 43)",
-  "gray18": "rgb(46, 46, 46)",
-  "gray19": "rgb(48, 48, 48)",
-  "gray2": "rgb(5, 5, 5)",
-  "gray20": "rgb(51, 51, 51)",
-  "gray21": "rgb(54, 54, 54)",
-  "gray22": "rgb(56, 56, 56)",
-  "gray23": "rgb(59, 59, 59)",
-  "gray24": "rgb(61, 61, 61)",
-  "gray25": "rgb(64, 64, 64)",
-  "gray26": "rgb(66, 66, 66)",
-  "gray27": "rgb(69, 69, 69)",
-  "gray28": "rgb(71, 71, 71)",
-  "gray29": "rgb(74, 74, 74)",
-  "gray3": "rgb(8, 8, 8)",
-  "gray30": "rgb(77, 77, 77)",
-  "gray31": "rgb(79, 79, 79)",
-  "gray32": "rgb(82, 82, 82)",
-  "gray33": "rgb(84, 84, 84)",
-  "gray34": "rgb(87, 87, 87)",
-  "gray35": "rgb(89, 89, 89)",
-  "gray36": "rgb(92, 92, 92)",
-  "gray37": "rgb(94, 94, 94)",
-  "gray38": "rgb(97, 97, 97)",
-  "gray39": "rgb(99, 99, 99)",
-  "gray4": "rgb(10, 10, 10)",
-  "gray40": "rgb(102, 102, 102)",
-  "gray41": "rgb(105, 105, 105)",
-  "gray42": "rgb(107, 107, 107)",
-  "gray43": "rgb(110, 110, 110)",
-  "gray44": "rgb(112, 112, 112)",
-  "gray45": "rgb(115, 115, 115)",
-  "gray46": "rgb(117, 117, 117)",
-  "gray47": "rgb(120, 120, 120)",
-  "gray48": "rgb(122, 122, 122)",
-  "gray49": "rgb(125, 125, 125)",
-  "gray5": "rgb(13, 13, 13)",
-  "gray50": "rgb(127, 127, 127)",
-  "gray51": "rgb(130, 130, 130)",
-  "gray52": "rgb(133, 133, 133)",
-  "gray53": "rgb(135, 135, 135)",
-  "gray54": "rgb(138, 138, 138)",
-  "gray55": "rgb(140, 140, 140)",
-  "gray56": "rgb(143, 143, 143)",
-  "gray57": "rgb(145, 145, 145)",
-  "gray58": "rgb(148, 148, 148)",
-  "gray59": "rgb(150, 150, 150)",
-  "gray6": "rgb(15, 15, 15)",
-  "gray60": "rgb(153, 153, 153)",
-  "gray61": "rgb(156, 156, 156)",
-  "gray62": "rgb(158, 158, 158)",
-  "gray63": "rgb(161, 161, 161)",
-  "gray64": "rgb(163, 163, 163)",
-  "gray65": "rgb(166, 166, 166)",
-  "gray66": "rgb(168, 168, 168)",
-  "gray67": "rgb(171, 171, 171)",
-  "gray68": "rgb(173, 173, 173)",
-  "gray69": "rgb(176, 176, 176)",
-  "gray7": "rgb(18, 18, 18)",
-  "gray70": "rgb(179, 179, 179)",
-  "gray71": "rgb(181, 181, 181)",
-  "gray72": "rgb(184, 184, 184)",
-  "gray73": "rgb(186, 186, 186)",
-  "gray74": "rgb(189, 189, 189)",
-  "gray75": "rgb(191, 191, 191)",
-  "gray76": "rgb(194, 194, 194)",
-  "gray77": "rgb(196, 196, 196)",
-  "gray78": "rgb(199, 199, 199)",
-  "gray79": "rgb(201, 201, 201)",
-  "gray8": "rgb(20, 20, 20)",
-  "gray80": "rgb(204, 204, 204)",
-  "gray81": "rgb(207, 207, 207)",
-  "gray82": "rgb(209, 209, 209)",
-  "gray83": "rgb(212, 212, 212)",
-  "gray84": "rgb(214, 214, 214)",
-  "gray85": "rgb(217, 217, 217)",
-  "gray86": "rgb(219, 219, 219)",
-  "gray87": "rgb(222, 222, 222)",
-  "gray88": "rgb(224, 224, 224)",
-  "gray89": "rgb(227, 227, 227)",
-  "gray9": "rgb(23, 23, 23)",
-  "gray90": "rgb(229, 229, 229)",
-  "gray91": "rgb(232, 232, 232)",
-  "gray92": "rgb(235, 235, 235)",
-  "gray93": "rgb(237, 237, 237)",
-  "gray94": "rgb(240, 240, 240)",
-  "gray95": "rgb(242, 242, 242)",
-  "gray96": "rgb(245, 245, 245)",
-  "gray97": "rgb(247, 247, 247)",
-  "gray98": "rgb(250, 250, 250)",
-  "gray99": "rgb(252, 252, 252)",
-  "green": "rgb(0, 255, 0)",
-  "green1": "rgb(0, 255, 0)",
-  "green2": "rgb(0, 238, 0)",
-  "green3": "rgb(0, 205, 0)",
-  "green4": "rgb(0, 139, 0)",
-  "greenyellow": "rgb(173, 255, 47)",
-  "grey": "rgb(190, 190, 190)",
-  "grey0": "rgb(0, 0, 0)",
-  "grey1": "rgb(3, 3, 3)",
-  "grey10": "rgb(26, 26, 26)",
-  "grey100": "rgb(255, 255, 255)",
-  "grey11": "rgb(28, 28, 28)",
-  "grey12": "rgb(31, 31, 31)",
-  "grey13": "rgb(33, 33, 33)",
-  "grey14": "rgb(36, 36, 36)",
-  "grey15": "rgb(38, 38, 38)",
-  "grey16": "rgb(41, 41, 41)",
-  "grey17": "rgb(43, 43, 43)",
-  "grey18": "rgb(46, 46, 46)",
-  "grey19": "rgb(48, 48, 48)",
-  "grey2": "rgb(5, 5, 5)",
-  "grey20": "rgb(51, 51, 51)",
-  "grey21": "rgb(54, 54, 54)",
-  "grey22": "rgb(56, 56, 56)",
-  "grey23": "rgb(59, 59, 59)",
-  "grey24": "rgb(61, 61, 61)",
-  "grey25": "rgb(64, 64, 64)",
-  "grey26": "rgb(66, 66, 66)",
-  "grey27": "rgb(69, 69, 69)",
-  "grey28": "rgb(71, 71, 71)",
-  "grey29": "rgb(74, 74, 74)",
-  "grey3": "rgb(8, 8, 8)",
-  "grey30": "rgb(77, 77, 77)",
-  "grey31": "rgb(79, 79, 79)",
-  "grey32": "rgb(82, 82, 82)",
-  "grey33": "rgb(84, 84, 84)",
-  "grey34": "rgb(87, 87, 87)",
-  "grey35": "rgb(89, 89, 89)",
-  "grey36": "rgb(92, 92, 92)",
-  "grey37": "rgb(94, 94, 94)",
-  "grey38": "rgb(97, 97, 97)",
-  "grey39": "rgb(99, 99, 99)",
-  "grey4": "rgb(10, 10, 10)",
-  "grey40": "rgb(102, 102, 102)",
-  "grey41": "rgb(105, 105, 105)",
-  "grey42": "rgb(107, 107, 107)",
-  "grey43": "rgb(110, 110, 110)",
-  "grey44": "rgb(112, 112, 112)",
-  "grey45": "rgb(115, 115, 115)",
-  "grey46": "rgb(117, 117, 117)",
-  "grey47": "rgb(120, 120, 120)",
-  "grey48": "rgb(122, 122, 122)",
-  "grey49": "rgb(125, 125, 125)",
-  "grey5": "rgb(13, 13, 13)",
-  "grey50": "rgb(127, 127, 127)",
-  "grey51": "rgb(130, 130, 130)",
-  "grey52": "rgb(133, 133, 133)",
-  "grey53": "rgb(135, 135, 135)",
-  "grey54": "rgb(138, 138, 138)",
-  "grey55": "rgb(140, 140, 140)",
-  "grey56": "rgb(143, 143, 143)",
-  "grey57": "rgb(145, 145, 145)",
-  "grey58": "rgb(148, 148, 148)",
-  "grey59": "rgb(150, 150, 150)",
-  "grey6": "rgb(15, 15, 15)",
-  "grey60": "rgb(153, 153, 153)",
-  "grey61": "rgb(156, 156, 156)",
-  "grey62": "rgb(158, 158, 158)",
-  "grey63": "rgb(161, 161, 161)",
-  "grey64": "rgb(163, 163, 163)",
-  "grey65": "rgb(166, 166, 166)",
-  "grey66": "rgb(168, 168, 168)",
-  "grey67": "rgb(171, 171, 171)",
-  "grey68": "rgb(173, 173, 173)",
-  "grey69": "rgb(176, 176, 176)",
-  "grey7": "rgb(18, 18, 18)",
-  "grey70": "rgb(179, 179, 179)",
-  "grey71": "rgb(181, 181, 181)",
-  "grey72": "rgb(184, 184, 184)",
-  "grey73": "rgb(186, 186, 186)",
-  "grey74": "rgb(189, 189, 189)",
-  "grey75": "rgb(191, 191, 191)",
-  "grey76": "rgb(194, 194, 194)",
-  "grey77": "rgb(196, 196, 196)",
-  "grey78": "rgb(199, 199, 199)",
-  "grey79": "rgb(201, 201, 201)",
-  "grey8": "rgb(20, 20, 20)",
-  "grey80": "rgb(204, 204, 204)",
-  "grey81": "rgb(207, 207, 207)",
-  "grey82": "rgb(209, 209, 209)",
-  "grey83": "rgb(212, 212, 212)",
-  "grey84": "rgb(214, 214, 214)",
-  "grey85": "rgb(217, 217, 217)",
-  "grey86": "rgb(219, 219, 219)",
-  "grey87": "rgb(222, 222, 222)",
-  "grey88": "rgb(224, 224, 224)",
-  "grey89": "rgb(227, 227, 227)",
-  "grey9": "rgb(23, 23, 23)",
-  "grey90": "rgb(229, 229, 229)",
-  "grey91": "rgb(232, 232, 232)",
-  "grey92": "rgb(235, 235, 235)",
-  "grey93": "rgb(237, 237, 237)",
-  "grey94": "rgb(240, 240, 240)",
-  "grey95": "rgb(242, 242, 242)",
-  "grey96": "rgb(245, 245, 245)",
-  "grey97": "rgb(247, 247, 247)",
-  "grey98": "rgb(250, 250, 250)",
-  "grey99": "rgb(252, 252, 252)",
-  "honeydew": "rgb(240, 255, 240)",
-  "honeydew1": "rgb(240, 255, 240)",
-  "honeydew2": "rgb(224, 238, 224)",
-  "honeydew3": "rgb(193, 205, 193)",
-  "honeydew4": "rgb(131, 139, 131)",
-  "hotpink": "rgb(255, 105, 180)",
-  "hotpink1": "rgb(255, 110, 180)",
-  "hotpink2": "rgb(238, 106, 167)",
-  "hotpink3": "rgb(205, 96, 144)",
-  "hotpink4": "rgb(139, 58, 98)",
-  "indianred": "rgb(205, 92, 92)",
-  "indianred1": "rgb(255, 106, 106)",
-  "indianred2": "rgb(238, 99, 99)",
-  "indianred3": "rgb(205, 85, 85)",
-  "indianred4": "rgb(139, 58, 58)",
-  "ivory": "rgb(255, 255, 240)",
-  "ivory1": "rgb(255, 255, 240)",
-  "ivory2": "rgb(238, 238, 224)",
-  "ivory3": "rgb(205, 205, 193)",
-  "ivory4": "rgb(139, 139, 131)",
-  "khaki": "rgb(240, 230, 140)",
-  "khaki1": "rgb(255, 246, 143)",
-  "khaki2": "rgb(238, 230, 133)",
-  "khaki3": "rgb(205, 198, 115)",
-  "khaki4": "rgb(139, 134, 78)",
-  "lavender": "rgb(230, 230, 250)",
-  "lavenderblush": "rgb(255, 240, 245)",
-  "lavenderblush1": "rgb(255, 240, 245)",
-  "lavenderblush2": "rgb(238, 224, 229)",
-  "lavenderblush3": "rgb(205, 193, 197)",
-  "lavenderblush4": "rgb(139, 131, 134)",
-  "lawngreen": "rgb(124, 252, 0)",
-  "lemonchiffon": "rgb(255, 250, 205)",
-  "lemonchiffon1": "rgb(255, 250, 205)",
-  "lemonchiffon2": "rgb(238, 233, 191)",
-  "lemonchiffon3": "rgb(205, 201, 165)",
-  "lemonchiffon4": "rgb(139, 137, 112)",
-  "lightblue": "rgb(173, 216, 230)",
-  "lightblue1": "rgb(191, 239, 255)",
-  "lightblue2": "rgb(178, 223, 238)",
-  "lightblue3": "rgb(154, 192, 205)",
-  "lightblue4": "rgb(104, 131, 139)",
-  "lightcoral": "rgb(240, 128, 128)",
-  "lightcyan": "rgb(224, 255, 255)",
-  "lightcyan1": "rgb(224, 255, 255)",
-  "lightcyan2": "rgb(209, 238, 238)",
-  "lightcyan3": "rgb(180, 205, 205)",
-  "lightcyan4": "rgb(122, 139, 139)",
-  "lightgoldenrod": "rgb(238, 221, 130)",
-  "lightgoldenrod1": "rgb(255, 236, 139)",
-  "lightgoldenrod2": "rgb(238, 220, 130)",
-  "lightgoldenrod3": "rgb(205, 190, 112)",
-  "lightgoldenrod4": "rgb(139, 129, 76)",
-  "lightgoldenrodyellow": "rgb(250, 250, 210)",
-  "lightgray": "rgb(211, 211, 211)",
-  "lightgreen": "rgb(144, 238, 144)",
-  "lightgrey": "rgb(211, 211, 211)",
-  "lightpink": "rgb(255, 182, 193)",
-  "lightpink1": "rgb(255, 174, 185)",
-  "lightpink2": "rgb(238, 162, 173)",
-  "lightpink3": "rgb(205, 140, 149)",
-  "lightpink4": "rgb(139, 95, 101)",
-  "lightsalmon": "rgb(255, 160, 122)",
-  "lightsalmon1": "rgb(255, 160, 122)",
-  "lightsalmon2": "rgb(238, 149, 114)",
-  "lightsalmon3": "rgb(205, 129, 98)",
-  "lightsalmon4": "rgb(139, 87, 66)",
-  "lightseagreen": "rgb(32, 178, 170)",
-  "lightskyblue": "rgb(135, 206, 250)",
-  "lightskyblue1": "rgb(176, 226, 255)",
-  "lightskyblue2": "rgb(164, 211, 238)",
-  "lightskyblue3": "rgb(141, 182, 205)",
-  "lightskyblue4": "rgb(96, 123, 139)",
-  "lightslateblue": "rgb(132, 112, 255)",
-  "lightslategray": "rgb(119, 136, 153)",
-  "lightslategrey": "rgb(119, 136, 153)",
-  "lightsteelblue": "rgb(176, 196, 222)",
-  "lightsteelblue1": "rgb(202, 225, 255)",
-  "lightsteelblue2": "rgb(188, 210, 238)",
-  "lightsteelblue3": "rgb(162, 181, 205)",
-  "lightsteelblue4": "rgb(110, 123, 139)",
-  "lightyellow": "rgb(255, 255, 224)",
-  "lightyellow1": "rgb(255, 255, 224)",
-  "lightyellow2": "rgb(238, 238, 209)",
-  "lightyellow3": "rgb(205, 205, 180)",
-  "lightyellow4": "rgb(139, 139, 122)",
-  "limegreen": "rgb(50, 205, 50)",
-  "linen": "rgb(250, 240, 230)",
-  "magenta": "rgb(255, 0, 255)",
-  "magenta1": "rgb(255, 0, 255)",
-  "magenta2": "rgb(238, 0, 238)",
-  "magenta3": "rgb(205, 0, 205)",
-  "magenta4": "rgb(139, 0, 139)",
-  "maroon": "rgb(176, 48, 96)",
-  "maroon1": "rgb(255, 52, 179)",
-  "maroon2": "rgb(238, 48, 167)",
-  "maroon3": "rgb(205, 41, 144)",
-  "maroon4": "rgb(139, 28, 98)",
-  "mediumaquamarine": "rgb(102, 205, 170)",
-  "mediumblue": "rgb(0, 0, 205)",
-  "mediumorchid": "rgb(186, 85, 211)",
-  "mediumorchid1": "rgb(224, 102, 255)",
-  "mediumorchid2": "rgb(209, 95, 238)",
-  "mediumorchid3": "rgb(180, 82, 205)",
-  "mediumorchid4": "rgb(122, 55, 139)",
-  "mediumpurple": "rgb(147, 112, 219)",
-  "mediumpurple1": "rgb(171, 130, 255)",
-  "mediumpurple2": "rgb(159, 121, 238)",
-  "mediumpurple3": "rgb(137, 104, 205)",
-  "mediumpurple4": "rgb(93, 71, 139)",
-  "mediumseagreen": "rgb(60, 179, 113)",
-  "mediumslateblue": "rgb(123, 104, 238)",
-  "mediumspringgreen": "rgb(0, 250, 154)",
-  "mediumturquoise": "rgb(72, 209, 204)",
-  "mediumvioletred": "rgb(199, 21, 133)",
-  "midnightblue": "rgb(25, 25, 112)",
-  "mintcream": "rgb(245, 255, 250)",
-  "mistyrose": "rgb(255, 228, 225)",
-  "mistyrose1": "rgb(255, 228, 225)",
-  "mistyrose2": "rgb(238, 213, 210)",
-  "mistyrose3": "rgb(205, 183, 181)",
-  "mistyrose4": "rgb(139, 125, 123)",
-  "moccasin": "rgb(255, 228, 181)",
-  "navajowhite": "rgb(255, 222, 173)",
-  "navajowhite1": "rgb(255, 222, 173)",
-  "navajowhite2": "rgb(238, 207, 161)",
-  "navajowhite3": "rgb(205, 179, 139)",
-  "navajowhite4": "rgb(139, 121, 94)",
-  "navy": "rgb(0, 0, 128)",
-  "navyblue": "rgb(0, 0, 128)",
-  "oldlace": "rgb(253, 245, 230)",
-  "olivedrab": "rgb(107, 142, 35)",
-  "olivedrab1": "rgb(192, 255, 62)",
-  "olivedrab2": "rgb(179, 238, 58)",
-  "olivedrab3": "rgb(154, 205, 50)",
-  "olivedrab4": "rgb(105, 139, 34)",
-  "orange": "rgb(255, 165, 0)",
-  "orange1": "rgb(255, 165, 0)",
-  "orange2": "rgb(238, 154, 0)",
-  "orange3": "rgb(205, 133, 0)",
-  "orange4": "rgb(139, 90, 0)",
-  "orangered": "rgb(255, 69, 0)",
-  "orangered1": "rgb(255, 69, 0)",
-  "orangered2": "rgb(238, 64, 0)",
-  "orangered3": "rgb(205, 55, 0)",
-  "orangered4": "rgb(139, 37, 0)",
-  "orchid": "rgb(218, 112, 214)",
-  "orchid1": "rgb(255, 131, 250)",
-  "orchid2": "rgb(238, 122, 233)",
-  "orchid3": "rgb(205, 105, 201)",
-  "orchid4": "rgb(139, 71, 137)",
-  "palegoldenrod": "rgb(238, 232, 170)",
-  "palegreen": "rgb(152, 251, 152)",
-  "palegreen1": "rgb(154, 255, 154)",
-  "palegreen2": "rgb(144, 238, 144)",
-  "palegreen3": "rgb(124, 205, 124)",
-  "palegreen4": "rgb(84, 139, 84)",
-  "paleturquoise": "rgb(175, 238, 238)",
-  "paleturquoise1": "rgb(187, 255, 255)",
-  "paleturquoise2": "rgb(174, 238, 238)",
-  "paleturquoise3": "rgb(150, 205, 205)",
-  "paleturquoise4": "rgb(102, 139, 139)",
-  "palevioletred": "rgb(219, 112, 147)",
-  "palevioletred1": "rgb(255, 130, 171)",
-  "palevioletred2": "rgb(238, 121, 159)",
-  "palevioletred3": "rgb(205, 104, 137)",
-  "palevioletred4": "rgb(139, 71, 93)",
-  "papayawhip": "rgb(255, 239, 213)",
-  "peachpuff": "rgb(255, 218, 185)",
-  "peachpuff1": "rgb(255, 218, 185)",
-  "peachpuff2": "rgb(238, 203, 173)",
-  "peachpuff3": "rgb(205, 175, 149)",
-  "peachpuff4": "rgb(139, 119, 101)",
-  "peru": "rgb(205, 133, 63)",
-  "pink": "rgb(255, 192, 203)",
-  "pink1": "rgb(255, 181, 197)",
-  "pink2": "rgb(238, 169, 184)",
-  "pink3": "rgb(205, 145, 158)",
-  "pink4": "rgb(139, 99, 108)",
-  "plum": "rgb(221, 160, 221)",
-  "plum1": "rgb(255, 187, 255)",
-  "plum2": "rgb(238, 174, 238)",
-  "plum3": "rgb(205, 150, 205)",
-  "plum4": "rgb(139, 102, 139)",
-  "powderblue": "rgb(176, 224, 230)",
-  "purple": "rgb(160, 32, 240)",
-  "purple1": "rgb(155, 48, 255)",
-  "purple2": "rgb(145, 44, 238)",
-  "purple3": "rgb(125, 38, 205)",
-  "purple4": "rgb(85, 26, 139)",
-  "red": "rgb(255, 0, 0)",
-  "red1": "rgb(255, 0, 0)",
-  "red2": "rgb(238, 0, 0)",
-  "red3": "rgb(205, 0, 0)",
-  "red4": "rgb(139, 0, 0)",
-  "rosybrown": "rgb(188, 143, 143)",
-  "rosybrown1": "rgb(255, 193, 193)",
-  "rosybrown2": "rgb(238, 180, 180)",
-  "rosybrown3": "rgb(205, 155, 155)",
-  "rosybrown4": "rgb(139, 105, 105)",
-  "royalblue": "rgb(65, 105, 225)",
-  "royalblue1": "rgb(72, 118, 255)",
-  "royalblue2": "rgb(67, 110, 238)",
-  "royalblue3": "rgb(58, 95, 205)",
-  "royalblue4": "rgb(39, 64, 139)",
-  "saddlebrown": "rgb(139, 69, 19)",
-  "salmon": "rgb(250, 128, 114)",
-  "salmon1": "rgb(255, 140, 105)",
-  "salmon2": "rgb(238, 130, 98)",
-  "salmon3": "rgb(205, 112, 84)",
-  "salmon4": "rgb(139, 76, 57)",
-  "sandybrown": "rgb(244, 164, 96)",
-  "seagreen": "rgb(46, 139, 87)",
-  "seagreen1": "rgb(84, 255, 159)",
-  "seagreen2": "rgb(78, 238, 148)",
-  "seagreen3": "rgb(67, 205, 128)",
-  "seagreen4": "rgb(46, 139, 87)",
-  "seashell": "rgb(255, 245, 238)",
-  "seashell1": "rgb(255, 245, 238)",
-  "seashell2": "rgb(238, 229, 222)",
-  "seashell3": "rgb(205, 197, 191)",
-  "seashell4": "rgb(139, 134, 130)",
-  "sienna": "rgb(160, 82, 45)",
-  "sienna1": "rgb(255, 130, 71)",
-  "sienna2": "rgb(238, 121, 66)",
-  "sienna3": "rgb(205, 104, 57)",
-  "sienna4": "rgb(139, 71, 38)",
-  "skyblue": "rgb(135, 206, 235)",
-  "skyblue1": "rgb(135, 206, 255)",
-  "skyblue2": "rgb(126, 192, 238)",
-  "skyblue3": "rgb(108, 166, 205)",
-  "skyblue4": "rgb(74, 112, 139)",
-  "slateblue": "rgb(106, 90, 205)",
-  "slateblue1": "rgb(131, 111, 255)",
-  "slateblue2": "rgb(122, 103, 238)",
-  "slateblue3": "rgb(105, 89, 205)",
-  "slateblue4": "rgb(71, 60, 139)",
-  "slategray": "rgb(112, 128, 144)",
-  "slategray1": "rgb(198, 226, 255)",
-  "slategray2": "rgb(185, 211, 238)",
-  "slategray3": "rgb(159, 182, 205)",
-  "slategray4": "rgb(108, 123, 139)",
-  "slategrey": "rgb(112, 128, 144)",
-  "snow": "rgb(255, 250, 250)",
-  "snow1": "rgb(255, 250, 250)",
-  "snow2": "rgb(238, 233, 233)",
-  "snow3": "rgb(205, 201, 201)",
-  "snow4": "rgb(139, 137, 137)",
-  "springgreen": "rgb(0, 255, 127)",
-  "springgreen1": "rgb(0, 255, 127)",
-  "springgreen2": "rgb(0, 238, 118)",
-  "springgreen3": "rgb(0, 205, 102)",
-  "springgreen4": "rgb(0, 139, 69)",
-  "steelblue": "rgb(70, 130, 180)",
-  "steelblue1": "rgb(99, 184, 255)",
-  "steelblue2": "rgb(92, 172, 238)",
-  "steelblue3": "rgb(79, 148, 205)",
-  "steelblue4": "rgb(54, 100, 139)",
-  "tan": "rgb(210, 180, 140)",
-  "tan1": "rgb(255, 165, 79)",
-  "tan2": "rgb(238, 154, 73)",
-  "tan3": "rgb(205, 133, 63)",
-  "tan4": "rgb(139, 90, 43)",
-  "thistle": "rgb(216, 191, 216)",
-  "thistle1": "rgb(255, 225, 255)",
-  "thistle2": "rgb(238, 210, 238)",
-  "thistle3": "rgb(205, 181, 205)",
-  "thistle4": "rgb(139, 123, 139)",
-  "tomato": "rgb(255, 99, 71)",
-  "tomato1": "rgb(255, 99, 71)",
-  "tomato2": "rgb(238, 92, 66)",
-  "tomato3": "rgb(205, 79, 57)",
-  "tomato4": "rgb(139, 54, 38)",
-  "turquoise": "rgb(64, 224, 208)",
-  "turquoise1": "rgb(0, 245, 255)",
-  "turquoise2": "rgb(0, 229, 238)",
-  "turquoise3": "rgb(0, 197, 205)",
-  "turquoise4": "rgb(0, 134, 139)",
-  "violet": "rgb(238, 130, 238)",
-  "violetred": "rgb(208, 32, 144)",
-  "violetred1": "rgb(255, 62, 150)",
-  "violetred2": "rgb(238, 58, 140)",
-  "violetred3": "rgb(205, 50, 120)",
-  "violetred4": "rgb(139, 34, 82)",
-  "wheat": "rgb(245, 222, 179)",
-  "wheat1": "rgb(255, 231, 186)",
-  "wheat2": "rgb(238, 216, 174)",
-  "wheat3": "rgb(205, 186, 150)",
-  "wheat4": "rgb(139, 126, 102)",
-  "white": "rgb(255, 255, 255)",
-  "whitesmoke": "rgb(245, 245, 245)",
-  "yellow": "rgb(255, 255, 0)",
-  "yellow1": "rgb(255, 255, 0)",
-  "yellow2": "rgb(238, 238, 0)",
-  "yellow3": "rgb(205, 205, 0)",
-  "yellow4": "rgb(139, 139, 0)",
-  "yellowgreen": "rgb(154, 205, 50)"
+  'aliceblue': 'rgb(240, 248, 255)',
+  'antiquewhite': 'rgb(250, 235, 215)',
+  'antiquewhite1': 'rgb(255, 239, 219)',
+  'antiquewhite2': 'rgb(238, 223, 204)',
+  'antiquewhite3': 'rgb(205, 192, 176)',
+  'antiquewhite4': 'rgb(139, 131, 120)',
+  'aquamarine': 'rgb(127, 255, 212)',
+  'aquamarine1': 'rgb(127, 255, 212)',
+  'aquamarine2': 'rgb(118, 238, 198)',
+  'aquamarine3': 'rgb(102, 205, 170)',
+  'aquamarine4': 'rgb(69, 139, 116)',
+  'azure': 'rgb(240, 255, 255)',
+  'azure1': 'rgb(240, 255, 255)',
+  'azure2': 'rgb(224, 238, 238)',
+  'azure3': 'rgb(193, 205, 205)',
+  'azure4': 'rgb(131, 139, 139)',
+  'beige': 'rgb(245, 245, 220)',
+  'bisque': 'rgb(255, 228, 196)',
+  'bisque1': 'rgb(255, 228, 196)',
+  'bisque2': 'rgb(238, 213, 183)',
+  'bisque3': 'rgb(205, 183, 158)',
+  'bisque4': 'rgb(139, 125, 107)',
+  'black': 'rgb(0, 0, 0)',
+  'blanchedalmond': 'rgb(255, 235, 205)',
+  'blue': 'rgb(0, 0, 255)',
+  'blue1': 'rgb(0, 0, 255)',
+  'blue2': 'rgb(0, 0, 238)',
+  'blue3': 'rgb(0, 0, 205)',
+  'blue4': 'rgb(0, 0, 139)',
+  'blueviolet': 'rgb(138, 43, 226)',
+  'brown': 'rgb(165, 42, 42)',
+  'brown1': 'rgb(255, 64, 64)',
+  'brown2': 'rgb(238, 59, 59)',
+  'brown3': 'rgb(205, 51, 51)',
+  'brown4': 'rgb(139, 35, 35)',
+  'burlywood': 'rgb(222, 184, 135)',
+  'burlywood1': 'rgb(255, 211, 155)',
+  'burlywood2': 'rgb(238, 197, 145)',
+  'burlywood3': 'rgb(205, 170, 125)',
+  'burlywood4': 'rgb(139, 115, 85)',
+  'cadetblue': 'rgb(95, 158, 160)',
+  'cadetblue1': 'rgb(152, 245, 255)',
+  'cadetblue2': 'rgb(142, 229, 238)',
+  'cadetblue3': 'rgb(122, 197, 205)',
+  'cadetblue4': 'rgb(83, 134, 139)',
+  'chartreuse': 'rgb(127, 255, 0)',
+  'chartreuse1': 'rgb(127, 255, 0)',
+  'chartreuse2': 'rgb(118, 238, 0)',
+  'chartreuse3': 'rgb(102, 205, 0)',
+  'chartreuse4': 'rgb(69, 139, 0)',
+  'chocolate': 'rgb(210, 105, 30)',
+  'chocolate1': 'rgb(255, 127, 36)',
+  'chocolate2': 'rgb(238, 118, 33)',
+  'chocolate3': 'rgb(205, 102, 29)',
+  'chocolate4': 'rgb(139, 69, 19)',
+  'coral': 'rgb(255, 127, 80)',
+  'coral1': 'rgb(255, 114, 86)',
+  'coral2': 'rgb(238, 106, 80)',
+  'coral3': 'rgb(205, 91, 69)',
+  'coral4': 'rgb(139, 62, 47)',
+  'cornflowerblue': 'rgb(100, 149, 237)',
+  'cornsilk': 'rgb(255, 248, 220)',
+  'cornsilk1': 'rgb(255, 248, 220)',
+  'cornsilk2': 'rgb(238, 232, 205)',
+  'cornsilk3': 'rgb(205, 200, 177)',
+  'cornsilk4': 'rgb(139, 136, 120)',
+  'cyan': 'rgb(0, 255, 255)',
+  'cyan1': 'rgb(0, 255, 255)',
+  'cyan2': 'rgb(0, 238, 238)',
+  'cyan3': 'rgb(0, 205, 205)',
+  'cyan4': 'rgb(0, 139, 139)',
+  'darkblue': 'rgb(0, 0, 139)',
+  'darkcyan': 'rgb(0, 139, 139)',
+  'darkgoldenrod': 'rgb(184, 134, 11)',
+  'darkgoldenrod1': 'rgb(255, 185, 15)',
+  'darkgoldenrod2': 'rgb(238, 173, 14)',
+  'darkgoldenrod3': 'rgb(205, 149, 12)',
+  'darkgoldenrod4': 'rgb(139, 101, 8)',
+  'darkgray': 'rgb(169, 169, 169)',
+  'darkgreen': 'rgb(0, 100, 0)',
+  'darkgrey': 'rgb(169, 169, 169)',
+  'darkkhaki': 'rgb(189, 183, 107)',
+  'darkmagenta': 'rgb(139, 0, 139)',
+  'darkolivegreen': 'rgb(85, 107, 47)',
+  'darkolivegreen1': 'rgb(202, 255, 112)',
+  'darkolivegreen2': 'rgb(188, 238, 104)',
+  'darkolivegreen3': 'rgb(162, 205, 90)',
+  'darkolivegreen4': 'rgb(110, 139, 61)',
+  'darkorange': 'rgb(255, 140, 0)',
+  'darkorange1': 'rgb(255, 127, 0)',
+  'darkorange2': 'rgb(238, 118, 0)',
+  'darkorange3': 'rgb(205, 102, 0)',
+  'darkorange4': 'rgb(139, 69, 0)',
+  'darkorchid': 'rgb(153, 50, 204)',
+  'darkorchid1': 'rgb(191, 62, 255)',
+  'darkorchid2': 'rgb(178, 58, 238)',
+  'darkorchid3': 'rgb(154, 50, 205)',
+  'darkorchid4': 'rgb(104, 34, 139)',
+  'darkred': 'rgb(139, 0, 0)',
+  'darksalmon': 'rgb(233, 150, 122)',
+  'darkseagreen': 'rgb(143, 188, 143)',
+  'darkseagreen1': 'rgb(193, 255, 193)',
+  'darkseagreen2': 'rgb(180, 238, 180)',
+  'darkseagreen3': 'rgb(155, 205, 155)',
+  'darkseagreen4': 'rgb(105, 139, 105)',
+  'darkslateblue': 'rgb(72, 61, 139)',
+  'darkslategray': 'rgb(47, 79, 79)',
+  'darkslategray1': 'rgb(151, 255, 255)',
+  'darkslategray2': 'rgb(141, 238, 238)',
+  'darkslategray3': 'rgb(121, 205, 205)',
+  'darkslategray4': 'rgb(82, 139, 139)',
+  'darkslategrey': 'rgb(47, 79, 79)',
+  'darkturquoise': 'rgb(0, 206, 209)',
+  'darkviolet': 'rgb(148, 0, 211)',
+  'debianred': 'rgb(215, 7, 81)',
+  'deeppink': 'rgb(255, 20, 147)',
+  'deeppink1': 'rgb(255, 20, 147)',
+  'deeppink2': 'rgb(238, 18, 137)',
+  'deeppink3': 'rgb(205, 16, 118)',
+  'deeppink4': 'rgb(139, 10, 80)',
+  'deepskyblue': 'rgb(0, 191, 255)',
+  'deepskyblue1': 'rgb(0, 191, 255)',
+  'deepskyblue2': 'rgb(0, 178, 238)',
+  'deepskyblue3': 'rgb(0, 154, 205)',
+  'deepskyblue4': 'rgb(0, 104, 139)',
+  'dimgray': 'rgb(105, 105, 105)',
+  'dimgrey': 'rgb(105, 105, 105)',
+  'dodgerblue': 'rgb(30, 144, 255)',
+  'dodgerblue1': 'rgb(30, 144, 255)',
+  'dodgerblue2': 'rgb(28, 134, 238)',
+  'dodgerblue3': 'rgb(24, 116, 205)',
+  'dodgerblue4': 'rgb(16, 78, 139)',
+  'firebrick': 'rgb(178, 34, 34)',
+  'firebrick1': 'rgb(255, 48, 48)',
+  'firebrick2': 'rgb(238, 44, 44)',
+  'firebrick3': 'rgb(205, 38, 38)',
+  'firebrick4': 'rgb(139, 26, 26)',
+  'floralwhite': 'rgb(255, 250, 240)',
+  'forestgreen': 'rgb(34, 139, 34)',
+  'gainsboro': 'rgb(220, 220, 220)',
+  'ghostwhite': 'rgb(248, 248, 255)',
+  'gold': 'rgb(255, 215, 0)',
+  'gold1': 'rgb(255, 215, 0)',
+  'gold2': 'rgb(238, 201, 0)',
+  'gold3': 'rgb(205, 173, 0)',
+  'gold4': 'rgb(139, 117, 0)',
+  'goldenrod': 'rgb(218, 165, 32)',
+  'goldenrod1': 'rgb(255, 193, 37)',
+  'goldenrod2': 'rgb(238, 180, 34)',
+  'goldenrod3': 'rgb(205, 155, 29)',
+  'goldenrod4': 'rgb(139, 105, 20)',
+  'gray': 'rgb(190, 190, 190)',
+  'gray0': 'rgb(0, 0, 0)',
+  'gray1': 'rgb(3, 3, 3)',
+  'gray10': 'rgb(26, 26, 26)',
+  'gray100': 'rgb(255, 255, 255)',
+  'gray11': 'rgb(28, 28, 28)',
+  'gray12': 'rgb(31, 31, 31)',
+  'gray13': 'rgb(33, 33, 33)',
+  'gray14': 'rgb(36, 36, 36)',
+  'gray15': 'rgb(38, 38, 38)',
+  'gray16': 'rgb(41, 41, 41)',
+  'gray17': 'rgb(43, 43, 43)',
+  'gray18': 'rgb(46, 46, 46)',
+  'gray19': 'rgb(48, 48, 48)',
+  'gray2': 'rgb(5, 5, 5)',
+  'gray20': 'rgb(51, 51, 51)',
+  'gray21': 'rgb(54, 54, 54)',
+  'gray22': 'rgb(56, 56, 56)',
+  'gray23': 'rgb(59, 59, 59)',
+  'gray24': 'rgb(61, 61, 61)',
+  'gray25': 'rgb(64, 64, 64)',
+  'gray26': 'rgb(66, 66, 66)',
+  'gray27': 'rgb(69, 69, 69)',
+  'gray28': 'rgb(71, 71, 71)',
+  'gray29': 'rgb(74, 74, 74)',
+  'gray3': 'rgb(8, 8, 8)',
+  'gray30': 'rgb(77, 77, 77)',
+  'gray31': 'rgb(79, 79, 79)',
+  'gray32': 'rgb(82, 82, 82)',
+  'gray33': 'rgb(84, 84, 84)',
+  'gray34': 'rgb(87, 87, 87)',
+  'gray35': 'rgb(89, 89, 89)',
+  'gray36': 'rgb(92, 92, 92)',
+  'gray37': 'rgb(94, 94, 94)',
+  'gray38': 'rgb(97, 97, 97)',
+  'gray39': 'rgb(99, 99, 99)',
+  'gray4': 'rgb(10, 10, 10)',
+  'gray40': 'rgb(102, 102, 102)',
+  'gray41': 'rgb(105, 105, 105)',
+  'gray42': 'rgb(107, 107, 107)',
+  'gray43': 'rgb(110, 110, 110)',
+  'gray44': 'rgb(112, 112, 112)',
+  'gray45': 'rgb(115, 115, 115)',
+  'gray46': 'rgb(117, 117, 117)',
+  'gray47': 'rgb(120, 120, 120)',
+  'gray48': 'rgb(122, 122, 122)',
+  'gray49': 'rgb(125, 125, 125)',
+  'gray5': 'rgb(13, 13, 13)',
+  'gray50': 'rgb(127, 127, 127)',
+  'gray51': 'rgb(130, 130, 130)',
+  'gray52': 'rgb(133, 133, 133)',
+  'gray53': 'rgb(135, 135, 135)',
+  'gray54': 'rgb(138, 138, 138)',
+  'gray55': 'rgb(140, 140, 140)',
+  'gray56': 'rgb(143, 143, 143)',
+  'gray57': 'rgb(145, 145, 145)',
+  'gray58': 'rgb(148, 148, 148)',
+  'gray59': 'rgb(150, 150, 150)',
+  'gray6': 'rgb(15, 15, 15)',
+  'gray60': 'rgb(153, 153, 153)',
+  'gray61': 'rgb(156, 156, 156)',
+  'gray62': 'rgb(158, 158, 158)',
+  'gray63': 'rgb(161, 161, 161)',
+  'gray64': 'rgb(163, 163, 163)',
+  'gray65': 'rgb(166, 166, 166)',
+  'gray66': 'rgb(168, 168, 168)',
+  'gray67': 'rgb(171, 171, 171)',
+  'gray68': 'rgb(173, 173, 173)',
+  'gray69': 'rgb(176, 176, 176)',
+  'gray7': 'rgb(18, 18, 18)',
+  'gray70': 'rgb(179, 179, 179)',
+  'gray71': 'rgb(181, 181, 181)',
+  'gray72': 'rgb(184, 184, 184)',
+  'gray73': 'rgb(186, 186, 186)',
+  'gray74': 'rgb(189, 189, 189)',
+  'gray75': 'rgb(191, 191, 191)',
+  'gray76': 'rgb(194, 194, 194)',
+  'gray77': 'rgb(196, 196, 196)',
+  'gray78': 'rgb(199, 199, 199)',
+  'gray79': 'rgb(201, 201, 201)',
+  'gray8': 'rgb(20, 20, 20)',
+  'gray80': 'rgb(204, 204, 204)',
+  'gray81': 'rgb(207, 207, 207)',
+  'gray82': 'rgb(209, 209, 209)',
+  'gray83': 'rgb(212, 212, 212)',
+  'gray84': 'rgb(214, 214, 214)',
+  'gray85': 'rgb(217, 217, 217)',
+  'gray86': 'rgb(219, 219, 219)',
+  'gray87': 'rgb(222, 222, 222)',
+  'gray88': 'rgb(224, 224, 224)',
+  'gray89': 'rgb(227, 227, 227)',
+  'gray9': 'rgb(23, 23, 23)',
+  'gray90': 'rgb(229, 229, 229)',
+  'gray91': 'rgb(232, 232, 232)',
+  'gray92': 'rgb(235, 235, 235)',
+  'gray93': 'rgb(237, 237, 237)',
+  'gray94': 'rgb(240, 240, 240)',
+  'gray95': 'rgb(242, 242, 242)',
+  'gray96': 'rgb(245, 245, 245)',
+  'gray97': 'rgb(247, 247, 247)',
+  'gray98': 'rgb(250, 250, 250)',
+  'gray99': 'rgb(252, 252, 252)',
+  'green': 'rgb(0, 255, 0)',
+  'green1': 'rgb(0, 255, 0)',
+  'green2': 'rgb(0, 238, 0)',
+  'green3': 'rgb(0, 205, 0)',
+  'green4': 'rgb(0, 139, 0)',
+  'greenyellow': 'rgb(173, 255, 47)',
+  'grey': 'rgb(190, 190, 190)',
+  'grey0': 'rgb(0, 0, 0)',
+  'grey1': 'rgb(3, 3, 3)',
+  'grey10': 'rgb(26, 26, 26)',
+  'grey100': 'rgb(255, 255, 255)',
+  'grey11': 'rgb(28, 28, 28)',
+  'grey12': 'rgb(31, 31, 31)',
+  'grey13': 'rgb(33, 33, 33)',
+  'grey14': 'rgb(36, 36, 36)',
+  'grey15': 'rgb(38, 38, 38)',
+  'grey16': 'rgb(41, 41, 41)',
+  'grey17': 'rgb(43, 43, 43)',
+  'grey18': 'rgb(46, 46, 46)',
+  'grey19': 'rgb(48, 48, 48)',
+  'grey2': 'rgb(5, 5, 5)',
+  'grey20': 'rgb(51, 51, 51)',
+  'grey21': 'rgb(54, 54, 54)',
+  'grey22': 'rgb(56, 56, 56)',
+  'grey23': 'rgb(59, 59, 59)',
+  'grey24': 'rgb(61, 61, 61)',
+  'grey25': 'rgb(64, 64, 64)',
+  'grey26': 'rgb(66, 66, 66)',
+  'grey27': 'rgb(69, 69, 69)',
+  'grey28': 'rgb(71, 71, 71)',
+  'grey29': 'rgb(74, 74, 74)',
+  'grey3': 'rgb(8, 8, 8)',
+  'grey30': 'rgb(77, 77, 77)',
+  'grey31': 'rgb(79, 79, 79)',
+  'grey32': 'rgb(82, 82, 82)',
+  'grey33': 'rgb(84, 84, 84)',
+  'grey34': 'rgb(87, 87, 87)',
+  'grey35': 'rgb(89, 89, 89)',
+  'grey36': 'rgb(92, 92, 92)',
+  'grey37': 'rgb(94, 94, 94)',
+  'grey38': 'rgb(97, 97, 97)',
+  'grey39': 'rgb(99, 99, 99)',
+  'grey4': 'rgb(10, 10, 10)',
+  'grey40': 'rgb(102, 102, 102)',
+  'grey41': 'rgb(105, 105, 105)',
+  'grey42': 'rgb(107, 107, 107)',
+  'grey43': 'rgb(110, 110, 110)',
+  'grey44': 'rgb(112, 112, 112)',
+  'grey45': 'rgb(115, 115, 115)',
+  'grey46': 'rgb(117, 117, 117)',
+  'grey47': 'rgb(120, 120, 120)',
+  'grey48': 'rgb(122, 122, 122)',
+  'grey49': 'rgb(125, 125, 125)',
+  'grey5': 'rgb(13, 13, 13)',
+  'grey50': 'rgb(127, 127, 127)',
+  'grey51': 'rgb(130, 130, 130)',
+  'grey52': 'rgb(133, 133, 133)',
+  'grey53': 'rgb(135, 135, 135)',
+  'grey54': 'rgb(138, 138, 138)',
+  'grey55': 'rgb(140, 140, 140)',
+  'grey56': 'rgb(143, 143, 143)',
+  'grey57': 'rgb(145, 145, 145)',
+  'grey58': 'rgb(148, 148, 148)',
+  'grey59': 'rgb(150, 150, 150)',
+  'grey6': 'rgb(15, 15, 15)',
+  'grey60': 'rgb(153, 153, 153)',
+  'grey61': 'rgb(156, 156, 156)',
+  'grey62': 'rgb(158, 158, 158)',
+  'grey63': 'rgb(161, 161, 161)',
+  'grey64': 'rgb(163, 163, 163)',
+  'grey65': 'rgb(166, 166, 166)',
+  'grey66': 'rgb(168, 168, 168)',
+  'grey67': 'rgb(171, 171, 171)',
+  'grey68': 'rgb(173, 173, 173)',
+  'grey69': 'rgb(176, 176, 176)',
+  'grey7': 'rgb(18, 18, 18)',
+  'grey70': 'rgb(179, 179, 179)',
+  'grey71': 'rgb(181, 181, 181)',
+  'grey72': 'rgb(184, 184, 184)',
+  'grey73': 'rgb(186, 186, 186)',
+  'grey74': 'rgb(189, 189, 189)',
+  'grey75': 'rgb(191, 191, 191)',
+  'grey76': 'rgb(194, 194, 194)',
+  'grey77': 'rgb(196, 196, 196)',
+  'grey78': 'rgb(199, 199, 199)',
+  'grey79': 'rgb(201, 201, 201)',
+  'grey8': 'rgb(20, 20, 20)',
+  'grey80': 'rgb(204, 204, 204)',
+  'grey81': 'rgb(207, 207, 207)',
+  'grey82': 'rgb(209, 209, 209)',
+  'grey83': 'rgb(212, 212, 212)',
+  'grey84': 'rgb(214, 214, 214)',
+  'grey85': 'rgb(217, 217, 217)',
+  'grey86': 'rgb(219, 219, 219)',
+  'grey87': 'rgb(222, 222, 222)',
+  'grey88': 'rgb(224, 224, 224)',
+  'grey89': 'rgb(227, 227, 227)',
+  'grey9': 'rgb(23, 23, 23)',
+  'grey90': 'rgb(229, 229, 229)',
+  'grey91': 'rgb(232, 232, 232)',
+  'grey92': 'rgb(235, 235, 235)',
+  'grey93': 'rgb(237, 237, 237)',
+  'grey94': 'rgb(240, 240, 240)',
+  'grey95': 'rgb(242, 242, 242)',
+  'grey96': 'rgb(245, 245, 245)',
+  'grey97': 'rgb(247, 247, 247)',
+  'grey98': 'rgb(250, 250, 250)',
+  'grey99': 'rgb(252, 252, 252)',
+  'honeydew': 'rgb(240, 255, 240)',
+  'honeydew1': 'rgb(240, 255, 240)',
+  'honeydew2': 'rgb(224, 238, 224)',
+  'honeydew3': 'rgb(193, 205, 193)',
+  'honeydew4': 'rgb(131, 139, 131)',
+  'hotpink': 'rgb(255, 105, 180)',
+  'hotpink1': 'rgb(255, 110, 180)',
+  'hotpink2': 'rgb(238, 106, 167)',
+  'hotpink3': 'rgb(205, 96, 144)',
+  'hotpink4': 'rgb(139, 58, 98)',
+  'indianred': 'rgb(205, 92, 92)',
+  'indianred1': 'rgb(255, 106, 106)',
+  'indianred2': 'rgb(238, 99, 99)',
+  'indianred3': 'rgb(205, 85, 85)',
+  'indianred4': 'rgb(139, 58, 58)',
+  'ivory': 'rgb(255, 255, 240)',
+  'ivory1': 'rgb(255, 255, 240)',
+  'ivory2': 'rgb(238, 238, 224)',
+  'ivory3': 'rgb(205, 205, 193)',
+  'ivory4': 'rgb(139, 139, 131)',
+  'khaki': 'rgb(240, 230, 140)',
+  'khaki1': 'rgb(255, 246, 143)',
+  'khaki2': 'rgb(238, 230, 133)',
+  'khaki3': 'rgb(205, 198, 115)',
+  'khaki4': 'rgb(139, 134, 78)',
+  'lavender': 'rgb(230, 230, 250)',
+  'lavenderblush': 'rgb(255, 240, 245)',
+  'lavenderblush1': 'rgb(255, 240, 245)',
+  'lavenderblush2': 'rgb(238, 224, 229)',
+  'lavenderblush3': 'rgb(205, 193, 197)',
+  'lavenderblush4': 'rgb(139, 131, 134)',
+  'lawngreen': 'rgb(124, 252, 0)',
+  'lemonchiffon': 'rgb(255, 250, 205)',
+  'lemonchiffon1': 'rgb(255, 250, 205)',
+  'lemonchiffon2': 'rgb(238, 233, 191)',
+  'lemonchiffon3': 'rgb(205, 201, 165)',
+  'lemonchiffon4': 'rgb(139, 137, 112)',
+  'lightblue': 'rgb(173, 216, 230)',
+  'lightblue1': 'rgb(191, 239, 255)',
+  'lightblue2': 'rgb(178, 223, 238)',
+  'lightblue3': 'rgb(154, 192, 205)',
+  'lightblue4': 'rgb(104, 131, 139)',
+  'lightcoral': 'rgb(240, 128, 128)',
+  'lightcyan': 'rgb(224, 255, 255)',
+  'lightcyan1': 'rgb(224, 255, 255)',
+  'lightcyan2': 'rgb(209, 238, 238)',
+  'lightcyan3': 'rgb(180, 205, 205)',
+  'lightcyan4': 'rgb(122, 139, 139)',
+  'lightgoldenrod': 'rgb(238, 221, 130)',
+  'lightgoldenrod1': 'rgb(255, 236, 139)',
+  'lightgoldenrod2': 'rgb(238, 220, 130)',
+  'lightgoldenrod3': 'rgb(205, 190, 112)',
+  'lightgoldenrod4': 'rgb(139, 129, 76)',
+  'lightgoldenrodyellow': 'rgb(250, 250, 210)',
+  'lightgray': 'rgb(211, 211, 211)',
+  'lightgreen': 'rgb(144, 238, 144)',
+  'lightgrey': 'rgb(211, 211, 211)',
+  'lightpink': 'rgb(255, 182, 193)',
+  'lightpink1': 'rgb(255, 174, 185)',
+  'lightpink2': 'rgb(238, 162, 173)',
+  'lightpink3': 'rgb(205, 140, 149)',
+  'lightpink4': 'rgb(139, 95, 101)',
+  'lightsalmon': 'rgb(255, 160, 122)',
+  'lightsalmon1': 'rgb(255, 160, 122)',
+  'lightsalmon2': 'rgb(238, 149, 114)',
+  'lightsalmon3': 'rgb(205, 129, 98)',
+  'lightsalmon4': 'rgb(139, 87, 66)',
+  'lightseagreen': 'rgb(32, 178, 170)',
+  'lightskyblue': 'rgb(135, 206, 250)',
+  'lightskyblue1': 'rgb(176, 226, 255)',
+  'lightskyblue2': 'rgb(164, 211, 238)',
+  'lightskyblue3': 'rgb(141, 182, 205)',
+  'lightskyblue4': 'rgb(96, 123, 139)',
+  'lightslateblue': 'rgb(132, 112, 255)',
+  'lightslategray': 'rgb(119, 136, 153)',
+  'lightslategrey': 'rgb(119, 136, 153)',
+  'lightsteelblue': 'rgb(176, 196, 222)',
+  'lightsteelblue1': 'rgb(202, 225, 255)',
+  'lightsteelblue2': 'rgb(188, 210, 238)',
+  'lightsteelblue3': 'rgb(162, 181, 205)',
+  'lightsteelblue4': 'rgb(110, 123, 139)',
+  'lightyellow': 'rgb(255, 255, 224)',
+  'lightyellow1': 'rgb(255, 255, 224)',
+  'lightyellow2': 'rgb(238, 238, 209)',
+  'lightyellow3': 'rgb(205, 205, 180)',
+  'lightyellow4': 'rgb(139, 139, 122)',
+  'limegreen': 'rgb(50, 205, 50)',
+  'linen': 'rgb(250, 240, 230)',
+  'magenta': 'rgb(255, 0, 255)',
+  'magenta1': 'rgb(255, 0, 255)',
+  'magenta2': 'rgb(238, 0, 238)',
+  'magenta3': 'rgb(205, 0, 205)',
+  'magenta4': 'rgb(139, 0, 139)',
+  'maroon': 'rgb(176, 48, 96)',
+  'maroon1': 'rgb(255, 52, 179)',
+  'maroon2': 'rgb(238, 48, 167)',
+  'maroon3': 'rgb(205, 41, 144)',
+  'maroon4': 'rgb(139, 28, 98)',
+  'mediumaquamarine': 'rgb(102, 205, 170)',
+  'mediumblue': 'rgb(0, 0, 205)',
+  'mediumorchid': 'rgb(186, 85, 211)',
+  'mediumorchid1': 'rgb(224, 102, 255)',
+  'mediumorchid2': 'rgb(209, 95, 238)',
+  'mediumorchid3': 'rgb(180, 82, 205)',
+  'mediumorchid4': 'rgb(122, 55, 139)',
+  'mediumpurple': 'rgb(147, 112, 219)',
+  'mediumpurple1': 'rgb(171, 130, 255)',
+  'mediumpurple2': 'rgb(159, 121, 238)',
+  'mediumpurple3': 'rgb(137, 104, 205)',
+  'mediumpurple4': 'rgb(93, 71, 139)',
+  'mediumseagreen': 'rgb(60, 179, 113)',
+  'mediumslateblue': 'rgb(123, 104, 238)',
+  'mediumspringgreen': 'rgb(0, 250, 154)',
+  'mediumturquoise': 'rgb(72, 209, 204)',
+  'mediumvioletred': 'rgb(199, 21, 133)',
+  'midnightblue': 'rgb(25, 25, 112)',
+  'mintcream': 'rgb(245, 255, 250)',
+  'mistyrose': 'rgb(255, 228, 225)',
+  'mistyrose1': 'rgb(255, 228, 225)',
+  'mistyrose2': 'rgb(238, 213, 210)',
+  'mistyrose3': 'rgb(205, 183, 181)',
+  'mistyrose4': 'rgb(139, 125, 123)',
+  'moccasin': 'rgb(255, 228, 181)',
+  'navajowhite': 'rgb(255, 222, 173)',
+  'navajowhite1': 'rgb(255, 222, 173)',
+  'navajowhite2': 'rgb(238, 207, 161)',
+  'navajowhite3': 'rgb(205, 179, 139)',
+  'navajowhite4': 'rgb(139, 121, 94)',
+  'navy': 'rgb(0, 0, 128)',
+  'navyblue': 'rgb(0, 0, 128)',
+  'oldlace': 'rgb(253, 245, 230)',
+  'olivedrab': 'rgb(107, 142, 35)',
+  'olivedrab1': 'rgb(192, 255, 62)',
+  'olivedrab2': 'rgb(179, 238, 58)',
+  'olivedrab3': 'rgb(154, 205, 50)',
+  'olivedrab4': 'rgb(105, 139, 34)',
+  'orange': 'rgb(255, 165, 0)',
+  'orange1': 'rgb(255, 165, 0)',
+  'orange2': 'rgb(238, 154, 0)',
+  'orange3': 'rgb(205, 133, 0)',
+  'orange4': 'rgb(139, 90, 0)',
+  'orangered': 'rgb(255, 69, 0)',
+  'orangered1': 'rgb(255, 69, 0)',
+  'orangered2': 'rgb(238, 64, 0)',
+  'orangered3': 'rgb(205, 55, 0)',
+  'orangered4': 'rgb(139, 37, 0)',
+  'orchid': 'rgb(218, 112, 214)',
+  'orchid1': 'rgb(255, 131, 250)',
+  'orchid2': 'rgb(238, 122, 233)',
+  'orchid3': 'rgb(205, 105, 201)',
+  'orchid4': 'rgb(139, 71, 137)',
+  'palegoldenrod': 'rgb(238, 232, 170)',
+  'palegreen': 'rgb(152, 251, 152)',
+  'palegreen1': 'rgb(154, 255, 154)',
+  'palegreen2': 'rgb(144, 238, 144)',
+  'palegreen3': 'rgb(124, 205, 124)',
+  'palegreen4': 'rgb(84, 139, 84)',
+  'paleturquoise': 'rgb(175, 238, 238)',
+  'paleturquoise1': 'rgb(187, 255, 255)',
+  'paleturquoise2': 'rgb(174, 238, 238)',
+  'paleturquoise3': 'rgb(150, 205, 205)',
+  'paleturquoise4': 'rgb(102, 139, 139)',
+  'palevioletred': 'rgb(219, 112, 147)',
+  'palevioletred1': 'rgb(255, 130, 171)',
+  'palevioletred2': 'rgb(238, 121, 159)',
+  'palevioletred3': 'rgb(205, 104, 137)',
+  'palevioletred4': 'rgb(139, 71, 93)',
+  'papayawhip': 'rgb(255, 239, 213)',
+  'peachpuff': 'rgb(255, 218, 185)',
+  'peachpuff1': 'rgb(255, 218, 185)',
+  'peachpuff2': 'rgb(238, 203, 173)',
+  'peachpuff3': 'rgb(205, 175, 149)',
+  'peachpuff4': 'rgb(139, 119, 101)',
+  'peru': 'rgb(205, 133, 63)',
+  'pink': 'rgb(255, 192, 203)',
+  'pink1': 'rgb(255, 181, 197)',
+  'pink2': 'rgb(238, 169, 184)',
+  'pink3': 'rgb(205, 145, 158)',
+  'pink4': 'rgb(139, 99, 108)',
+  'plum': 'rgb(221, 160, 221)',
+  'plum1': 'rgb(255, 187, 255)',
+  'plum2': 'rgb(238, 174, 238)',
+  'plum3': 'rgb(205, 150, 205)',
+  'plum4': 'rgb(139, 102, 139)',
+  'powderblue': 'rgb(176, 224, 230)',
+  'purple': 'rgb(160, 32, 240)',
+  'purple1': 'rgb(155, 48, 255)',
+  'purple2': 'rgb(145, 44, 238)',
+  'purple3': 'rgb(125, 38, 205)',
+  'purple4': 'rgb(85, 26, 139)',
+  'red': 'rgb(255, 0, 0)',
+  'red1': 'rgb(255, 0, 0)',
+  'red2': 'rgb(238, 0, 0)',
+  'red3': 'rgb(205, 0, 0)',
+  'red4': 'rgb(139, 0, 0)',
+  'rosybrown': 'rgb(188, 143, 143)',
+  'rosybrown1': 'rgb(255, 193, 193)',
+  'rosybrown2': 'rgb(238, 180, 180)',
+  'rosybrown3': 'rgb(205, 155, 155)',
+  'rosybrown4': 'rgb(139, 105, 105)',
+  'royalblue': 'rgb(65, 105, 225)',
+  'royalblue1': 'rgb(72, 118, 255)',
+  'royalblue2': 'rgb(67, 110, 238)',
+  'royalblue3': 'rgb(58, 95, 205)',
+  'royalblue4': 'rgb(39, 64, 139)',
+  'saddlebrown': 'rgb(139, 69, 19)',
+  'salmon': 'rgb(250, 128, 114)',
+  'salmon1': 'rgb(255, 140, 105)',
+  'salmon2': 'rgb(238, 130, 98)',
+  'salmon3': 'rgb(205, 112, 84)',
+  'salmon4': 'rgb(139, 76, 57)',
+  'sandybrown': 'rgb(244, 164, 96)',
+  'seagreen': 'rgb(46, 139, 87)',
+  'seagreen1': 'rgb(84, 255, 159)',
+  'seagreen2': 'rgb(78, 238, 148)',
+  'seagreen3': 'rgb(67, 205, 128)',
+  'seagreen4': 'rgb(46, 139, 87)',
+  'seashell': 'rgb(255, 245, 238)',
+  'seashell1': 'rgb(255, 245, 238)',
+  'seashell2': 'rgb(238, 229, 222)',
+  'seashell3': 'rgb(205, 197, 191)',
+  'seashell4': 'rgb(139, 134, 130)',
+  'sienna': 'rgb(160, 82, 45)',
+  'sienna1': 'rgb(255, 130, 71)',
+  'sienna2': 'rgb(238, 121, 66)',
+  'sienna3': 'rgb(205, 104, 57)',
+  'sienna4': 'rgb(139, 71, 38)',
+  'skyblue': 'rgb(135, 206, 235)',
+  'skyblue1': 'rgb(135, 206, 255)',
+  'skyblue2': 'rgb(126, 192, 238)',
+  'skyblue3': 'rgb(108, 166, 205)',
+  'skyblue4': 'rgb(74, 112, 139)',
+  'slateblue': 'rgb(106, 90, 205)',
+  'slateblue1': 'rgb(131, 111, 255)',
+  'slateblue2': 'rgb(122, 103, 238)',
+  'slateblue3': 'rgb(105, 89, 205)',
+  'slateblue4': 'rgb(71, 60, 139)',
+  'slategray': 'rgb(112, 128, 144)',
+  'slategray1': 'rgb(198, 226, 255)',
+  'slategray2': 'rgb(185, 211, 238)',
+  'slategray3': 'rgb(159, 182, 205)',
+  'slategray4': 'rgb(108, 123, 139)',
+  'slategrey': 'rgb(112, 128, 144)',
+  'snow': 'rgb(255, 250, 250)',
+  'snow1': 'rgb(255, 250, 250)',
+  'snow2': 'rgb(238, 233, 233)',
+  'snow3': 'rgb(205, 201, 201)',
+  'snow4': 'rgb(139, 137, 137)',
+  'springgreen': 'rgb(0, 255, 127)',
+  'springgreen1': 'rgb(0, 255, 127)',
+  'springgreen2': 'rgb(0, 238, 118)',
+  'springgreen3': 'rgb(0, 205, 102)',
+  'springgreen4': 'rgb(0, 139, 69)',
+  'steelblue': 'rgb(70, 130, 180)',
+  'steelblue1': 'rgb(99, 184, 255)',
+  'steelblue2': 'rgb(92, 172, 238)',
+  'steelblue3': 'rgb(79, 148, 205)',
+  'steelblue4': 'rgb(54, 100, 139)',
+  'tan': 'rgb(210, 180, 140)',
+  'tan1': 'rgb(255, 165, 79)',
+  'tan2': 'rgb(238, 154, 73)',
+  'tan3': 'rgb(205, 133, 63)',
+  'tan4': 'rgb(139, 90, 43)',
+  'thistle': 'rgb(216, 191, 216)',
+  'thistle1': 'rgb(255, 225, 255)',
+  'thistle2': 'rgb(238, 210, 238)',
+  'thistle3': 'rgb(205, 181, 205)',
+  'thistle4': 'rgb(139, 123, 139)',
+  'tomato': 'rgb(255, 99, 71)',
+  'tomato1': 'rgb(255, 99, 71)',
+  'tomato2': 'rgb(238, 92, 66)',
+  'tomato3': 'rgb(205, 79, 57)',
+  'tomato4': 'rgb(139, 54, 38)',
+  'turquoise': 'rgb(64, 224, 208)',
+  'turquoise1': 'rgb(0, 245, 255)',
+  'turquoise2': 'rgb(0, 229, 238)',
+  'turquoise3': 'rgb(0, 197, 205)',
+  'turquoise4': 'rgb(0, 134, 139)',
+  'violet': 'rgb(238, 130, 238)',
+  'violetred': 'rgb(208, 32, 144)',
+  'violetred1': 'rgb(255, 62, 150)',
+  'violetred2': 'rgb(238, 58, 140)',
+  'violetred3': 'rgb(205, 50, 120)',
+  'violetred4': 'rgb(139, 34, 82)',
+  'wheat': 'rgb(245, 222, 179)',
+  'wheat1': 'rgb(255, 231, 186)',
+  'wheat2': 'rgb(238, 216, 174)',
+  'wheat3': 'rgb(205, 186, 150)',
+  'wheat4': 'rgb(139, 126, 102)',
+  'white': 'rgb(255, 255, 255)',
+  'whitesmoke': 'rgb(245, 245, 245)',
+  'yellow': 'rgb(255, 255, 0)',
+  'yellow1': 'rgb(255, 255, 0)',
+  'yellow2': 'rgb(238, 238, 0)',
+  'yellow3': 'rgb(205, 205, 0)',
+  'yellow4': 'rgb(139, 139, 0)',
+  'yellowgreen': 'rgb(154, 205, 50)'
 };
 // SOURCE FILE: libdot/js/lib_f.js
 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
@@ -1316,19 +1322,20 @@
  */
 lib.f.replaceVars = function(str, vars) {
   return str.replace(/%([a-z]*)\(([^\)]+)\)/gi, function(match, fn, varname) {
-      if (typeof vars[varname] == 'undefined')
-        throw 'Unknown variable: ' + varname;
+    if (typeof vars[varname] == 'undefined')
+      throw 'Unknown variable: ' + varname;
 
-      var rv = vars[varname];
+    var rv = vars[varname];
 
-      if (fn in lib.f.replaceVars.functions) {
-        rv = lib.f.replaceVars.functions[fn](rv);
-      } else if (fn) {
-        throw 'Unknown escape function: ' + fn;
-      }
+    if (fn in lib.f.replaceVars.functions) {
+      rv = lib.f.replaceVars.functions[fn](rv);
+    }
+    else if (fn) {
+      throw 'Unknown escape function: ' + fn;
+    }
 
-      return rv;
-    });
+    return rv;
+  });
 };
 
 /**
@@ -1348,7 +1355,9 @@
       "'": '&#39;'
     };
 
-    return str.replace(/[<>&\"\']/g, function(m) { return map[m] });
+    return str.replace(/[<>&\"\']/g, function(m) {
+      return map[m];
+    });
   }
 };
 
@@ -1361,10 +1370,11 @@
 lib.f.getAcceptLanguages = function(callback) {
   if (lib.f.getAcceptLanguages.chromeSupported()) {
     chrome.i18n.getAcceptLanguages(callback);
-  } else {
+  }
+  else {
     setTimeout(function() {
-        callback([navigator.language.replace(/-/g, '_')]);
-      }, 0);
+      callback([navigator.language.replace(/-/g, '_')]);
+    }, 0);
   }
 };
 
@@ -1481,7 +1491,7 @@
   return f.whitespace.substr(0, length);
 };
 
- /**
+/**
  * Ensure that a function is called within a certain time limit.
  *
  * Simple usage looks like this...
@@ -1571,7 +1581,8 @@
 
   try {
     throw new Error();
-  } catch (ex) {
+  }
+  catch (ex) {
     stackArray = ex.stack.split('\n');
   }
 
@@ -1594,12 +1605,13 @@
  * @param {number} denominator
  * @return {number}
  */
-lib.f.smartFloorDivide = function(numerator,  denominator) {
+lib.f.smartFloorDivide = function(numerator, denominator) {
   var val = numerator / denominator;
   var ceiling = Math.ceil(val);
   if (ceiling - val < .0001) {
     return ceiling;
-  } else {
+  }
+  else {
     return Math.floor(val);
   }
 };
@@ -1626,7 +1638,9 @@
  */
 lib.MessageManager = function(languages) {
   this.languages_ = languages.map(
-      function(el) { return el.replace(/-/g, '_') });
+    function(el) {
+      return el.replace(/-/g, '_');
+    });
 
   if (this.languages_.indexOf('en') == -1)
     this.languages_.unshift('en');
@@ -1646,13 +1660,14 @@
 
     if (!def.placeholders) {
       this.messages[key] = def.message;
-    } else {
+    }
+    else {
       // Replace "$NAME$" placeholders with "$1", etc.
       this.messages[key] = def.message.replace(
-          /\$([a-z][^\s\$]+)\$/ig,
-          function(m, name) {
-            return defs[key].placeholders[name.toLowerCase()].content;
-          });
+        /\$([a-z][^\s\$]+)\$/ig,
+        function(m, name) {
+          return defs[key].placeholders[name.toLowerCase()].content;
+        });
     }
   }
 };
@@ -1668,7 +1683,7 @@
  *     loaded.
  */
 lib.MessageManager.prototype.findAndLoadMessages = function(
-    pattern, onComplete) {
+  pattern, onComplete) {
   var languages = this.languages_.concat();
   var loaded = [];
   var failed = [];
@@ -1676,21 +1691,23 @@
   function onLanguageComplete(state) {
     if (state) {
       loaded = languages.shift();
-    } else {
+    }
+    else {
       failed = languages.shift();
     }
 
     if (languages.length) {
       tryNextLanguage();
-    } else {
+    }
+    else {
       onComplete(loaded, failed);
     }
   }
 
   var tryNextLanguage = function() {
     this.loadMessages(this.replaceReferences(pattern, languages),
-                      onLanguageComplete.bind(this, true),
-                      onLanguageComplete.bind(this, false));
+      onLanguageComplete.bind(this, true),
+      onLanguageComplete.bind(this, false));
   }.bind(this);
 
   tryNextLanguage();
@@ -1700,7 +1717,7 @@
  * Load messages from a messages.json file.
  */
 lib.MessageManager.prototype.loadMessages = function(
-    url, onSuccess, opt_onError) {
+  url, onSuccess, opt_onError) {
   var xhr = new XMLHttpRequest();
 
   xhr.onloadend = function() {
@@ -1726,16 +1743,16 @@
  * @param {Array} args Array containing the argument values.
  */
 lib.MessageManager.replaceReferences = function(msg, args) {
-  return msg.replace(/\$(\d+)/g, function (m, index) {
-      return args[index - 1];
-    });
+  return msg.replace(/\$(\d+)/g, function(m, index) {
+    return args[index - 1];
+  });
 };
 
 /**
  * Per-instance copy of replaceReferences.
  */
 lib.MessageManager.prototype.replaceReferences =
-    lib.MessageManager.replaceReferences;
+  lib.MessageManager.replaceReferences;
 
 /**
  * Get a message by name, optionally replacing arguments too.
@@ -1751,7 +1768,8 @@
   if (msgname in this.messages) {
     message = this.messages[msgname];
 
-  } else {
+  }
+  else {
     if (window.chrome.i18n)
       message = chrome.i18n.getMessage(msgname);
 
@@ -1793,7 +1811,9 @@
 lib.MessageManager.prototype.processI18nAttributes = function(dom) {
   // Convert the "lower-and-dashes" attribute names into
   // "UPPER_AND_UNDER" style.
-  function thunk(str) { return str.replace(/-/g, '_').toUpperCase() }
+  function thunk(str) {
+    return str.replace(/-/g, '_').toUpperCase();
+  }
 
   var nodes = dom.querySelectorAll('[i18n]');
 
@@ -1806,9 +1826,10 @@
 
     try {
       i18n = JSON.parse(i18n);
-    } catch (ex) {
+    }
+    catch (ex) {
       console.error('Can\'t parse ' + node.tagName + '#' + node.id + ': ' +
-                    i18n);
+        i18n);
       throw ex;
     }
 
@@ -1820,7 +1841,8 @@
       var msg = this.get(msgname);
       if (key == '_') {
         node.textContent = msg;
-      } else {
+      }
+      else {
         node.setAttribute(key, msg);
       }
     }
@@ -1913,7 +1935,7 @@
  * A local copy of the DEFAULT_VALUE constant to make it less verbose.
  */
 lib.PreferenceManager.Record.prototype.DEFAULT_VALUE =
-    lib.PreferenceManager.prototype.DEFAULT_VALUE;
+  lib.PreferenceManager.prototype.DEFAULT_VALUE;
 
 /**
  * Register a callback to be invoked when this preference changes.
@@ -2011,32 +2033,34 @@
   }
 
   var keys = Object.keys(this.prefRecords_).map(
-      function(el) { return this.prefix + el }.bind(this));
+    function(el) {
+      return this.prefix + el;
+    }.bind(this));
 
   if (this.trace)
     console.log('Preferences read: ' + this.prefix);
 
   this.storage.getItems(keys, function(items) {
-      var prefixLength = this.prefix.length;
+    var prefixLength = this.prefix.length;
 
-      for (var key in items) {
-        var value = items[key];
-        var name = key.substr(prefixLength);
-        var needSync = (name in this.childLists_ &&
-                        (JSON.stringify(value) !=
-                         JSON.stringify(this.prefRecords_[name].currentValue)));
+    for (var key in items) {
+      var value = items[key];
+      var name = key.substr(prefixLength);
+      var needSync = (name in this.childLists_ &&
+        (JSON.stringify(value) !=
+          JSON.stringify(this.prefRecords_[name].currentValue)));
 
-        this.prefRecords_[name].currentValue = value;
+      this.prefRecords_[name].currentValue = value;
 
-        if (needSync) {
-          pendingChildren++;
-          this.syncChildList(name, onChildComplete);
-        }
+      if (needSync) {
+        pendingChildren++;
+        this.syncChildList(name, onChildComplete);
       }
+    }
 
-      if (pendingChildren == 0 && opt_callback)
-        setTimeout(opt_callback);
-    }.bind(this));
+    if (pendingChildren == 0 && opt_callback)
+      setTimeout(opt_callback);
+  }.bind(this));
 };
 
 /**
@@ -2055,14 +2079,15 @@
  *     PreferenceManager as parameters.
  */
 lib.PreferenceManager.prototype.definePreference = function(
-    name, value, opt_onChange) {
+  name, value, opt_onChange) {
 
   var record = this.prefRecords_[name];
   if (record) {
     this.changeDefault(name, value);
-  } else {
+  }
+  else {
     record = this.prefRecords_[name] =
-        new lib.PreferenceManager.Record(name, value);
+      new lib.PreferenceManager.Record(name, value);
   }
 
   if (opt_onChange)
@@ -2101,11 +2126,11 @@
  *     preferences.
  */
 lib.PreferenceManager.prototype.defineChildren = function(
-    listName, childFactory) {
+  listName, childFactory) {
 
   // Define a preference to hold the ordered list of child ids.
   this.definePreference(listName, [],
-                        this.onChildListChange_.bind(this, listName));
+    this.onChildListChange_.bind(this, listName));
   this.childFactories_[listName] = childFactory;
   this.childLists_[listName] = {};
 };
@@ -2183,7 +2208,7 @@
  * @param {string} opt_id Optional id to override the generated id.
  */
 lib.PreferenceManager.prototype.createChild = function(listName, opt_hint,
-                                                       opt_id) {
+  opt_id) {
   var ids = this.get(listName);
   var id;
 
@@ -2192,7 +2217,8 @@
     if (ids.indexOf(id) != -1)
       throw new Error('Duplicate child: ' + listName + ': ' + id);
 
-  } else {
+  }
+  else {
     // Pick a random, unique 4-digit hex identifier for the new profile.
     while (!id || ids.indexOf(id) != -1) {
       id = Math.floor(Math.random() * 0xffff + 1).toString(16);
@@ -2292,7 +2318,8 @@
   for (var i = 0; i < a.length; i++) {
     if (b.indexOf(a[i]) != -1) {
       rv.common[a[i]] = true;
-    } else {
+    }
+    else {
       rv.added[a[i]] = true;
     }
   }
@@ -2320,9 +2347,10 @@
  *     is complete.
  */
 lib.PreferenceManager.prototype.syncChildList = function(
-    listName, opt_callback) {
+  listName, opt_callback) {
 
   var pendingChildren = 0;
+
   function onChildStorage() {
     if (--pendingChildren == 0 && opt_callback)
       opt_callback();
@@ -2408,7 +2436,7 @@
   }
 
   var keys = Object.keys(this.prefRecords_).map(function(el) {
-      return this.prefix + el;
+    return this.prefix + el;
   }.bind(this));
 
   this.storage.removeItems(keys);
@@ -2432,7 +2460,7 @@
 lib.PreferenceManager.prototype.diff = function(a, b) {
   // If the types are different, or the type is not a simple primitive one.
   if ((typeof a) !== (typeof b) ||
-      !(/^(undefined|boolean|number|string)$/.test(typeof a))) {
+    !(/^(undefined|boolean|number|string)$/.test(typeof a))) {
     return true;
   }
 
@@ -2507,7 +2535,8 @@
   if (this.diff(record.defaultValue, newValue)) {
     record.currentValue = newValue;
     this.storage.setItem(this.prefix + name, newValue);
-  } else {
+  }
+  else {
     record.currentValue = this.DEFAULT_VALUE;
     this.storage.removeItem(this.prefix + name);
   }
@@ -2550,10 +2579,14 @@
       var childIds = this.get(name);
       for (var i = 0; i < childIds.length; i++) {
         var id = childIds[i];
-        rv[name].push({id: id, json: this.getChild(name, id).exportAsJson()});
+        rv[name].push({
+          id: id,
+          json: this.getChild(name, id).exportAsJson()
+        });
       }
 
-    } else {
+    }
+    else {
       var record = this.prefRecords_[name];
       if (record.currentValue != this.DEFAULT_VALUE)
         rv[name] = record.currentValue;
@@ -2582,7 +2615,8 @@
         childPrefManager.importFromJson(childList[i].json);
       }
 
-    } else {
+    }
+    else {
       this.set(name, json[name]);
     }
   }
@@ -2622,7 +2656,8 @@
     if (this.diff(currentValue, newValue)) {
       if (typeof newValue == 'undefined') {
         record.currentValue = record.DEFAULT_VALUE;
-      } else {
+      }
+      else {
         record.currentValue = newValue;
       }
 
@@ -2895,8 +2930,8 @@
     return;
 
   // IE throws an exception if JSON.parse is given an empty string.
-  var prevValue = e.oldValue ? JSON.parse(e.oldValue) : "";
-  var curValue = e.newValue ? JSON.parse(e.newValue) : "";
+  var prevValue = e.oldValue ? JSON.parse(e.oldValue) : '';
+  var curValue = e.newValue ? JSON.parse(e.newValue) : '';
   var o = {};
   o[e.key] = {
     oldValue: prevValue,
@@ -2955,7 +2990,8 @@
   if (typeof value == 'string') {
     try {
       value = JSON.parse(value);
-    } catch (e) {
+    }
+    catch (e) {
       // If we can't parse the value, just return it unparsed.
     }
   }
@@ -2979,11 +3015,13 @@
     if (typeof value == 'string') {
       try {
         rv[key] = JSON.parse(value);
-      } catch (e) {
+      }
+      catch (e) {
         // If we can't parse the value, just return it unparsed.
         rv[key] = value;
       }
-    } else {
+    }
+    else {
       keys.splice(i, 1);
     }
   }
@@ -3005,7 +3043,7 @@
   this.storage_.setItem(key, JSON.stringify(value));
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3022,7 +3060,7 @@
   }
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3037,7 +3075,7 @@
   this.storage_.removeItem(key);
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3054,7 +3092,7 @@
   }
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 // SOURCE FILE: libdot/js/lib_storage_memory.js
 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
@@ -3102,7 +3140,10 @@
 lib.Storage.Memory.prototype.clear = function(opt_callback) {
   var e = {};
   for (var key in this.storage_) {
-    e[key] = {oldValue: this.storage_[key], newValue: (void 0)};
+    e[key] = {
+      oldValue: this.storage_[key],
+      newValue: (void 0)
+    };
   }
 
   this.storage_ = {};
@@ -3130,7 +3171,8 @@
   if (typeof value == 'string') {
     try {
       value = JSON.parse(value);
-    } catch (e) {
+    }
+    catch (e) {
       // If we can't parse the value, just return it unparsed.
     }
   }
@@ -3154,11 +3196,13 @@
     if (typeof value == 'string') {
       try {
         rv[key] = JSON.parse(value);
-      } catch (e) {
+      }
+      catch (e) {
         // If we can't parse the value, just return it unparsed.
         rv[key] = value;
       }
-    } else {
+    }
+    else {
       keys.splice(i, 1);
     }
   }
@@ -3181,7 +3225,10 @@
   this.storage_[key] = JSON.stringify(value);
 
   var e = {};
-  e[key] = {oldValue: oldValue, newValue: value};
+  e[key] = {
+    oldValue: oldValue,
+    newValue: value
+  };
 
   setTimeout(function() {
     for (var i = 0; i < this.observers_.length; i++) {
@@ -3190,7 +3237,7 @@
   }.bind(this), 0);
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3205,7 +3252,10 @@
   var e = {};
 
   for (var key in obj) {
-    e[key] = {oldValue: this.storage_[key], newValue: obj[key]};
+    e[key] = {
+      oldValue: this.storage_[key],
+      newValue: obj[key]
+    };
     this.storage_[key] = JSON.stringify(obj[key]);
   }
 
@@ -3216,7 +3266,7 @@
   }.bind(this));
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3231,7 +3281,7 @@
   delete this.storage_[key];
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 
 /**
@@ -3248,7 +3298,7 @@
   }
 
   if (opt_callback)
-  setTimeout(opt_callback, 0);
+    setTimeout(opt_callback, 0);
 };
 // SOURCE FILE: libdot/js/lib_test_manager.js
 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
@@ -3284,7 +3334,7 @@
  */
 lib.TestManager = function(opt_log) {
   this.log = opt_log || new lib.TestManager.Log();
-}
+};
 
 /**
  * Create a new test run object for this test manager.
@@ -3383,7 +3433,8 @@
 lib.TestManager.Log.prototype.print = function(str) {
   if (this.pending_) {
     this.pending_ += str;
-  } else {
+  }
+  else {
     this.pending_ = this.prefix_ + str;
   }
 };
@@ -3487,7 +3538,9 @@
   ctor.getTestList = lib.TestManager.Suite.getTestList;
   ctor.testList_ = [];
   ctor.testMap_ = {};
-  ctor.prototype = { __proto__: lib.TestManager.Suite.prototype };
+  ctor.prototype = {
+    __proto__: lib.TestManager.Suite.prototype
+  };
 
   lib.TestManager.Suite.subclasses.push(ctor);
 
@@ -3675,9 +3728,9 @@
 lib.TestManager.Test.prototype.run = function(result) {
   try {
     // Tests are applied to the parent lib.TestManager.Suite subclass.
-    this.testFunction_.apply(result.suite,
-                             [result, result.testRun.cx]);
-  } catch (ex) {
+    this.testFunction_.apply(result.suite, [result, result.testRun.cx]);
+  }
+  catch (ex) {
     if (ex instanceof lib.TestManager.Result.TestComplete)
       return;
 
@@ -3686,7 +3739,8 @@
     if (ex.stack) {
       if (ex.stack instanceof Array) {
         result.println(ex.stack.join('\n'));
-      } else {
+      }
+      else {
         result.println(ex.stack);
       }
     }
@@ -3782,7 +3836,7 @@
 };
 
 lib.TestManager.TestRun.prototype.selectSuite = function(
-    suiteClass, opt_pattern) {
+  suiteClass, opt_pattern) {
   var pattern = opt_pattern || this.ALL_TESTS;
   var selectCount = 0;
   var testList = suiteClass.getTestList();
@@ -3795,7 +3849,8 @@
       if (pattern instanceof RegExp) {
         if (!pattern.test(test.testName))
           continue;
-      } else if (test.testName != pattern) {
+      }
+      else if (test.testName != pattern) {
         continue;
       }
     }
@@ -3825,7 +3880,7 @@
 
   for (var i = 0; i < lib.TestManager.Suite.subclasses.length; i++) {
     selectCount += this.selectSuite(lib.TestManager.Suite.subclasses[i],
-                                    pattern);
+      pattern);
   }
 
   if (!selectCount) {
@@ -3840,10 +3895,10 @@
  * that would otherwise go uncaught.
  */
 lib.TestManager.TestRun.prototype.onUncaughtException_ = function(
-    message, file, line) {
+  message, file, line) {
 
   if (message.indexOf('Uncaught lib.TestManager.Result.TestComplete') == 0 ||
-      message.indexOf('status: passed') != -1) {
+    message.indexOf('status: passed') != -1) {
     // This is a result.pass() or result.fail() call from a callback.  We're
     // already going to deal with it as part of the completeTest_() call
     // that raised it.  We can safely squelch this error message.
@@ -3864,7 +3919,7 @@
     when = 'after';
 
   this.log.println('Uncaught exception ' + when + ' test case: ' +
-                   this.currentResult.test.fullName);
+    this.currentResult.test.fullName);
   this.log.println(message + ', ' + file + ':' + line);
 
   this.currentResult.completeTest_(this.currentResult.FAILED, false);
@@ -3884,7 +3939,7 @@
  *     this function.
  */
 lib.TestManager.TestRun.prototype.onTestRunComplete_ = function(
-    opt_skipTimeout) {
+  opt_skipTimeout) {
   if (!opt_skipTimeout) {
     // The final test may have left a lingering setTimeout(..., 0), or maybe
     // poked at the DOM in a way that will trigger a event to fire at the end
@@ -3898,8 +3953,8 @@
 
   this.log.popPrefix();
   this.log.println('} ' + this.passes.length + ' passed, ' +
-                   this.failures.length + ' failed, '  +
-                   this.msToSeconds_(this.duration));
+    this.failures.length + ' failed, ' +
+    this.msToSeconds_(this.duration));
   this.log.println('');
 
   this.summarize();
@@ -3919,25 +3974,28 @@
   try {
     this.testManager.testPostamble(result, this.cx);
     result.suite.postamble(result, this.ctx);
-  } catch (ex) {
+  }
+  catch (ex) {
     this.log.println('Unexpected exception in postamble: ' +
-                     (ex.stack ? ex.stack : ex));
+      (ex.stack ? ex.stack : ex));
     this.panic = true;
   }
 
   this.log.popPrefix();
   this.log.print('} ' + result.status + ', ' +
-                 this.msToSeconds_(result.duration));
+    this.msToSeconds_(result.duration));
   this.log.flush();
 
   if (result.status == result.FAILED) {
     this.failures.push(result);
     this.currentSuite = null;
-  } else if (result.status == result.PASSED) {
+  }
+  else if (result.status == result.PASSED) {
     this.passes.push(result);
-  } else {
+  }
+  else {
     this.log.println('Unknown result status: ' + result.test.fullName + ': ' +
-                     result.status);
+      result.status);
     return this.panic = true;
   }
 
@@ -3964,9 +4022,9 @@
  *     time around.
  */
 lib.TestManager.TestRun.prototype.onResultReComplete = function(
-    result, lateStatus) {
+  result, lateStatus) {
   this.log.println('Late complete for test: ' + result.test.fullName + ': ' +
-                   lateStatus);
+    lateStatus);
 
   // Consider any late completion a failure, even if it's a double-pass, since
   // it's a misuse of the testing API.
@@ -4000,7 +4058,8 @@
       this.log.println('Initializing suite: ' + test.suiteClass.suiteName);
       suite = new test.suiteClass(this.testManager, this.cx);
     }
-  } catch (ex) {
+  }
+  catch (ex) {
     // If test suite setup fails we're not even going to try to run the tests.
     this.log.println('Exception during setup: ' + (ex.stack ? ex.stack : ex));
     this.panic = true;
@@ -4017,9 +4076,10 @@
     suite.preamble(this.currentResult, this.cx);
 
     this.testQueue_.shift();
-  } catch (ex) {
+  }
+  catch (ex) {
     this.log.println('Unexpected exception during test preamble: ' +
-                     (ex.stack ? ex.stack : ex));
+      (ex.stack ? ex.stack : ex));
     this.log.popPrefix();
     this.log.println('}');
 
@@ -4030,11 +4090,12 @@
 
   try {
     this.currentResult.run();
-  } catch (ex) {
+  }
+  catch (ex) {
     // Result.run() should catch test exceptions and turn them into failures.
     // If we got here, it means there is trouble in the testing framework.
     this.log.println('Unexpected exception during test run: ' +
-                     (ex.stack ? ex.stack : ex));
+      (ex.stack ? ex.stack : ex));
     this.panic = true;
   }
 };
@@ -4086,7 +4147,7 @@
 
   if (this.testQueue_.length) {
     this.log.println('Test run incomplete: ' + this.testQueue_.length +
-                     ' test(s) were not run.');
+      ' test(s) were not run.');
   }
 };
 
@@ -4147,8 +4208,8 @@
  * Possible values for this.status.
  */
 lib.TestManager.Result.prototype.PENDING = 'pending';
-lib.TestManager.Result.prototype.FAILED  = 'FAILED';
-lib.TestManager.Result.prototype.PASSED  = 'passed';
+lib.TestManager.Result.prototype.FAILED = 'FAILED';
+lib.TestManager.Result.prototype.PASSED = 'passed';
 
 /**
  * Exception thrown when a test completes (pass or fail), to ensure no more of
@@ -4160,8 +4221,8 @@
 
 lib.TestManager.Result.TestComplete.prototype.toString = function() {
   return 'lib.TestManager.Result.TestComplete: ' + this.result.test.fullName +
-      ', status: ' + this.result.status;
-}
+    ', status: ' + this.result.status;
+};
 
 /**
  * Start the test associated with this result.
@@ -4240,7 +4301,8 @@
     this.status = status;
 
     this.testRun.onResultComplete(this);
-  } else {
+  }
+  else {
     this.testRun.onResultReComplete(this, status);
   }
 
@@ -4280,19 +4342,22 @@
  *     of the caller.
  */
 lib.TestManager.Result.prototype.assertEQ = function(
-    actual, expected, opt_name) {
+  actual, expected, opt_name) {
   // Utility function to pretty up the log.
   function format(value) {
     if (typeof value == 'number')
       return value;
 
     var str = String(value);
-    var ary = str.split('\n').map(function (e) { return JSON.stringify(e) });
+    var ary = str.split('\n').map(function(e) {
+      return JSON.stringify(e);
+    });
     if (ary.length > 1) {
       // If the string has newlines, start it off on its own line so that
       // it's easier to compare against another string with newlines.
       return '\n' + ary.join('\n');
-    } else {
+    }
+    else {
       return ary.join('\n');
     }
   }
@@ -4308,7 +4373,7 @@
   var name = opt_name ? '[' + opt_name + ']' : '';
 
   this.fail('assertEQ' + name + ': ' + this.getCallerLocation_(1) + ': ' +
-            format(actual) + ' !== ' + format(expected));
+    format(actual) + ' !== ' + format(expected));
 };
 
 /**
@@ -4332,7 +4397,7 @@
   var name = opt_name ? '[' + opt_name + ']' : '';
 
   this.fail('assert' + name + ': ' + this.getCallerLocation_(1) + ': ' +
-            String(actual));
+    String(actual));
 };
 
 /**
@@ -4348,7 +4413,8 @@
 lib.TestManager.Result.prototype.getCallerLocation_ = function(frameIndex) {
   try {
     throw new Error();
-  } catch (ex) {
+  }
+  catch (ex) {
     var frame = ex.stack.split('\n')[frameIndex + 2];
     var ary = frame.match(/([^/]+:\d+):\d+\)?$/);
     return ary ? ary[1] : '???';
@@ -4425,30 +4491,37 @@
     if (this.bytesLeft == 0) {
       if (c <= 0x7F) {
         ret += str.charAt(i);
-      } else if (0xC0 <= c && c <= 0xDF) {
+      }
+      else if (0xC0 <= c && c <= 0xDF) {
         this.codePoint = c - 0xC0;
         this.bytesLeft = 1;
         this.lowerBound = 0x80;
-      } else if (0xE0 <= c && c <= 0xEF) {
+      }
+      else if (0xE0 <= c && c <= 0xEF) {
         this.codePoint = c - 0xE0;
         this.bytesLeft = 2;
         this.lowerBound = 0x800;
-      } else if (0xF0 <= c && c <= 0xF7) {
+      }
+      else if (0xF0 <= c && c <= 0xF7) {
         this.codePoint = c - 0xF0;
         this.bytesLeft = 3;
         this.lowerBound = 0x10000;
-      } else if (0xF8 <= c && c <= 0xFB) {
+      }
+      else if (0xF8 <= c && c <= 0xFB) {
         this.codePoint = c - 0xF8;
         this.bytesLeft = 4;
         this.lowerBound = 0x200000;
-      } else if (0xFC <= c && c <= 0xFD) {
+      }
+      else if (0xFC <= c && c <= 0xFD) {
         this.codePoint = c - 0xFC;
         this.bytesLeft = 5;
         this.lowerBound = 0x4000000;
-      } else {
-        ret += '\ufffd';
       }
-    } else {
+      else {
+        ret += '�';
+      }
+    }
+    else {
       if (0x80 <= c && c <= 0xBF) {
         this.bytesLeft--;
         this.codePoint = (this.codePoint << 6) + (c - 0x80);
@@ -4456,15 +4529,17 @@
           // Got a full sequence. Check if it's within bounds and
           // filter out surrogate pairs.
           var codePoint = this.codePoint;
-          if (codePoint < this.lowerBound
-              || (0xD800 <= codePoint && codePoint <= 0xDFFF)
-              || codePoint > 0x10FFFF) {
-            ret += '\ufffd';
-          } else {
+          if (codePoint < this.lowerBound ||
+            (0xD800 <= codePoint && codePoint <= 0xDFFF) ||
+            codePoint > 0x10FFFF) {
+            ret += '�';
+          }
+          else {
             // Encode as UTF-16 in the output.
             if (codePoint < 0x10000) {
               ret += String.fromCharCode(codePoint);
-            } else {
+            }
+            else {
               // Surrogate pair.
               codePoint -= 0x10000;
               ret += String.fromCharCode(
@@ -4473,10 +4548,11 @@
             }
           }
         }
-      } else {
+      }
+      else {
         // Too few bytes in multi-byte sequence. Rewind stream so we
         // don't lose the next byte.
-        ret += '\ufffd';
+        ret += '�';
         this.bytesLeft = 0;
         i--;
       }
@@ -4516,17 +4592,20 @@
     var c = str.charCodeAt(i);
     if (0xDC00 <= c && c <= 0xDFFF) {
       c = 0xFFFD;
-    } else if (0xD800 <= c && c <= 0xDBFF) {
-      if (i+1 < str.length) {
-        var d = str.charCodeAt(i+1);
+    }
+    else if (0xD800 <= c && c <= 0xDBFF) {
+      if (i + 1 < str.length) {
+        var d = str.charCodeAt(i + 1);
         if (0xDC00 <= d && d <= 0xDFFF) {
           // Swallow a surrogate pair.
           c = 0x10000 + ((c & 0x3FF) << 10) + (d & 0x3FF);
           i++;
-        } else {
+        }
+        else {
           c = 0xFFFD;
         }
-      } else {
+      }
+      else {
         c = 0xFFFD;
       }
     }
@@ -4536,13 +4615,16 @@
     if (c <= 0x7F) {
       ret += str.charAt(i);
       continue;
-    } else if (c <= 0x7FF) {
+    }
+    else if (c <= 0x7FF) {
       ret += String.fromCharCode(0xC0 | (c >>> 6));
       bytesLeft = 1;
-    } else if (c <= 0xFFFF) {
+    }
+    else if (c <= 0xFFFF) {
       ret += String.fromCharCode(0xE0 | (c >>> 12));
       bytesLeft = 2;
-    } else /* if (c <= 0x10FFFF) */ {
+    }
+    else /* if (c <= 0x10FFFF) */ {
       ret += String.fromCharCode(0xF0 | (c >>> 18));
       bytesLeft = 3;
     }
@@ -4700,7 +4782,8 @@
         'configurable': true,
         'writable': true
       });
-    } else {
+    }
+    else {
       String.prototype.codePointAt = codePointAt;
     }
   }());
@@ -4723,111 +4806,309 @@
 // Sorted list of non-overlapping intervals of non-spacing characters
 // generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c"
 lib.wc.combining = [
-    [ 0x0300, 0x036F ], [ 0x0483, 0x0486 ], [ 0x0488, 0x0489 ],
-    [ 0x0591, 0x05BD ], [ 0x05BF, 0x05BF ], [ 0x05C1, 0x05C2 ],
-    [ 0x05C4, 0x05C5 ], [ 0x05C7, 0x05C7 ], [ 0x0600, 0x0603 ],
-    [ 0x0610, 0x0615 ], [ 0x064B, 0x065E ], [ 0x0670, 0x0670 ],
-    [ 0x06D6, 0x06E4 ], [ 0x06E7, 0x06E8 ], [ 0x06EA, 0x06ED ],
-    [ 0x070F, 0x070F ], [ 0x0711, 0x0711 ], [ 0x0730, 0x074A ],
-    [ 0x07A6, 0x07B0 ], [ 0x07EB, 0x07F3 ], [ 0x0901, 0x0902 ],
-    [ 0x093C, 0x093C ], [ 0x0941, 0x0948 ], [ 0x094D, 0x094D ],
-    [ 0x0951, 0x0954 ], [ 0x0962, 0x0963 ], [ 0x0981, 0x0981 ],
-    [ 0x09BC, 0x09BC ], [ 0x09C1, 0x09C4 ], [ 0x09CD, 0x09CD ],
-    [ 0x09E2, 0x09E3 ], [ 0x0A01, 0x0A02 ], [ 0x0A3C, 0x0A3C ],
-    [ 0x0A41, 0x0A42 ], [ 0x0A47, 0x0A48 ], [ 0x0A4B, 0x0A4D ],
-    [ 0x0A70, 0x0A71 ], [ 0x0A81, 0x0A82 ], [ 0x0ABC, 0x0ABC ],
-    [ 0x0AC1, 0x0AC5 ], [ 0x0AC7, 0x0AC8 ], [ 0x0ACD, 0x0ACD ],
-    [ 0x0AE2, 0x0AE3 ], [ 0x0B01, 0x0B01 ], [ 0x0B3C, 0x0B3C ],
-    [ 0x0B3F, 0x0B3F ], [ 0x0B41, 0x0B43 ], [ 0x0B4D, 0x0B4D ],
-    [ 0x0B56, 0x0B56 ], [ 0x0B82, 0x0B82 ], [ 0x0BC0, 0x0BC0 ],
-    [ 0x0BCD, 0x0BCD ], [ 0x0C3E, 0x0C40 ], [ 0x0C46, 0x0C48 ],
-    [ 0x0C4A, 0x0C4D ], [ 0x0C55, 0x0C56 ], [ 0x0CBC, 0x0CBC ],
-    [ 0x0CBF, 0x0CBF ], [ 0x0CC6, 0x0CC6 ], [ 0x0CCC, 0x0CCD ],
-    [ 0x0CE2, 0x0CE3 ], [ 0x0D41, 0x0D43 ], [ 0x0D4D, 0x0D4D ],
-    [ 0x0DCA, 0x0DCA ], [ 0x0DD2, 0x0DD4 ], [ 0x0DD6, 0x0DD6 ],
-    [ 0x0E31, 0x0E31 ], [ 0x0E34, 0x0E3A ], [ 0x0E47, 0x0E4E ],
-    [ 0x0EB1, 0x0EB1 ], [ 0x0EB4, 0x0EB9 ], [ 0x0EBB, 0x0EBC ],
-    [ 0x0EC8, 0x0ECD ], [ 0x0F18, 0x0F19 ], [ 0x0F35, 0x0F35 ],
-    [ 0x0F37, 0x0F37 ], [ 0x0F39, 0x0F39 ], [ 0x0F71, 0x0F7E ],
-    [ 0x0F80, 0x0F84 ], [ 0x0F86, 0x0F87 ], [ 0x0F90, 0x0F97 ],
-    [ 0x0F99, 0x0FBC ], [ 0x0FC6, 0x0FC6 ], [ 0x102D, 0x1030 ],
-    [ 0x1032, 0x1032 ], [ 0x1036, 0x1037 ], [ 0x1039, 0x1039 ],
-    [ 0x1058, 0x1059 ], [ 0x1160, 0x11FF ], [ 0x135F, 0x135F ],
-    [ 0x1712, 0x1714 ], [ 0x1732, 0x1734 ], [ 0x1752, 0x1753 ],
-    [ 0x1772, 0x1773 ], [ 0x17B4, 0x17B5 ], [ 0x17B7, 0x17BD ],
-    [ 0x17C6, 0x17C6 ], [ 0x17C9, 0x17D3 ], [ 0x17DD, 0x17DD ],
-    [ 0x180B, 0x180D ], [ 0x18A9, 0x18A9 ], [ 0x1920, 0x1922 ],
-    [ 0x1927, 0x1928 ], [ 0x1932, 0x1932 ], [ 0x1939, 0x193B ],
-    [ 0x1A17, 0x1A18 ], [ 0x1B00, 0x1B03 ], [ 0x1B34, 0x1B34 ],
-    [ 0x1B36, 0x1B3A ], [ 0x1B3C, 0x1B3C ], [ 0x1B42, 0x1B42 ],
-    [ 0x1B6B, 0x1B73 ], [ 0x1DC0, 0x1DCA ], [ 0x1DFE, 0x1DFF ],
-    [ 0x200B, 0x200F ], [ 0x202A, 0x202E ], [ 0x2060, 0x2063 ],
-    [ 0x206A, 0x206F ], [ 0x20D0, 0x20EF ], [ 0x302A, 0x302F ],
-    [ 0x3099, 0x309A ], [ 0xA806, 0xA806 ], [ 0xA80B, 0xA80B ],
-    [ 0xA825, 0xA826 ], [ 0xFB1E, 0xFB1E ], [ 0xFE00, 0xFE0F ],
-    [ 0xFE20, 0xFE23 ], [ 0xFEFF, 0xFEFF ], [ 0xFFF9, 0xFFFB ],
-    [ 0x10A01, 0x10A03 ], [ 0x10A05, 0x10A06 ], [ 0x10A0C, 0x10A0F ],
-    [ 0x10A38, 0x10A3A ], [ 0x10A3F, 0x10A3F ], [ 0x1D167, 0x1D169 ],
-    [ 0x1D173, 0x1D182 ], [ 0x1D185, 0x1D18B ], [ 0x1D1AA, 0x1D1AD ],
-    [ 0x1D242, 0x1D244 ], [ 0xE0001, 0xE0001 ], [ 0xE0020, 0xE007F ],
-    [ 0xE0100, 0xE01EF ]
+  [0x0300, 0x036F],
+  [0x0483, 0x0486],
+  [0x0488, 0x0489],
+  [0x0591, 0x05BD],
+  [0x05BF, 0x05BF],
+  [0x05C1, 0x05C2],
+  [0x05C4, 0x05C5],
+  [0x05C7, 0x05C7],
+  [0x0600, 0x0603],
+  [0x0610, 0x0615],
+  [0x064B, 0x065E],
+  [0x0670, 0x0670],
+  [0x06D6, 0x06E4],
+  [0x06E7, 0x06E8],
+  [0x06EA, 0x06ED],
+  [0x070F, 0x070F],
+  [0x0711, 0x0711],
+  [0x0730, 0x074A],
+  [0x07A6, 0x07B0],
+  [0x07EB, 0x07F3],
+  [0x0901, 0x0902],
+  [0x093C, 0x093C],
+  [0x0941, 0x0948],
+  [0x094D, 0x094D],
+  [0x0951, 0x0954],
+  [0x0962, 0x0963],
+  [0x0981, 0x0981],
+  [0x09BC, 0x09BC],
+  [0x09C1, 0x09C4],
+  [0x09CD, 0x09CD],
+  [0x09E2, 0x09E3],
+  [0x0A01, 0x0A02],
+  [0x0A3C, 0x0A3C],
+  [0x0A41, 0x0A42],
+  [0x0A47, 0x0A48],
+  [0x0A4B, 0x0A4D],
+  [0x0A70, 0x0A71],
+  [0x0A81, 0x0A82],
+  [0x0ABC, 0x0ABC],
+  [0x0AC1, 0x0AC5],
+  [0x0AC7, 0x0AC8],
+  [0x0ACD, 0x0ACD],
+  [0x0AE2, 0x0AE3],
+  [0x0B01, 0x0B01],
+  [0x0B3C, 0x0B3C],
+  [0x0B3F, 0x0B3F],
+  [0x0B41, 0x0B43],
+  [0x0B4D, 0x0B4D],
+  [0x0B56, 0x0B56],
+  [0x0B82, 0x0B82],
+  [0x0BC0, 0x0BC0],
+  [0x0BCD, 0x0BCD],
+  [0x0C3E, 0x0C40],
+  [0x0C46, 0x0C48],
+  [0x0C4A, 0x0C4D],
+  [0x0C55, 0x0C56],
+  [0x0CBC, 0x0CBC],
+  [0x0CBF, 0x0CBF],
+  [0x0CC6, 0x0CC6],
+  [0x0CCC, 0x0CCD],
+  [0x0CE2, 0x0CE3],
+  [0x0D41, 0x0D43],
+  [0x0D4D, 0x0D4D],
+  [0x0DCA, 0x0DCA],
+  [0x0DD2, 0x0DD4],
+  [0x0DD6, 0x0DD6],
+  [0x0E31, 0x0E31],
+  [0x0E34, 0x0E3A],
+  [0x0E47, 0x0E4E],
+  [0x0EB1, 0x0EB1],
+  [0x0EB4, 0x0EB9],
+  [0x0EBB, 0x0EBC],
+  [0x0EC8, 0x0ECD],
+  [0x0F18, 0x0F19],
+  [0x0F35, 0x0F35],
+  [0x0F37, 0x0F37],
+  [0x0F39, 0x0F39],
+  [0x0F71, 0x0F7E],
+  [0x0F80, 0x0F84],
+  [0x0F86, 0x0F87],
+  [0x0F90, 0x0F97],
+  [0x0F99, 0x0FBC],
+  [0x0FC6, 0x0FC6],
+  [0x102D, 0x1030],
+  [0x1032, 0x1032],
+  [0x1036, 0x1037],
+  [0x1039, 0x1039],
+  [0x1058, 0x1059],
+  [0x1160, 0x11FF],
+  [0x135F, 0x135F],
+  [0x1712, 0x1714],
+  [0x1732, 0x1734],
+  [0x1752, 0x1753],
+  [0x1772, 0x1773],
+  [0x17B4, 0x17B5],
+  [0x17B7, 0x17BD],
+  [0x17C6, 0x17C6],
+  [0x17C9, 0x17D3],
+  [0x17DD, 0x17DD],
+  [0x180B, 0x180D],
+  [0x18A9, 0x18A9],
+  [0x1920, 0x1922],
+  [0x1927, 0x1928],
+  [0x1932, 0x1932],
+  [0x1939, 0x193B],
+  [0x1A17, 0x1A18],
+  [0x1B00, 0x1B03],
+  [0x1B34, 0x1B34],
+  [0x1B36, 0x1B3A],
+  [0x1B3C, 0x1B3C],
+  [0x1B42, 0x1B42],
+  [0x1B6B, 0x1B73],
+  [0x1DC0, 0x1DCA],
+  [0x1DFE, 0x1DFF],
+  [0x200B, 0x200F],
+  [0x202A, 0x202E],
+  [0x2060, 0x2063],
+  [0x206A, 0x206F],
+  [0x20D0, 0x20EF],
+  [0x302A, 0x302F],
+  [0x3099, 0x309A],
+  [0xA806, 0xA806],
+  [0xA80B, 0xA80B],
+  [0xA825, 0xA826],
+  [0xFB1E, 0xFB1E],
+  [0xFE00, 0xFE0F],
+  [0xFE20, 0xFE23],
+  [0xFEFF, 0xFEFF],
+  [0xFFF9, 0xFFFB],
+  [0x10A01, 0x10A03],
+  [0x10A05, 0x10A06],
+  [0x10A0C, 0x10A0F],
+  [0x10A38, 0x10A3A],
+  [0x10A3F, 0x10A3F],
+  [0x1D167, 0x1D169],
+  [0x1D173, 0x1D182],
+  [0x1D185, 0x1D18B],
+  [0x1D1AA, 0x1D1AD],
+  [0x1D242, 0x1D244],
+  [0xE0001, 0xE0001],
+  [0xE0020, 0xE007F],
+  [0xE0100, 0xE01EF]
 ];
 
 // Sorted list of non-overlapping intervals of East Asian Ambiguous characters
 // generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c"
 lib.wc.ambiguous = [
-    [ 0x00A1, 0x00A1 ], [ 0x00A4, 0x00A4 ], [ 0x00A7, 0x00A8 ],
-    [ 0x00AA, 0x00AA ], [ 0x00AE, 0x00AE ], [ 0x00B0, 0x00B4 ],
-    [ 0x00B6, 0x00BA ], [ 0x00BC, 0x00BF ], [ 0x00C6, 0x00C6 ],
-    [ 0x00D0, 0x00D0 ], [ 0x00D7, 0x00D8 ], [ 0x00DE, 0x00E1 ],
-    [ 0x00E6, 0x00E6 ], [ 0x00E8, 0x00EA ], [ 0x00EC, 0x00ED ],
-    [ 0x00F0, 0x00F0 ], [ 0x00F2, 0x00F3 ], [ 0x00F7, 0x00FA ],
-    [ 0x00FC, 0x00FC ], [ 0x00FE, 0x00FE ], [ 0x0101, 0x0101 ],
-    [ 0x0111, 0x0111 ], [ 0x0113, 0x0113 ], [ 0x011B, 0x011B ],
-    [ 0x0126, 0x0127 ], [ 0x012B, 0x012B ], [ 0x0131, 0x0133 ],
-    [ 0x0138, 0x0138 ], [ 0x013F, 0x0142 ], [ 0x0144, 0x0144 ],
-    [ 0x0148, 0x014B ], [ 0x014D, 0x014D ], [ 0x0152, 0x0153 ],
-    [ 0x0166, 0x0167 ], [ 0x016B, 0x016B ], [ 0x01CE, 0x01CE ],
-    [ 0x01D0, 0x01D0 ], [ 0x01D2, 0x01D2 ], [ 0x01D4, 0x01D4 ],
-    [ 0x01D6, 0x01D6 ], [ 0x01D8, 0x01D8 ], [ 0x01DA, 0x01DA ],
-    [ 0x01DC, 0x01DC ], [ 0x0251, 0x0251 ], [ 0x0261, 0x0261 ],
-    [ 0x02C4, 0x02C4 ], [ 0x02C7, 0x02C7 ], [ 0x02C9, 0x02CB ],
-    [ 0x02CD, 0x02CD ], [ 0x02D0, 0x02D0 ], [ 0x02D8, 0x02DB ],
-    [ 0x02DD, 0x02DD ], [ 0x02DF, 0x02DF ], [ 0x0391, 0x03A1 ],
-    [ 0x03A3, 0x03A9 ], [ 0x03B1, 0x03C1 ], [ 0x03C3, 0x03C9 ],
-    [ 0x0401, 0x0401 ], [ 0x0410, 0x044F ], [ 0x0451, 0x0451 ],
-    [ 0x2010, 0x2010 ], [ 0x2013, 0x2016 ], [ 0x2018, 0x2019 ],
-    [ 0x201C, 0x201D ], [ 0x2020, 0x2022 ], [ 0x2024, 0x2027 ],
-    [ 0x2030, 0x2030 ], [ 0x2032, 0x2033 ], [ 0x2035, 0x2035 ],
-    [ 0x203B, 0x203B ], [ 0x203E, 0x203E ], [ 0x2074, 0x2074 ],
-    [ 0x207F, 0x207F ], [ 0x2081, 0x2084 ], [ 0x20AC, 0x20AC ],
-    [ 0x2103, 0x2103 ], [ 0x2105, 0x2105 ], [ 0x2109, 0x2109 ],
-    [ 0x2113, 0x2113 ], [ 0x2116, 0x2116 ], [ 0x2121, 0x2122 ],
-    [ 0x2126, 0x2126 ], [ 0x212B, 0x212B ], [ 0x2153, 0x2154 ],
-    [ 0x215B, 0x215E ], [ 0x2160, 0x216B ], [ 0x2170, 0x2179 ],
-    [ 0x2190, 0x2199 ], [ 0x21B8, 0x21B9 ], [ 0x21D2, 0x21D2 ],
-    [ 0x21D4, 0x21D4 ], [ 0x21E7, 0x21E7 ], [ 0x2200, 0x2200 ],
-    [ 0x2202, 0x2203 ], [ 0x2207, 0x2208 ], [ 0x220B, 0x220B ],
-    [ 0x220F, 0x220F ], [ 0x2211, 0x2211 ], [ 0x2215, 0x2215 ],
-    [ 0x221A, 0x221A ], [ 0x221D, 0x2220 ], [ 0x2223, 0x2223 ],
-    [ 0x2225, 0x2225 ], [ 0x2227, 0x222C ], [ 0x222E, 0x222E ],
-    [ 0x2234, 0x2237 ], [ 0x223C, 0x223D ], [ 0x2248, 0x2248 ],
-    [ 0x224C, 0x224C ], [ 0x2252, 0x2252 ], [ 0x2260, 0x2261 ],
-    [ 0x2264, 0x2267 ], [ 0x226A, 0x226B ], [ 0x226E, 0x226F ],
-    [ 0x2282, 0x2283 ], [ 0x2286, 0x2287 ], [ 0x2295, 0x2295 ],
-    [ 0x2299, 0x2299 ], [ 0x22A5, 0x22A5 ], [ 0x22BF, 0x22BF ],
-    [ 0x2312, 0x2312 ], [ 0x2460, 0x24E9 ], [ 0x24EB, 0x254B ],
-    [ 0x2550, 0x2573 ], [ 0x2580, 0x258F ], [ 0x2592, 0x2595 ],
-    [ 0x25A0, 0x25A1 ], [ 0x25A3, 0x25A9 ], [ 0x25B2, 0x25B3 ],
-    [ 0x25B6, 0x25B7 ], [ 0x25BC, 0x25BD ], [ 0x25C0, 0x25C1 ],
-    [ 0x25C6, 0x25C8 ], [ 0x25CB, 0x25CB ], [ 0x25CE, 0x25D1 ],
-    [ 0x25E2, 0x25E5 ], [ 0x25EF, 0x25EF ], [ 0x2605, 0x2606 ],
-    [ 0x2609, 0x2609 ], [ 0x260E, 0x260F ], [ 0x2614, 0x2615 ],
-    [ 0x261C, 0x261C ], [ 0x261E, 0x261E ], [ 0x2640, 0x2640 ],
-    [ 0x2642, 0x2642 ], [ 0x2660, 0x2661 ], [ 0x2663, 0x2665 ],
-    [ 0x2667, 0x266A ], [ 0x266C, 0x266D ], [ 0x266F, 0x266F ],
-    [ 0x273D, 0x273D ], [ 0x2776, 0x277F ], [ 0xE000, 0xF8FF ],
-    [ 0xFFFD, 0xFFFD ], [ 0xF0000, 0xFFFFD ], [ 0x100000, 0x10FFFD ]
+  [0x00A1, 0x00A1],
+  [0x00A4, 0x00A4],
+  [0x00A7, 0x00A8],
+  [0x00AA, 0x00AA],
+  [0x00AE, 0x00AE],
+  [0x00B0, 0x00B4],
+  [0x00B6, 0x00BA],
+  [0x00BC, 0x00BF],
+  [0x00C6, 0x00C6],
+  [0x00D0, 0x00D0],
+  [0x00D7, 0x00D8],
+  [0x00DE, 0x00E1],
+  [0x00E6, 0x00E6],
+  [0x00E8, 0x00EA],
+  [0x00EC, 0x00ED],
+  [0x00F0, 0x00F0],
+  [0x00F2, 0x00F3],
+  [0x00F7, 0x00FA],
+  [0x00FC, 0x00FC],
+  [0x00FE, 0x00FE],
+  [0x0101, 0x0101],
+  [0x0111, 0x0111],
+  [0x0113, 0x0113],
+  [0x011B, 0x011B],
+  [0x0126, 0x0127],
+  [0x012B, 0x012B],
+  [0x0131, 0x0133],
+  [0x0138, 0x0138],
+  [0x013F, 0x0142],
+  [0x0144, 0x0144],
+  [0x0148, 0x014B],
+  [0x014D, 0x014D],
+  [0x0152, 0x0153],
+  [0x0166, 0x0167],
+  [0x016B, 0x016B],
+  [0x01CE, 0x01CE],
+  [0x01D0, 0x01D0],
+  [0x01D2, 0x01D2],
+  [0x01D4, 0x01D4],
+  [0x01D6, 0x01D6],
+  [0x01D8, 0x01D8],
+  [0x01DA, 0x01DA],
+  [0x01DC, 0x01DC],
+  [0x0251, 0x0251],
+  [0x0261, 0x0261],
+  [0x02C4, 0x02C4],
+  [0x02C7, 0x02C7],
+  [0x02C9, 0x02CB],
+  [0x02CD, 0x02CD],
+  [0x02D0, 0x02D0],
+  [0x02D8, 0x02DB],
+  [0x02DD, 0x02DD],
+  [0x02DF, 0x02DF],
+  [0x0391, 0x03A1],
+  [0x03A3, 0x03A9],
+  [0x03B1, 0x03C1],
+  [0x03C3, 0x03C9],
+  [0x0401, 0x0401],
+  [0x0410, 0x044F],
+  [0x0451, 0x0451],
+  [0x2010, 0x2010],
+  [0x2013, 0x2016],
+  [0x2018, 0x2019],
+  [0x201C, 0x201D],
+  [0x2020, 0x2022],
+  [0x2024, 0x2027],
+  [0x2030, 0x2030],
+  [0x2032, 0x2033],
+  [0x2035, 0x2035],
+  [0x203B, 0x203B],
+  [0x203E, 0x203E],
+  [0x2074, 0x2074],
+  [0x207F, 0x207F],
+  [0x2081, 0x2084],
+  [0x20AC, 0x20AC],
+  [0x2103, 0x2103],
+  [0x2105, 0x2105],
+  [0x2109, 0x2109],
+  [0x2113, 0x2113],
+  [0x2116, 0x2116],
+  [0x2121, 0x2122],
+  [0x2126, 0x2126],
+  [0x212B, 0x212B],
+  [0x2153, 0x2154],
+  [0x215B, 0x215E],
+  [0x2160, 0x216B],
+  [0x2170, 0x2179],
+  [0x2190, 0x2199],
+  [0x21B8, 0x21B9],
+  [0x21D2, 0x21D2],
+  [0x21D4, 0x21D4],
+  [0x21E7, 0x21E7],
+  [0x2200, 0x2200],
+  [0x2202, 0x2203],
+  [0x2207, 0x2208],
+  [0x220B, 0x220B],
+  [0x220F, 0x220F],
+  [0x2211, 0x2211],
+  [0x2215, 0x2215],
+  [0x221A, 0x221A],
+  [0x221D, 0x2220],
+  [0x2223, 0x2223],
+  [0x2225, 0x2225],
+  [0x2227, 0x222C],
+  [0x222E, 0x222E],
+  [0x2234, 0x2237],
+  [0x223C, 0x223D],
+  [0x2248, 0x2248],
+  [0x224C, 0x224C],
+  [0x2252, 0x2252],
+  [0x2260, 0x2261],
+  [0x2264, 0x2267],
+  [0x226A, 0x226B],
+  [0x226E, 0x226F],
+  [0x2282, 0x2283],
+  [0x2286, 0x2287],
+  [0x2295, 0x2295],
+  [0x2299, 0x2299],
+  [0x22A5, 0x22A5],
+  [0x22BF, 0x22BF],
+  [0x2312, 0x2312],
+  [0x2460, 0x24E9],
+  [0x24EB, 0x254B],
+  [0x2550, 0x2573],
+  [0x2580, 0x258F],
+  [0x2592, 0x2595],
+  [0x25A0, 0x25A1],
+  [0x25A3, 0x25A9],
+  [0x25B2, 0x25B3],
+  [0x25B6, 0x25B7],
+  [0x25BC, 0x25BD],
+  [0x25C0, 0x25C1],
+  [0x25C6, 0x25C8],
+  [0x25CB, 0x25CB],
+  [0x25CE, 0x25D1],
+  [0x25E2, 0x25E5],
+  [0x25EF, 0x25EF],
+  [0x2605, 0x2606],
+  [0x2609, 0x2609],
+  [0x260E, 0x260F],
+  [0x2614, 0x2615],
+  [0x261C, 0x261C],
+  [0x261E, 0x261E],
+  [0x2640, 0x2640],
+  [0x2642, 0x2642],
+  [0x2660, 0x2661],
+  [0x2663, 0x2665],
+  [0x2667, 0x266A],
+  [0x266C, 0x266D],
+  [0x266F, 0x266F],
+  [0x273D, 0x273D],
+  [0x2776, 0x277F],
+  [0xE000, 0xF8FF],
+  [0xFFFD, 0xFFFD],
+  [0xF0000, 0xFFFFD],
+  [0x100000, 0x10FFFD]
 ];
 
 /**
@@ -4840,7 +5121,8 @@
  */
 lib.wc.isSpace = function(ucs) {
   // Auxiliary function for binary search in interval table.
-  var min = 0, max = lib.wc.combining.length - 1;
+  var min = 0,
+    max = lib.wc.combining.length - 1;
   var mid;
 
   if (ucs < lib.wc.combining[0][0] || ucs > lib.wc.combining[max][1])
@@ -4849,9 +5131,11 @@
     mid = Math.floor((min + max) / 2);
     if (ucs > lib.wc.combining[mid][1]) {
       min = mid + 1;
-    } else if (ucs < lib.wc.combining[mid][0]) {
+    }
+    else if (ucs < lib.wc.combining[mid][0]) {
       max = mid - 1;
-    } else {
+    }
+    else {
       return true;
     }
   }
@@ -4869,7 +5153,8 @@
  * character.
  */
 lib.wc.isCjkAmbiguous = function(ucs) {
-  var min = 0, max = lib.wc.ambiguous.length - 1;
+  var min = 0,
+    max = lib.wc.ambiguous.length - 1;
   var mid;
 
   if (ucs < lib.wc.ambiguous[0][0] || ucs > lib.wc.ambiguous[max][1])
@@ -4878,9 +5163,11 @@
     mid = Math.floor((min + max) / 2);
     if (ucs > lib.wc.ambiguous[mid][1]) {
       min = mid + 1;
-    } else if (ucs < lib.wc.ambiguous[mid][0]) {
+    }
+    else if (ucs < lib.wc.ambiguous[mid][0]) {
       max = mid - 1;
-    } else {
+    }
+    else {
       return true;
     }
   }
@@ -4898,7 +5185,8 @@
 lib.wc.charWidth = function(ucs) {
   if (lib.wc.regardCjkAmbiguous) {
     return lib.wc.charWidthRegardAmbiguous(ucs);
-  } else {
+  }
+  else {
     return lib.wc.charWidthDisregardAmbiguous(ucs);
   }
 };
@@ -4929,18 +5217,18 @@
   // If we arrive here, ucs is not a combining or C0/C1 control character.
   return 1 +
     (ucs >= 0x1100 &&
-     (ucs <= 0x115f ||             // Hangul Jamo init. consonants
-      ucs == 0x2329 || ucs == 0x232a ||
-      (ucs >= 0x2e80 && ucs <= 0xa4cf &&
-       ucs != 0x303f) ||           // CJK ... Yi
-      (ucs >= 0xac00 && ucs <= 0xd7a3) ||  // Hangul Syllables
-      (ucs >= 0xf900 && ucs <= 0xfaff) ||  // CJK Compatibility Ideographs
-      (ucs >= 0xfe10 && ucs <= 0xfe19) ||  // Vertical forms
-      (ucs >= 0xfe30 && ucs <= 0xfe6f) ||  // CJK Compatibility Forms
-      (ucs >= 0xff00 && ucs <= 0xff60) ||  // Fullwidth Forms
-      (ucs >= 0xffe0 && ucs <= 0xffe6) ||
-      (ucs >= 0x20000 && ucs <= 0x2fffd) ||
-      (ucs >= 0x30000 && ucs <= 0x3fffd)));
+      (ucs <= 0x115f || // Hangul Jamo init. consonants
+        ucs == 0x2329 || ucs == 0x232a ||
+        (ucs >= 0x2e80 && ucs <= 0xa4cf &&
+          ucs != 0x303f) || // CJK ... Yi
+        (ucs >= 0xac00 && ucs <= 0xd7a3) || // Hangul Syllables
+        (ucs >= 0xf900 && ucs <= 0xfaff) || // CJK Compatibility Ideographs
+        (ucs >= 0xfe10 && ucs <= 0xfe19) || // Vertical forms
+        (ucs >= 0xfe30 && ucs <= 0xfe6f) || // CJK Compatibility Forms
+        (ucs >= 0xff00 && ucs <= 0xff60) || // Fullwidth Forms
+        (ucs >= 0xffe0 && ucs <= 0xffe6) ||
+        (ucs >= 0x20000 && ucs <= 0x2fffd) ||
+        (ucs >= 0x30000 && ucs <= 0x3fffd)));
   // TODO: emoji characters usually require space for wide characters although
   // East Asian width spec says nothing. Should we add special cases for them?
 };
@@ -5001,9 +5289,7 @@
   }
 
   if (opt_width != undefined) {
-    for (endIndex = startIndex, width = 0;
-         endIndex < str.length && width < opt_width;
-         width += lib.wc.charWidth(str.charCodeAt(endIndex)), endIndex++);
+    for (endIndex = startIndex, width = 0; endIndex < str.length && width < opt_width; width += lib.wc.charWidth(str.charCodeAt(endIndex)), endIndex++);
     if (width > opt_width)
       endIndex--;
     return str.substring(startIndex, endIndex);
@@ -5025,13 +5311,13 @@
   return lib.wc.substr(str, start, end - start);
 };
 lib.resource.add('libdot/changelog/version', 'text/plain',
-'1.11' +
-''
+  '1.11' +
+  ''
 );
 
 lib.resource.add('libdot/changelog/date', 'text/plain',
-'2017-04-17' +
-''
+  '2017-04-17' +
+  ''
 );
 
 // SOURCE FILE: hterm/js/hterm.js
@@ -5073,7 +5359,7 @@
  * This is only displayed when the 'enable-clipboard-notice' preference
  * is enabled.
  */
-hterm.notifyCopyMessage = '\u2702';
+hterm.notifyCopyMessage = '✂';
 
 
 /**
@@ -5081,7 +5367,7 @@
  * bell.  \u226a is a unicode EIGHTH NOTE, %(title) will
  * be replaced by the terminal title.
  */
-hterm.desktopNotificationTitle = '\u266A %(title) \u266A';
+hterm.desktopNotificationTitle = '♪ %(title) ♪';
 
 /**
  * List of known hterm test suites.
@@ -5089,8 +5375,9 @@
  * A test harness should ensure that they all exist before running.
  */
 hterm.testDeps = ['hterm.ScrollPort.Tests', 'hterm.Screen.Tests',
-                  'hterm.Terminal.Tests', 'hterm.VT.Tests',
-                  'hterm.VT.CannedTests'];
+  'hterm.Terminal.Tests', 'hterm.VT.Tests',
+  'hterm.VT.CannedTests'
+];
 
 /**
  * The hterm init function, registered with lib.registerInit().
@@ -5109,7 +5396,8 @@
   function onTab(tab) {
     if (tab && window.chrome) {
       chrome.windows.get(tab.windowId, null, onWindow);
-    } else {
+    }
+    else {
       // TODO(rginda): This is where we end up for a v1 app's background page.
       // Maybe windowType = 'none' would be more appropriate, or something.
       hterm.windowType = 'normal';
@@ -5121,9 +5409,10 @@
     var ary = navigator.userAgent.match(/\sChrome\/(\d\d)/);
     var version = ary ? parseInt(ary[1]) : -1;
     if (window.chrome && chrome.storage && chrome.storage.sync &&
-        version > 21) {
+      version > 21) {
       hterm.defaultStorage = new lib.Storage.Chrome(chrome.storage.sync);
-    } else {
+    }
+    else {
       hterm.defaultStorage = new lib.Storage.Local();
     }
   }
@@ -5138,14 +5427,20 @@
 
   if (isPackagedApp) {
     // Packaged apps are never displayed in browser tabs.
-    setTimeout(onWindow.bind(null, {type: 'popup'}), 0);
-  } else {
+    setTimeout(onWindow.bind(null, {
+      type: 'popup'
+    }), 0);
+  }
+  else {
     if (window.chrome && chrome.tabs) {
       // The getCurrent method gets the tab that is "currently running", not the
       // topmost or focused tab.
       chrome.tabs.getCurrent(onTab);
-    } else {
-      setTimeout(onWindow.bind(null, {type: 'normal'}), 0);
+    }
+    else {
+      setTimeout(onWindow.bind(null, {
+        type: 'normal'
+      }), 0);
     }
   }
 });
@@ -5179,7 +5474,8 @@
 hterm.copySelectionToClipboard = function(document) {
   try {
     document.execCommand('copy');
-  } catch (firefoxException) {
+  }
+  catch (firefoxException) {
     // Ignore this. FF throws an exception if there was an error, even though
     // the spec says just return false.
   }
@@ -5193,7 +5489,8 @@
 hterm.pasteFromClipboard = function(document) {
   try {
     document.execCommand('paste');
-  } catch (firefoxException) {
+  }
+  catch (firefoxException) {
     // Ignore this. FF throws an exception if there was an error, even though
     // the spec says just return false.
   }
@@ -5331,7 +5628,7 @@
  */
 hterm.RowCol.prototype.equals = function(that) {
   return (this.row == that.row && this.column == that.column &&
-          this.overflow == that.overflow);
+    this.overflow == that.overflow);
 };
 
 /**
@@ -5342,7 +5639,7 @@
  */
 hterm.RowCol.prototype.toString = function() {
   return ('[hterm.RowCol: ' + this.row + ', ' + this.column + ', ' +
-          this.overflow + ']');
+    this.overflow + ']');
 };
 // SOURCE FILE: hterm/js/hterm_frame.js
 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
@@ -5409,9 +5706,13 @@
   this.messageChannel_ = new MessageChannel();
   this.messageChannel_.port1.onmessage = this.onMessage_.bind(this);
   this.messageChannel_.port1.start();
-  this.iframe_.contentWindow.postMessage(
-      {name: 'ipc-init', argv: [{messagePort: this.messageChannel_.port2}]},
-      this.url, [this.messageChannel_.port2]);
+  this.iframe_.contentWindow.postMessage({
+      name: 'ipc-init',
+      argv: [{
+        messagePort: this.messageChannel_.port2
+      }]
+    },
+    this.url, [this.messageChannel_.port2]);
 };
 
 /**
@@ -5424,17 +5725,16 @@
  */
 hterm.Frame.prototype.sendTerminalInfo_ = function() {
   lib.f.getAcceptLanguages(function(languages) {
-      this.postMessage('terminal-info', [{
-         acceptLanguages: languages,
-         foregroundColor: this.terminal_.getForegroundColor(),
-         backgroundColor: this.terminal_.getBackgroundColor(),
-         cursorColor: this.terminal_.getCursorColor(),
-         fontSize: this.terminal_.getFontSize(),
-         fontFamily: this.terminal_.getFontFamily(),
-         baseURL: lib.f.getURL('/')
-          }]
-        );
-    }.bind(this));
+    this.postMessage('terminal-info', [{
+      acceptLanguages: languages,
+      foregroundColor: this.terminal_.getForegroundColor(),
+      backgroundColor: this.terminal_.getBackgroundColor(),
+      cursorColor: this.terminal_.getCursorColor(),
+      fontSize: this.terminal_.getFontSize(),
+      fontFamily: this.terminal_.getFontFamily(),
+      baseURL: lib.f.getURL('/')
+    }]);
+  }.bind(this));
 };
 
 /**
@@ -5449,7 +5749,7 @@
  */
 hterm.Frame.prototype.close = function() {
   if (!this.container_ || !this.container_.parentNode)
-      return;
+    return;
 
   this.container_.parentNode.removeChild(this.container_);
   this.onClose();
@@ -5468,7 +5768,10 @@
   if (!this.messageChannel_)
     throw new Error('Message channel is not set up.');
 
-  this.messageChannel_.port1.postMessage({name: name, argv: argv});
+  this.messageChannel_.port1.postMessage({
+    name: name,
+    argv: argv
+  });
 };
 
 /**
@@ -5506,25 +5809,25 @@
 
   var container = this.container_ = document.createElement('div');
   container.style.cssText = (
-      'position: absolute;' +
-      'display: -webkit-flex;' +
-      '-webkit-flex-direction: column;' +
-      'top: 10%;' +
-      'left: 4%;' +
-      'width: 90%;' +
-      'height: 80%;' +
-      'box-shadow: 0 0 2px ' + this.terminal_.getForegroundColor() + ';' +
-      'border: 2px ' + this.terminal_.getForegroundColor() + ' solid;');
+    'position: absolute;' +
+    'display: -webkit-flex;' +
+    '-webkit-flex-direction: column;' +
+    'top: 10%;' +
+    'left: 4%;' +
+    'width: 90%;' +
+    'height: 80%;' +
+    'box-shadow: 0 0 2px ' + this.terminal_.getForegroundColor() + ';' +
+    'border: 2px ' + this.terminal_.getForegroundColor() + ' solid;');
 
   var header = document.createElement('div');
   header.style.cssText = (
-      'display: -webkit-flex;' +
-      '-webkit-justify-content: flex-end;' +
-      'height: ' + headerHeight + ';' +
-      'background-color: ' + this.terminal_.getForegroundColor() + ';' +
-      'color: ' + this.terminal_.getBackgroundColor() + ';' +
-      'font-size: 16px;' +
-      'font-family: ' + this.terminal_.getFontFamily());
+    'display: -webkit-flex;' +
+    '-webkit-justify-content: flex-end;' +
+    'height: ' + headerHeight + ';' +
+    'background-color: ' + this.terminal_.getForegroundColor() + ';' +
+    'color: ' + this.terminal_.getBackgroundColor() + ';' +
+    'font-size: 16px;' +
+    'font-family: ' + this.terminal_.getFontFamily());
   container.appendChild(header);
 
   if (false) {
@@ -5532,10 +5835,10 @@
     var button = document.createElement('div');
     button.setAttribute('role', 'button');
     button.style.cssText = (
-        'margin-top: -3px;' +
-        'margin-right: 3px;' +
-        'cursor: pointer;');
-    button.textContent = '\u2a2f';
+      'margin-top: -3px;' +
+      'margin-right: 3px;' +
+      'cursor: pointer;');
+    button.textContent = '⨯';
     button.addEventListener('click', this.onCloseClicked_.bind(this));
     header.appendChild(button);
   }
@@ -5543,9 +5846,9 @@
   var iframe = this.iframe_ = document.createElement('iframe');
   iframe.onload = this.onLoad_.bind(this);
   iframe.style.cssText = (
-      'display: -webkit-flex;' +
-      '-webkit-flex: 1;' +
-      'width: 100%');
+    'display: -webkit-flex;' +
+    '-webkit-flex: 1;' +
+    'width: 100%');
   iframe.setAttribute('src', this.url);
   iframe.setAttribute('seamless', true);
   container.appendChild(iframe);
@@ -5581,11 +5884,11 @@
   // The event handlers we are interested in, and their bound callbacks, saved
   // so they can be uninstalled with removeEventListener, when required.
   this.handlers_ = [
-      ['focusout', this.onFocusOut_.bind(this)],
-      ['keydown', this.onKeyDown_.bind(this)],
-      ['keypress', this.onKeyPress_.bind(this)],
-      ['keyup', this.onKeyUp_.bind(this)],
-      ['textInput', this.onTextInput_.bind(this)]
+    ['focusout', this.onFocusOut_.bind(this)],
+    ['keydown', this.onKeyDown_.bind(this)],
+    ['keypress', this.onKeyPress_.bind(this)],
+    ['keyup', this.onKeyUp_.bind(this)],
+    ['textInput', this.onTextInput_.bind(this)]
   ];
 
   /**
@@ -5817,7 +6120,8 @@
     var handler = this.handlers_[i];
     if (element) {
       element.addEventListener(handler[0], handler[1]);
-    } else {
+    }
+    else {
       this.keyboardElement_.removeEventListener(handler[0], handler[1]);
     }
   }
@@ -5874,7 +6178,8 @@
       ch = ch.toLowerCase();
     code = ch.charCodeAt(0) + 128;
 
-  } else if (e.charCode >= 32) {
+  }
+  else if (e.charCode >= 32) {
     ch = e.charCode;
   }
 
@@ -5931,6 +6236,7 @@
   var resolvedActionType = null;
 
   var self = this;
+
   function getAction(name) {
     // Get the key action for the given action name.  If the action is a
     // function, dispatch it.  If the action defers to the normal action,
@@ -5965,38 +6271,41 @@
 
   switch (this.altGrMode) {
     case 'ctrl-alt':
-    if (isPrintable && control && alt) {
-      // ctrl-alt-printable means altGr.  We clear out the control and
-      // alt modifiers and wait to see the charCode in the keydown event.
-      control = false;
-      alt = false;
-    }
-    break;
+      if (isPrintable && control && alt) {
+        // ctrl-alt-printable means altGr.  We clear out the control and
+        // alt modifiers and wait to see the charCode in the keydown event.
+        control = false;
+        alt = false;
+      }
+      break;
 
     case 'right-alt':
-    if (isPrintable && (this.terminal.keyboard.altKeyPressed & 2)) {
-      control = false;
-      alt = false;
-    }
-    break;
+      if (isPrintable && (this.terminal.keyboard.altKeyPressed & 2)) {
+        control = false;
+        alt = false;
+      }
+      break;
 
     case 'left-alt':
-    if (isPrintable && (this.terminal.keyboard.altKeyPressed & 1)) {
-      control = false;
-      alt = false;
-    }
-    break;
+      if (isPrintable && (this.terminal.keyboard.altKeyPressed & 1)) {
+        control = false;
+        alt = false;
+      }
+      break;
   }
 
   var action;
 
   if (control) {
     action = getAction('control');
-  } else if (alt) {
+  }
+  else if (alt) {
     action = getAction('alt');
-  } else if (meta) {
+  }
+  else if (meta) {
     action = getAction('meta');
-  } else {
+  }
+  else {
     action = getAction('normal');
   }
 
@@ -6073,9 +6382,11 @@
   // modifier has already been accounted for in the action.
   if (resolvedActionType == 'control') {
     control = false;
-  } else if (resolvedActionType == 'alt') {
+  }
+  else if (resolvedActionType == 'alt') {
     alt = false;
-  } else if (resolvedActionType == 'meta') {
+  }
+  else if (resolvedActionType == 'meta') {
     meta = false;
   }
 
@@ -6088,30 +6399,38 @@
 
     if (shift && !(alt || control)) {
       mod = ';2';
-    } else if (alt && !(shift || control)) {
+    }
+    else if (alt && !(shift || control)) {
       mod = ';3';
-    } else if (shift && alt && !control) {
+    }
+    else if (shift && alt && !control) {
       mod = ';4';
-    } else if (control && !(shift || alt)) {
+    }
+    else if (control && !(shift || alt)) {
       mod = ';5';
-    } else if (shift && control && !alt) {
+    }
+    else if (shift && control && !alt) {
       mod = ';6';
-    } else if (alt && control && !shift) {
+    }
+    else if (alt && control && !shift) {
       mod = ';7';
-    } else if (shift && alt && control) {
+    }
+    else if (shift && alt && control) {
       mod = ';8';
     }
 
     if (action.length == 3) {
       // Some of the CSI sequences have zero parameters unless modified.
       action = '\x1b[1' + mod + action.substr(2, 1);
-    } else {
+    }
+    else {
       // Others always have at least one parameter.
       action = action.substr(0, action.length - 1) + mod +
-          action.substr(action.length - 1);
+        action.substr(action.length - 1);
     }
 
-  } else {
+  }
+  else {
     if (action === DEFAULT) {
       action = keyDef.keyCap.substr((shift ? 1 : 0), 1);
 
@@ -6133,7 +6452,7 @@
     // string.  Otherwise, every overridden alt/meta action would have to
     // check alt/metaSendsEscape.
     if ((alt && this.altSendsWhat == 'escape') ||
-        (meta && this.metaSendsEscape)) {
+      (meta && this.metaSendsEscape)) {
       action = '\x1b' + action;
     }
   }
@@ -6161,7 +6480,7 @@
 /**
  * Remove all bindings.
  */
-hterm.Keyboard.Bindings.prototype.clear = function () {
+hterm.Keyboard.Bindings.prototype.clear = function() {
   this.bindings_ = {};
 };
 
@@ -6188,17 +6507,22 @@
 
   if (binding) {
     binding.action = action;
-  } else {
-    binding = {keyPattern: keyPattern, action: action};
+  }
+  else {
+    binding = {
+      keyPattern: keyPattern,
+      action: action
+    };
 
     if (!list) {
       this.bindings_[keyPattern.keyCode] = [binding];
-    } else {
+    }
+    else {
       this.bindings_[keyPattern.keyCode].push(binding);
 
       list.sort(function(a, b) {
         return hterm.Keyboard.KeyPattern.sortCompare(
-            a.keyPattern, b.keyPattern);
+          a.keyPattern, b.keyPattern);
       });
     }
   }
@@ -6244,7 +6568,8 @@
 
   try {
     sequence = p.parseKeySequence();
-  } catch (ex) {
+  }
+  catch (ex) {
     console.error(ex);
     return;
   }
@@ -6259,7 +6584,8 @@
     p.reset(action);
     try {
       action = p.parseKeyAction();
-    } catch (ex) {
+    }
+    catch (ex) {
       console.error(ex);
       return;
     }
@@ -6407,13 +6733,13 @@
  */
 hterm.Keyboard.KeyMap.prototype.addKeyDefs = function(var_args) {
   for (var i = 0; i < arguments.length; i++) {
-    this.addKeyDef(arguments[i][0],
-                   { keyCap: arguments[i][1],
-                     normal: arguments[i][2],
-                     control: arguments[i][3],
-                     alt: arguments[i][4],
-                     meta: arguments[i][5]
-                   });
+    this.addKeyDef(arguments[i][0], {
+      keyCap: arguments[i][1],
+      normal: arguments[i][2],
+      control: arguments[i][3],
+      alt: arguments[i][4],
+      meta: arguments[i][5]
+    });
   }
 };
 
@@ -6439,7 +6765,7 @@
   function ak(a, b) {
     return function(e, k) {
       var action = (e.shiftKey || e.ctrlKey || e.altKey || e.metaKey ||
-                    !self.keyboard.applicationKeypad) ? a : b;
+        !self.keyboard.applicationKeypad) ? a : b;
       return resolve(action, e, k);
     };
   }
@@ -6449,7 +6775,7 @@
   function ac(a, b) {
     return function(e, k) {
       var action = (e.shiftKey || e.ctrlKey || e.altKey || e.metaKey ||
-                    !self.keyboard.applicationCursor) ? a : b;
+        !self.keyboard.applicationCursor) ? a : b;
       return resolve(action, e, k);
     };
   }
@@ -6488,10 +6814,16 @@
   }
 
   // Compute a control character for a given character.
-  function ctl(ch) { return String.fromCharCode(ch.charCodeAt(0) - 64) }
+  function ctl(ch) {
+    return String.fromCharCode(ch.charCodeAt(0) - 64);
+  }
 
   // Call a method on the keymap instance.
-  function c(m) { return function (e, k) { return this[m](e, k) } }
+  function c(m) {
+    return function(e, k) {
+      return this[m](e, k);
+    }
+  }
 
   // Ignore if not trapping media keys.
   function med(fn) {
@@ -6500,8 +6832,8 @@
         // Block Back, Forward, and Reload keys to avoid navigating away from
         // the current page.
         return (e.keyCode == 166 || e.keyCode == 167 || e.keyCode == 168) ?
-            hterm.Keyboard.KeyActions.CANCEL :
-            hterm.Keyboard.KeyActions.PASS;
+          hterm.Keyboard.KeyActions.CANCEL :
+          hterm.Keyboard.KeyActions.PASS;
       }
       return resolve(fn, e, k);
     };
@@ -6521,120 +6853,45 @@
 
     // The browser sends the keycode 0 for some keys.  We'll just assume it's
     // going to do the right thing by default for those keys.
-    [0,   '[UNKNOWN]', PASS, PASS, PASS, PASS],
+    [0, '[UNKNOWN]', PASS, PASS, PASS, PASS],
 
     // First row.
-    [27,  '[ESC]', ESC,                       DEFAULT, DEFAULT,     DEFAULT],
-    [112, '[F1]',  mod(SS3 + 'P', CSI + 'P'), DEFAULT, CSI + "23~", DEFAULT],
-    [113, '[F2]',  mod(SS3 + 'Q', CSI + 'Q'), DEFAULT, CSI + "24~", DEFAULT],
-    [114, '[F3]',  mod(SS3 + 'R', CSI + 'R'), DEFAULT, CSI + "25~", DEFAULT],
-    [115, '[F4]',  mod(SS3 + 'S', CSI + 'S'), DEFAULT, CSI + "26~", DEFAULT],
-    [116, '[F5]',  CSI + '15~',               DEFAULT, CSI + "28~", DEFAULT],
-    [117, '[F6]',  CSI + '17~',               DEFAULT, CSI + "29~", DEFAULT],
-    [118, '[F7]',  CSI + '18~',               DEFAULT, CSI + "31~", DEFAULT],
-    [119, '[F8]',  CSI + '19~',               DEFAULT, CSI + "32~", DEFAULT],
-    [120, '[F9]',  CSI + '20~',               DEFAULT, CSI + "33~", DEFAULT],
-    [121, '[F10]', CSI + '21~',               DEFAULT, CSI + "34~", DEFAULT],
-    [122, '[F11]', CSI + '23~',               DEFAULT, CSI + "42~", DEFAULT],
-    [123, '[F12]', CSI + '24~',               DEFAULT, CSI + "43~", DEFAULT],
+    [27, '[ESC]', ESC, DEFAULT, DEFAULT, DEFAULT], [112, '[F1]', mod(SS3 + 'P', CSI + 'P'), DEFAULT, CSI + '23~', DEFAULT], [113, '[F2]', mod(SS3 + 'Q', CSI + 'Q'), DEFAULT, CSI + '24~', DEFAULT], [114, '[F3]', mod(SS3 + 'R', CSI + 'R'), DEFAULT, CSI + '25~', DEFAULT], [115, '[F4]', mod(SS3 + 'S', CSI + 'S'), DEFAULT, CSI + '26~', DEFAULT], [116, '[F5]', CSI + '15~', DEFAULT, CSI + '28~', DEFAULT], [117, '[F6]', CSI + '17~', DEFAULT, CSI + '29~', DEFAULT], [118, '[F7]', CSI + '18~', DEFAULT, CSI + '31~', DEFAULT], [119, '[F8]', CSI + '19~', DEFAULT, CSI + '32~', DEFAULT], [120, '[F9]', CSI + '20~', DEFAULT, CSI + '33~', DEFAULT], [121, '[F10]', CSI + '21~', DEFAULT, CSI + '34~', DEFAULT], [122, '[F11]', CSI + '23~', DEFAULT, CSI + '42~', DEFAULT], [123, '[F12]', CSI + '24~', DEFAULT, CSI + '43~', DEFAULT],
 
     // Second row.
-    [192, '`~', DEFAULT, sh(ctl('@'), ctl('^')),     DEFAULT,           PASS],
-    [49,  '1!', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [50,  '2@', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [51,  '3#', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [52,  '4$', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [53,  '5%', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [54,  '6^', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [55,  '7&', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [56,  '8*', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [57,  '9(', DEFAULT, c('onCtrlNum_'),    c('onAltNum_'), c('onMetaNum_')],
-    [48,  '0)', DEFAULT, c('onPlusMinusZero_'),c('onAltNum_'),c('onPlusMinusZero_')],
-    [189, '-_', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
-    [187, '=+', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
+    [192, '`~', DEFAULT, sh(ctl('@'), ctl('^')), DEFAULT, PASS], [49, '1!', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [50, '2@', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [51, '3#', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [52, '4$', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [53, '5%', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [54, '6^', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [55, '7&', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [56, '8*', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [57, '9(', DEFAULT, c('onCtrlNum_'), c('onAltNum_'), c('onMetaNum_')], [48, '0)', DEFAULT, c('onPlusMinusZero_'), c('onAltNum_'), c('onPlusMinusZero_')], [189, '-_', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')], [187, '=+', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
     // Firefox -_ and =+
-    [173, '-_', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
-    [61, '=+', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
+    [173, '-_', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')], [61, '=+', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
     // Firefox Italian +*
     [171, '+*', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
 
-    [8,   '[BKSP]', bs('\x7f', '\b'), bs('\b', '\x7f'), DEFAULT,     DEFAULT],
+    [8, '[BKSP]', bs('\x7f', '\b'), bs('\b', '\x7f'), DEFAULT, DEFAULT],
 
     // Third row.
-    [9,   '[TAB]', sh('\t', CSI + 'Z'), STRIP,     PASS,    DEFAULT],
-    [81,  'qQ',    DEFAULT,             ctl('Q'),  DEFAULT, DEFAULT],
-    [87,  'wW',    DEFAULT,             ctl('W'),  DEFAULT, DEFAULT],
-    [69,  'eE',    DEFAULT,             ctl('E'),  DEFAULT, DEFAULT],
-    [82,  'rR',    DEFAULT,             ctl('R'),  DEFAULT, DEFAULT],
-    [84,  'tT',    DEFAULT,             ctl('T'),  DEFAULT, DEFAULT],
-    [89,  'yY',    DEFAULT,             ctl('Y'),  DEFAULT, DEFAULT],
-    [85,  'uU',    DEFAULT,             ctl('U'),  DEFAULT, DEFAULT],
-    [73,  'iI',    DEFAULT,             ctl('I'),  DEFAULT, DEFAULT],
-    [79,  'oO',    DEFAULT,             ctl('O'),  DEFAULT, DEFAULT],
-    [80,  'pP',    DEFAULT,             ctl('P'),  DEFAULT, DEFAULT],
-    [219, '[{',    DEFAULT,             ctl('['),  DEFAULT, DEFAULT],
-    [221, ']}',    DEFAULT,             ctl(']'),  DEFAULT, DEFAULT],
-    [220, '\\|',   DEFAULT,             ctl('\\'), DEFAULT, DEFAULT],
+    [9, '[TAB]', sh('\t', CSI + 'Z'), STRIP, PASS, DEFAULT], [81, 'qQ', DEFAULT, ctl('Q'), DEFAULT, DEFAULT], [87, 'wW', DEFAULT, ctl('W'), DEFAULT, DEFAULT], [69, 'eE', DEFAULT, ctl('E'), DEFAULT, DEFAULT], [82, 'rR', DEFAULT, ctl('R'), DEFAULT, DEFAULT], [84, 'tT', DEFAULT, ctl('T'), DEFAULT, DEFAULT], [89, 'yY', DEFAULT, ctl('Y'), DEFAULT, DEFAULT], [85, 'uU', DEFAULT, ctl('U'), DEFAULT, DEFAULT], [73, 'iI', DEFAULT, ctl('I'), DEFAULT, DEFAULT], [79, 'oO', DEFAULT, ctl('O'), DEFAULT, DEFAULT], [80, 'pP', DEFAULT, ctl('P'), DEFAULT, DEFAULT], [219, '[{', DEFAULT, ctl('['), DEFAULT, DEFAULT], [221, ']}', DEFAULT, ctl(']'), DEFAULT, DEFAULT], [220, '\\|', DEFAULT, ctl('\\'), DEFAULT, DEFAULT],
 
     // Fourth row. (We let Ctrl-Shift-J pass for Chrome DevTools.)
-    [20,  '[CAPS]',  PASS,    PASS,                           PASS,    DEFAULT],
-    [65,  'aA',      DEFAULT, ctl('A'),                       DEFAULT, DEFAULT],
-    [83,  'sS',      DEFAULT, ctl('S'),                       DEFAULT, DEFAULT],
-    [68,  'dD',      DEFAULT, ctl('D'),                       DEFAULT, DEFAULT],
-    [70,  'fF',      DEFAULT, ctl('F'),                       DEFAULT, DEFAULT],
-    [71,  'gG',      DEFAULT, ctl('G'),                       DEFAULT, DEFAULT],
-    [72,  'hH',      DEFAULT, ctl('H'),                       DEFAULT, DEFAULT],
-    [74,  'jJ',      DEFAULT, sh(ctl('J'), PASS),             DEFAULT, DEFAULT],
-    [75,  'kK',      DEFAULT, sh(ctl('K'), c('onClear_')),    DEFAULT, DEFAULT],
-    [76,  'lL',      DEFAULT, sh(ctl('L'), PASS),             DEFAULT, DEFAULT],
-    [186, ';:',      DEFAULT, STRIP,                          DEFAULT, DEFAULT],
-    [222, '\'"',     DEFAULT, STRIP,                          DEFAULT, DEFAULT],
-    [13,  '[ENTER]', '\r',    CANCEL,                         CANCEL,  DEFAULT],
+    [20, '[CAPS]', PASS, PASS, PASS, DEFAULT], [65, 'aA', DEFAULT, ctl('A'), DEFAULT, DEFAULT], [83, 'sS', DEFAULT, ctl('S'), DEFAULT, DEFAULT], [68, 'dD', DEFAULT, ctl('D'), DEFAULT, DEFAULT], [70, 'fF', DEFAULT, ctl('F'), DEFAULT, DEFAULT], [71, 'gG', DEFAULT, ctl('G'), DEFAULT, DEFAULT], [72, 'hH', DEFAULT, ctl('H'), DEFAULT, DEFAULT], [74, 'jJ', DEFAULT, sh(ctl('J'), PASS), DEFAULT, DEFAULT], [75, 'kK', DEFAULT, sh(ctl('K'), c('onClear_')), DEFAULT, DEFAULT], [76, 'lL', DEFAULT, sh(ctl('L'), PASS), DEFAULT, DEFAULT], [186, ';:', DEFAULT, STRIP, DEFAULT, DEFAULT], [222, '\'"', DEFAULT, STRIP, DEFAULT, DEFAULT], [13, '[ENTER]', '\r', CANCEL, CANCEL, DEFAULT],
 
     // Fifth row.  This includes the copy/paste shortcuts.  On some
     // platforms it's Ctrl-C/V, on others it's Meta-C/V.  We assume either
     // Ctrl-C/Meta-C should pass to the browser when there is a selection,
     // and Ctrl-Shift-V/Meta-*-V should always pass to the browser (since
     // these seem to be recognized as paste too).
-    [16,  '[SHIFT]', PASS, PASS,                   PASS,    DEFAULT],
-    [90,  'zZ',   DEFAULT, ctl('Z'),               DEFAULT, DEFAULT],
-    [88,  'xX',   DEFAULT, ctl('X'),               DEFAULT, DEFAULT],
-    [67,  'cC',   DEFAULT, c('onCtrlC_'),          DEFAULT, c('onMetaC_')],
-    [86,  'vV',   DEFAULT, c('onCtrlV_'),          DEFAULT, c('onMetaV_')],
-    [66,  'bB',   DEFAULT, sh(ctl('B'), PASS),     DEFAULT, sh(DEFAULT, PASS)],
-    [78,  'nN',   DEFAULT, c('onCtrlN_'),          DEFAULT, c('onMetaN_')],
-    [77,  'mM',   DEFAULT, ctl('M'),               DEFAULT, DEFAULT],
-    [188, ',<',   DEFAULT, alt(STRIP, PASS),       DEFAULT, DEFAULT],
-    [190, '.>',   DEFAULT, alt(STRIP, PASS),       DEFAULT, DEFAULT],
-    [191, '/?',   DEFAULT, sh(ctl('_'), ctl('?')), DEFAULT, DEFAULT],
+    [16, '[SHIFT]', PASS, PASS, PASS, DEFAULT], [90, 'zZ', DEFAULT, ctl('Z'), DEFAULT, DEFAULT], [88, 'xX', DEFAULT, ctl('X'), DEFAULT, DEFAULT], [67, 'cC', DEFAULT, c('onCtrlC_'), DEFAULT, c('onMetaC_')], [86, 'vV', DEFAULT, c('onCtrlV_'), DEFAULT, c('onMetaV_')], [66, 'bB', DEFAULT, sh(ctl('B'), PASS), DEFAULT, sh(DEFAULT, PASS)], [78, 'nN', DEFAULT, c('onCtrlN_'), DEFAULT, c('onMetaN_')], [77, 'mM', DEFAULT, ctl('M'), DEFAULT, DEFAULT], [188, ',<', DEFAULT, alt(STRIP, PASS), DEFAULT, DEFAULT], [190, '.>', DEFAULT, alt(STRIP, PASS), DEFAULT, DEFAULT], [191, '/?', DEFAULT, sh(ctl('_'), ctl('?')), DEFAULT, DEFAULT],
 
     // Sixth and final row.
-    [17,  '[CTRL]',  PASS,    PASS,     PASS,    PASS],
-    [18,  '[ALT]',   PASS,    PASS,     PASS,    PASS],
-    [91,  '[LAPL]',  PASS,    PASS,     PASS,    PASS],
-    [32,  ' ',       DEFAULT, ctl('@'), DEFAULT, DEFAULT],
-    [92,  '[RAPL]',  PASS,    PASS,     PASS,    PASS],
-    [93,  '[RMENU]', PASS,    PASS,     PASS,    PASS],
+    [17, '[CTRL]', PASS, PASS, PASS, PASS], [18, '[ALT]', PASS, PASS, PASS, PASS], [91, '[LAPL]', PASS, PASS, PASS, PASS], [32, ' ', DEFAULT, ctl('@'), DEFAULT, DEFAULT], [92, '[RAPL]', PASS, PASS, PASS, PASS], [93, '[RMENU]', PASS, PASS, PASS, PASS],
 
     // These things.
-    [42,  '[PRTSCR]', PASS, PASS, PASS, PASS],
-    [145, '[SCRLK]',  PASS, PASS, PASS, PASS],
-    [19,  '[BREAK]',  PASS, PASS, PASS, PASS],
+    [42, '[PRTSCR]', PASS, PASS, PASS, PASS], [145, '[SCRLK]', PASS, PASS, PASS, PASS], [19, '[BREAK]', PASS, PASS, PASS, PASS],
 
     // The block of six keys above the arrows.
-    [45,  '[INSERT]', c('onKeyInsert_'),   DEFAULT, DEFAULT, DEFAULT],
-    [36,  '[HOME]',   c('onKeyHome_'),     DEFAULT, DEFAULT, DEFAULT],
-    [33,  '[PGUP]',   c('onKeyPageUp_'),   DEFAULT, DEFAULT, DEFAULT],
-    [46,  '[DEL]',    c('onKeyDel_'),      DEFAULT, DEFAULT, DEFAULT],
-    [35,  '[END]',    c('onKeyEnd_'),      DEFAULT, DEFAULT, DEFAULT],
-    [34,  '[PGDOWN]', c('onKeyPageDown_'), DEFAULT, DEFAULT, DEFAULT],
+    [45, '[INSERT]', c('onKeyInsert_'), DEFAULT, DEFAULT, DEFAULT], [36, '[HOME]', c('onKeyHome_'), DEFAULT, DEFAULT, DEFAULT], [33, '[PGUP]', c('onKeyPageUp_'), DEFAULT, DEFAULT, DEFAULT], [46, '[DEL]', c('onKeyDel_'), DEFAULT, DEFAULT, DEFAULT], [35, '[END]', c('onKeyEnd_'), DEFAULT, DEFAULT, DEFAULT], [34, '[PGDOWN]', c('onKeyPageDown_'), DEFAULT, DEFAULT, DEFAULT],
 
     // Arrow keys.  When unmodified they respect the application cursor state,
     // otherwise they always send the CSI codes.
-    [38, '[UP]',    ac(CSI + 'A', SS3 + 'A'), DEFAULT, DEFAULT, DEFAULT],
-    [40, '[DOWN]',  ac(CSI + 'B', SS3 + 'B'), DEFAULT, DEFAULT, DEFAULT],
-    [39, '[RIGHT]', ac(CSI + 'C', SS3 + 'C'), DEFAULT, DEFAULT, DEFAULT],
-    [37, '[LEFT]',  ac(CSI + 'D', SS3 + 'D'), DEFAULT, DEFAULT, DEFAULT],
+    [38, '[UP]', ac(CSI + 'A', SS3 + 'A'), DEFAULT, DEFAULT, DEFAULT], [40, '[DOWN]', ac(CSI + 'B', SS3 + 'B'), DEFAULT, DEFAULT, DEFAULT], [39, '[RIGHT]', ac(CSI + 'C', SS3 + 'C'), DEFAULT, DEFAULT, DEFAULT], [37, '[LEFT]', ac(CSI + 'D', SS3 + 'D'), DEFAULT, DEFAULT, DEFAULT],
 
     [144, '[NUMLOCK]', PASS, PASS, PASS, PASS],
 
@@ -6642,30 +6899,10 @@
     // and 'block of six' for some keys, and null key codes for the rest.
 
     // Keypad with numlock on generates unique key codes...
-    [96,  '[KP0]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [97,  '[KP1]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [98,  '[KP2]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [99,  '[KP3]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [100, '[KP4]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [101, '[KP5]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [102, '[KP6]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [103, '[KP7]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [104, '[KP8]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [105, '[KP9]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [107, '[KP+]', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
-    [109, '[KP-]', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')],
-    [106, '[KP*]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [111, '[KP/]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
-    [110, '[KP.]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
+    [96, '[KP0]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [97, '[KP1]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [98, '[KP2]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [99, '[KP3]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [100, '[KP4]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [101, '[KP5]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [102, '[KP6]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [103, '[KP7]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [104, '[KP8]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [105, '[KP9]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [107, '[KP+]', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')], [109, '[KP-]', DEFAULT, c('onPlusMinusZero_'), DEFAULT, c('onPlusMinusZero_')], [106, '[KP*]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [111, '[KP/]', DEFAULT, DEFAULT, DEFAULT, DEFAULT], [110, '[KP.]', DEFAULT, DEFAULT, DEFAULT, DEFAULT],
 
     // Chrome OS keyboard top row.
-    [166, '[BACK]',   med(mod(SS3+'P', CSI+'P')), DEFAULT, CSI+"23~", DEFAULT],
-    [167, '[FWD]',    med(mod(SS3+'Q', CSI+'Q')), DEFAULT, CSI+"24~", DEFAULT],
-    [168, '[RELOAD]', med(mod(SS3+'R', CSI+'R')), DEFAULT, CSI+"25~", DEFAULT],
-    [183, '[FSCR]',   med(mod(SS3+'S', CSI+'S')), DEFAULT, CSI+"26~", DEFAULT],
-    [182, '[WINS]',   med(CSI + '15~'),           DEFAULT, CSI+"28~", DEFAULT],
-    [216, '[BRIT-]',  med(CSI + '17~'),           DEFAULT, CSI+"29~", DEFAULT],
-    [217, '[BRIT+]',  med(CSI + '18~'),           DEFAULT, CSI+"31~", DEFAULT]
+    [166, '[BACK]', med(mod(SS3 + 'P', CSI + 'P')), DEFAULT, CSI + '23~', DEFAULT], [167, '[FWD]', med(mod(SS3 + 'Q', CSI + 'Q')), DEFAULT, CSI + '24~', DEFAULT], [168, '[RELOAD]', med(mod(SS3 + 'R', CSI + 'R')), DEFAULT, CSI + '25~', DEFAULT], [183, '[FSCR]', med(mod(SS3 + 'S', CSI + 'S')), DEFAULT, CSI + '26~', DEFAULT], [182, '[WINS]', med(CSI + '15~'), DEFAULT, CSI + '28~', DEFAULT], [216, '[BRIT-]', med(CSI + '17~'), DEFAULT, CSI + '29~', DEFAULT], [217, '[BRIT+]', med(CSI + '18~'), DEFAULT, CSI + '31~', DEFAULT]
 
     // 173 [MUTE], 174 [VOL-] and 175 [VOL+] are trapped by the Chrome OS
     // window manager, so we'll never see them. Note that 173 is also
@@ -6689,7 +6926,7 @@
 hterm.Keyboard.KeyMap.prototype.onKeyHome_ = function(e) {
   if (!this.keyboard.homeKeysScroll ^ e.shiftKey) {
     if ((e.altey || e.ctrlKey || e.shiftKey) ||
-        !this.keyboard.applicationCursor) {
+      !this.keyboard.applicationCursor) {
       return '\x1b[H';
     }
 
@@ -6706,7 +6943,7 @@
 hterm.Keyboard.KeyMap.prototype.onKeyEnd_ = function(e) {
   if (!this.keyboard.homeKeysScroll ^ e.shiftKey) {
     if ((e.altKey || e.ctrlKey || e.shiftKey) ||
-        !this.keyboard.applicationCursor) {
+      !this.keyboard.applicationCursor) {
       return '\x1b[F';
     }
 
@@ -6738,7 +6975,7 @@
  */
 hterm.Keyboard.KeyMap.prototype.onKeyDel_ = function(e) {
   if (this.keyboard.altBackspaceIsMetaBackspace &&
-      this.keyboard.altKeyPressed && !e.altKey)
+    this.keyboard.altKeyPressed && !e.altKey)
     return '\x1b\x7f';
   return '\x1b[3~';
 };
@@ -6771,21 +7008,32 @@
  */
 hterm.Keyboard.KeyMap.prototype.onCtrlNum_ = function(e, keyDef) {
   // Compute a control character for a given character.
-  function ctl(ch) { return String.fromCharCode(ch.charCodeAt(0) - 64) }
+  function ctl(ch) {
+    return String.fromCharCode(ch.charCodeAt(0) - 64);
+  }
 
   if (this.keyboard.terminal.passCtrlNumber && !e.shiftKey)
     return hterm.Keyboard.KeyActions.PASS;
 
   switch (keyDef.keyCap.substr(0, 1)) {
-    case '1': return '1';
-    case '2': return ctl('@');
-    case '3': return ctl('[');
-    case '4': return ctl('\\');
-    case '5': return ctl(']');
-    case '6': return ctl('^');
-    case '7': return ctl('_');
-    case '8': return '\x7f';
-    case '9': return '9';
+    case '1':
+      return '1';
+    case '2':
+      return ctl('@');
+    case '3':
+      return ctl('[');
+    case '4':
+      return ctl('\\');
+    case '5':
+      return ctl(']');
+    case '6':
+      return ctl('^');
+    case '7':
+      return ctl('_');
+    case '8':
+      return '\x7f';
+    case '9':
+      return '9';
   }
 };
 
@@ -6848,9 +7096,9 @@
 hterm.Keyboard.KeyMap.prototype.onCtrlN_ = function(e, keyDef) {
   if (e.shiftKey) {
     window.open(document.location.href, '',
-                'chrome=no,close=yes,resize=yes,scrollbars=yes,' +
-                'minimizable=yes,width=' + window.innerWidth +
-                ',height=' + window.innerHeight);
+      'chrome=no,close=yes,resize=yes,scrollbars=yes,' +
+      'minimizable=yes,width=' + window.innerWidth +
+      ',height=' + window.innerHeight);
     return hterm.Keyboard.KeyActions.CANCEL;
   }
 
@@ -6867,7 +7115,7 @@
  */
 hterm.Keyboard.KeyMap.prototype.onCtrlV_ = function(e, keyDef) {
   if ((!e.shiftKey && this.keyboard.ctrlVPaste) ||
-      (e.shiftKey && !this.keyboard.ctrlVPaste)) {
+    (e.shiftKey && !this.keyboard.ctrlVPaste)) {
     return hterm.Keyboard.KeyActions.PASS;
   }
 
@@ -6880,9 +7128,9 @@
 hterm.Keyboard.KeyMap.prototype.onMetaN_ = function(e, keyDef) {
   if (e.shiftKey) {
     window.open(document.location.href, '',
-                'chrome=no,close=yes,resize=yes,scrollbars=yes,' +
-                'minimizable=yes,width=' + window.outerWidth +
-                ',height=' + window.outerHeight);
+      'chrome=no,close=yes,resize=yes,scrollbars=yes,' +
+      'minimizable=yes,width=' + window.outerWidth +
+      ',height=' + window.outerHeight);
     return hterm.Keyboard.KeyActions.CANCEL;
   }
 
@@ -6911,7 +7159,9 @@
 
   // Otherwise let the browser handle it as a copy command.
   if (this.keyboard.terminal.clearSelectionAfterCopy) {
-    setTimeout(function() { document.getSelection().collapseToEnd() }, 50);
+    setTimeout(function() {
+      document.getSelection().collapseToEnd();
+    }, 50);
   }
   return hterm.Keyboard.KeyActions.PASS;
 };
@@ -6927,8 +7177,8 @@
     return hterm.Keyboard.KeyActions.PASS;
 
   return this.keyboard.passMetaV ?
-      hterm.Keyboard.KeyActions.PASS :
-      hterm.Keyboard.KeyActions.DEFAULT;
+    hterm.Keyboard.KeyActions.PASS :
+    hterm.Keyboard.KeyActions.DEFAULT;
 };
 
 /**
@@ -6947,7 +7197,7 @@
     // ctrl-shift-PMZ controls zoom and this shift key is not pressed,
     // then we want to send the control code instead of affecting zoom.
     if (keyDef.keyCap == '-_')
-      return '\x1f';  // ^_
+      return '\x1f'; // ^_
 
     // Only ^_ is valid, the other sequences have no meaning.
     return hterm.Keyboard.KeyActions.CANCEL;
@@ -6961,13 +7211,15 @@
 
   var cap = keyDef.keyCap.substr(0, 1);
   if (cap == '0') {
-      this.keyboard.terminal.setFontSize(0);
-  } else {
+    this.keyboard.terminal.setFontSize(0);
+  }
+  else {
     var size = this.keyboard.terminal.getFontSize();
 
     if (cap == '-' || keyDef.keyCap == '[KP-]') {
       size -= 1;
-    } else {
+    }
+    else {
       size += 1;
     }
 
@@ -7202,31 +7454,37 @@
     if (token.type == 'integer') {
       rv.keyCode = token.value;
 
-    } else if (token.type == 'identifier') {
+    }
+    else if (token.type == 'identifier') {
       if (token.value in hterm.Parser.identifiers.modifierKeys) {
         var mod = hterm.Parser.identifiers.modifierKeys[token.value];
         if (rv[mod] && rv[mod] != '*')
           throw this.error('Duplicate modifier: ' + token.value);
         rv[mod] = true;
 
-      } else if (token.value in hterm.Parser.identifiers.keyCodes) {
+      }
+      else if (token.value in hterm.Parser.identifiers.keyCodes) {
         rv.keyCode = hterm.Parser.identifiers.keyCodes[token.value];
 
-      } else {
+      }
+      else {
         throw this.error('Unknown key: ' + token.value);
       }
 
-    } else if (token.type == 'symbol') {
+    }
+    else if (token.type == 'symbol') {
       if (token.value == '*') {
         for (var id in hterm.Parser.identifiers.modifierKeys) {
           var p = hterm.Parser.identifiers.modifierKeys[id];
           if (!rv[p])
-            rv[p] =  '*';
+            rv[p] = '*';
         }
-      } else {
+      }
+      else {
         throw this.error('Unexpected symbol: ' + token.value);
       }
-    } else {
+    }
+    else {
       throw this.error('Expected integer or identifier');
     }
 
@@ -7280,19 +7538,31 @@
 
 hterm.Parser.prototype.parseToken = function() {
   if (this.ch == '*') {
-    var rv = {type: 'symbol', value: this.ch};
+    var rv = {
+      type: 'symbol',
+      value: this.ch
+    };
     this.advance(1);
     return rv;
   }
 
   if (this.peekIdentifier())
-    return {type: 'identifier', value: this.parseIdentifier()};
+    return {
+      type: 'identifier',
+      value: this.parseIdentifier()
+    };
 
   if (this.peekString())
-    return {type: 'string', value: this.parseString()};
+    return {
+      type: 'string',
+      value: this.parseString()
+    };
 
   if (this.peekInteger())
-    return {type: 'integer', value: this.parseInteger()};
+    return {
+      type: 'integer',
+      value: this.parseInteger()
+    };
 
 
   throw this.error('Unexpected token');
@@ -7309,7 +7579,7 @@
   var base = 10;
 
   if (this.ch == '0' && this.pos < this.source.length - 1 &&
-      this.source.substr(this.pos + 1, 1) == 'x') {
+    this.source.substr(this.pos + 1, 1) == 'x') {
     return parseInt(this.parsePattern(/0x[0-9a-f]+/gi));
   }
 
@@ -7466,7 +7736,7 @@
   if (opt_expect) {
     if (this.ch.indexOf(opt_expect) == -1) {
       throw this.error('Expected one of ' + opt_expect + ', found: ' +
-          this.ch);
+        this.ch);
     }
   }
 };
@@ -7681,7 +7951,7 @@
  */
 hterm.PreferenceManager = function(profileId) {
   lib.PreferenceManager.call(this, hterm.defaultStorage,
-                             '/hterm/profiles/' + profileId);
+    '/hterm/profiles/' + profileId);
   var defs = hterm.PreferenceManager.defaultPreferences;
   Object.keys(defs).forEach(function(key) {
     this.definePreference(key, defs[key][1]);
@@ -7700,108 +7970,117 @@
 /**
  * List of categories, ordered by display order (top to bottom)
  */
-hterm.PreferenceManager.categoryDefinitions = [
-  { id: hterm.PreferenceManager.categories.Appearance,
-    text: 'Appearance (fonts, colors, images)'},
-  { id: hterm.PreferenceManager.categories.CopyPaste,
-    text: 'Copy & Paste'},
-  { id: hterm.PreferenceManager.categories.Encoding,
-    text: 'Encoding'},
-  { id: hterm.PreferenceManager.categories.Keyboard,
-    text: 'Keyboard'},
-  { id: hterm.PreferenceManager.categories.Scrolling,
-    text: 'Scrolling'},
-  { id: hterm.PreferenceManager.categories.Sounds,
-    text: 'Sounds'},
-  { id: hterm.PreferenceManager.categories.Miscellaneous,
-    text: 'Misc.'}
+hterm.PreferenceManager.categoryDefinitions = [{
+    id: hterm.PreferenceManager.categories.Appearance,
+    text: 'Appearance (fonts, colors, images)'
+  },
+  {
+    id: hterm.PreferenceManager.categories.CopyPaste,
+    text: 'Copy & Paste'
+  },
+  {
+    id: hterm.PreferenceManager.categories.Encoding,
+    text: 'Encoding'
+  },
+  {
+    id: hterm.PreferenceManager.categories.Keyboard,
+    text: 'Keyboard'
+  },
+  {
+    id: hterm.PreferenceManager.categories.Scrolling,
+    text: 'Scrolling'
+  },
+  {
+    id: hterm.PreferenceManager.categories.Sounds,
+    text: 'Sounds'
+  },
+  {
+    id: hterm.PreferenceManager.categories.Miscellaneous,
+    text: 'Misc.'
+  }
 ];
 
 
 hterm.PreferenceManager.defaultPreferences = {
-  'alt-gr-mode':
-  [hterm.PreferenceManager.categories.Keyboard, null,
-   [null, 'none', 'ctrl-alt', 'left-alt', 'right-alt'],
-   'Select an AltGr detection hack^Wheuristic.\n' +
-   '\n' +
-   '\'null\': Autodetect based on navigator.language:\n' +
-   '      \'en-us\' => \'none\', else => \'right-alt\'\n' +
-   '\'none\': Disable any AltGr related munging.\n' +
-   '\'ctrl-alt\': Assume Ctrl+Alt means AltGr.\n' +
-   '\'left-alt\': Assume left Alt means AltGr.\n' +
-   '\'right-alt\': Assume right Alt means AltGr.\n'],
-
-  'alt-backspace-is-meta-backspace':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'If set, undoes the Chrome OS Alt-Backspace->DEL remap, so that ' +
-   'alt-backspace indeed is alt-backspace.'],
-
-  'alt-is-meta':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'Set whether the alt key acts as a meta key or as a distinct alt key.'],
-
-  'alt-sends-what':
-  [hterm.PreferenceManager.categories.Keyboard, 'escape',
-   ['escape', '8-bit', 'browser-key'],
-   'Controls how the alt key is handled.\n' +
-   '\n' +
-   '  escape....... Send an ESC prefix.\n' +
-   '  8-bit........ Add 128 to the unshifted character as in xterm.\n' +
-   '  browser-key.. Wait for the keypress event and see what the browser \n' +
-   '                says.  (This won\'t work well on platforms where the \n' +
-   '                browser performs a default action for some alt sequences.)'
+  'alt-gr-mode': [hterm.PreferenceManager.categories.Keyboard, null, [null, 'none', 'ctrl-alt', 'left-alt', 'right-alt'],
+    'Select an AltGr detection hack^Wheuristic.\n' +
+    '\n' +
+    '\'null\': Autodetect based on navigator.language:\n' +
+    '      \'en-us\' => \'none\', else => \'right-alt\'\n' +
+    '\'none\': Disable any AltGr related munging.\n' +
+    '\'ctrl-alt\': Assume Ctrl+Alt means AltGr.\n' +
+    '\'left-alt\': Assume left Alt means AltGr.\n' +
+    '\'right-alt\': Assume right Alt means AltGr.\n'
   ],
 
-  'audible-bell-sound':
-  [hterm.PreferenceManager.categories.Sounds, 'lib-resource:hterm/audio/bell',
-   'url',
-   'URL of the terminal bell sound.  Empty string for no audible bell.'],
+  'alt-backspace-is-meta-backspace': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'If set, undoes the Chrome OS Alt-Backspace->DEL remap, so that ' +
+    'alt-backspace indeed is alt-backspace.'
+  ],
 
-  'desktop-notification-bell':
-  [hterm.PreferenceManager.categories.Sounds, false, 'bool',
-   'If true, terminal bells in the background will create a Web ' +
-   'Notification. https://www.w3.org/TR/notifications/\n' +
-   '\n'+
-   'Displaying notifications requires permission from the user. When this ' +
-   'option is set to true, hterm will attempt to ask the user for permission ' +
-   'if necessary. Note browsers may not show this permission request if it ' +
-   'did not originate from a user action.\n' +
-   '\n' +
-   'Chrome extensions with the "notifications" permission have permission to ' +
-   'display notifications.'],
+  'alt-is-meta': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'Set whether the alt key acts as a meta key or as a distinct alt key.'
+  ],
 
-  'background-color':
-  [hterm.PreferenceManager.categories.Appearance, 'rgb(16, 16, 16)', 'color',
-   'The background color for text with no other color attributes.'],
+  'alt-sends-what': [hterm.PreferenceManager.categories.Keyboard, 'escape', ['escape', '8-bit', 'browser-key'],
+    'Controls how the alt key is handled.\n' +
+    '\n' +
+    '  escape....... Send an ESC prefix.\n' +
+    '  8-bit........ Add 128 to the unshifted character as in xterm.\n' +
+    '  browser-key.. Wait for the keypress event and see what the browser \n' +
+    '                says.  (This won\'t work well on platforms where the \n' +
+    '                browser performs a default action for some alt sequences.)'
+  ],
 
-  'background-image':
-  [hterm.PreferenceManager.categories.Appearance, '', 'string',
-   'CSS value of the background image.  Empty string for no image.\n' +
-   '\n' +
-   'For example:\n' +
-   '  url(https://goo.gl/anedTK)\n' +
-   '  linear-gradient(top bottom, blue, red)'],
+  'audible-bell-sound': [hterm.PreferenceManager.categories.Sounds, 'lib-resource:hterm/audio/bell',
+    'url',
+    'URL of the terminal bell sound.  Empty string for no audible bell.'
+  ],
 
-  'background-size':
-  [hterm.PreferenceManager.categories.Appearance, '', 'string',
-   'CSS value of the background image size.  Defaults to none.'],
+  'desktop-notification-bell': [hterm.PreferenceManager.categories.Sounds, false, 'bool',
+    'If true, terminal bells in the background will create a Web ' +
+    'Notification. https://www.w3.org/TR/notifications/\n' +
+    '\n' +
+    'Displaying notifications requires permission from the user. When this ' +
+    'option is set to true, hterm will attempt to ask the user for permission ' +
+    'if necessary. Note browsers may not show this permission request if it ' +
+    'did not originate from a user action.\n' +
+    '\n' +
+    'Chrome extensions with the "notifications" permission have permission to ' +
+    'display notifications.'
+  ],
 
-  'background-position':
-  [hterm.PreferenceManager.categories.Appearance, '', 'string',
-   'CSS value of the background image position.\n' +
-   '\n' +
-   'For example:\n' +
-   '  10% 10%\n' +
-   '  center'],
+  'background-color': [hterm.PreferenceManager.categories.Appearance, 'rgb(16, 16, 16)', 'color',
+    'The background color for text with no other color attributes.'
+  ],
 
-  'backspace-sends-backspace':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'If true, the backspace should send BS (\'\\x08\', aka ^H).  Otherwise ' +
-   'the backspace key should send \'\\x7f\'.'],
+  'background-image': [hterm.PreferenceManager.categories.Appearance, '', 'string',
+    'CSS value of the background image.  Empty string for no image.\n' +
+    '\n' +
+    'For example:\n' +
+    '  url(https://goo.gl/anedTK)\n' +
+    '  linear-gradient(top bottom, blue, red)'
+  ],
 
-  'character-map-overrides':
-  [hterm.PreferenceManager.categories.Appearance, null, 'value',
-    'This is specified as an object. It is a sparse array, where each '  +
+  'background-size': [hterm.PreferenceManager.categories.Appearance, '', 'string',
+    'CSS value of the background image size.  Defaults to none.'
+  ],
+
+  'background-position': [hterm.PreferenceManager.categories.Appearance, '', 'string',
+    'CSS value of the background image position.\n' +
+    '\n' +
+    'For example:\n' +
+    '  10% 10%\n' +
+    '  center'
+  ],
+
+  'backspace-sends-backspace': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'If true, the backspace should send BS (\'\\x08\', aka ^H).  Otherwise ' +
+    'the backspace key should send \'\\x7f\'.'
+  ],
+
+  'character-map-overrides': [hterm.PreferenceManager.categories.Appearance, null, 'value',
+    'This is specified as an object. It is a sparse array, where each ' +
     'property is the character set code and the value is an object that is ' +
     'a sparse array itself. In that sparse array, each property is the ' +
     'received character and the value is the displayed character.\n' +
@@ -7811,257 +8090,258 @@
     '"0":"\\u2588"}}'
   ],
 
-  'close-on-exit':
-  [hterm.PreferenceManager.categories.Miscellaneous, true, 'bool',
-   'Whether or not to close the window when the command exits.'],
+  'close-on-exit': [hterm.PreferenceManager.categories.Miscellaneous, true, 'bool',
+    'Whether or not to close the window when the command exits.'
+  ],
 
-  'cursor-blink':
-  [hterm.PreferenceManager.categories.Appearance, false, 'bool',
-   'Whether or not to blink the cursor by default.'],
+  'cursor-blink': [hterm.PreferenceManager.categories.Appearance, false, 'bool',
+    'Whether or not to blink the cursor by default.'
+  ],
 
-  'cursor-blink-cycle':
-  [hterm.PreferenceManager.categories.Appearance, [1000, 500], 'value',
-   'The cursor blink rate in milliseconds.\n' +
-   '\n' +
-   'A two element array, the first of which is how long the cursor should be ' +
-   'on, second is how long it should be off.'],
+  'cursor-blink-cycle': [hterm.PreferenceManager.categories.Appearance, [1000, 500], 'value',
+    'The cursor blink rate in milliseconds.\n' +
+    '\n' +
+    'A two element array, the first of which is how long the cursor should be ' +
+    'on, second is how long it should be off.'
+  ],
 
-  'cursor-color':
-  [hterm.PreferenceManager.categories.Appearance, 'rgba(255, 0, 0, 0.5)',
-   'color',
-   'The color of the visible cursor.'],
+  'cursor-color': [hterm.PreferenceManager.categories.Appearance, 'rgba(255, 0, 0, 0.5)',
+    'color',
+    'The color of the visible cursor.'
+  ],
 
-  'color-palette-overrides':
-  [hterm.PreferenceManager.categories.Appearance, null, 'value',
-   'Override colors in the default palette.\n' +
-   '\n' +
-   'This can be specified as an array or an object.  If specified as an ' +
-   'object it is assumed to be a sparse array, where each property ' +
-   'is a numeric index into the color palette.\n' +
-   '\n' +
-   'Values can be specified as almost any css color value.  This ' +
-   'includes #RGB, #RRGGBB, rgb(...), rgba(...), and any color names ' +
-   'that are also part of the stock X11 rgb.txt file.\n' +
-   '\n' +
-   'You can use \'null\' to specify that the default value should be not ' +
-   'be changed.  This is useful for skipping a small number of indices ' +
-   'when the value is specified as an array.'],
+  'color-palette-overrides': [hterm.PreferenceManager.categories.Appearance, null, 'value',
+    'Override colors in the default palette.\n' +
+    '\n' +
+    'This can be specified as an array or an object.  If specified as an ' +
+    'object it is assumed to be a sparse array, where each property ' +
+    'is a numeric index into the color palette.\n' +
+    '\n' +
+    'Values can be specified as almost any css color value.  This ' +
+    'includes #RGB, #RRGGBB, rgb(...), rgba(...), and any color names ' +
+    'that are also part of the stock X11 rgb.txt file.\n' +
+    '\n' +
+    'You can use \'null\' to specify that the default value should be not ' +
+    'be changed.  This is useful for skipping a small number of indices ' +
+    'when the value is specified as an array.'
+  ],
 
-  'copy-on-select':
-  [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
-   'Automatically copy mouse selection to the clipboard.'],
+  'copy-on-select': [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
+    'Automatically copy mouse selection to the clipboard.'
+  ],
 
-  'use-default-window-copy':
-  [hterm.PreferenceManager.categories.CopyPaste, false, 'bool',
-   'Whether to use the default window copy behavior'],
+  'use-default-window-copy': [hterm.PreferenceManager.categories.CopyPaste, false, 'bool',
+    'Whether to use the default window copy behavior'
+  ],
 
-  'clear-selection-after-copy':
-  [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
-   'Whether to clear the selection after copying.'],
+  'clear-selection-after-copy': [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
+    'Whether to clear the selection after copying.'
+  ],
 
-  'ctrl-plus-minus-zero-zoom':
-  [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
-   'If true, Ctrl-Plus/Minus/Zero controls zoom.\n' +
-   'If false, Ctrl-Shift-Plus/Minus/Zero controls zoom, Ctrl-Minus sends ^_, ' +
-   'Ctrl-Plus/Zero do nothing.'],
+  'ctrl-plus-minus-zero-zoom': [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
+    'If true, Ctrl-Plus/Minus/Zero controls zoom.\n' +
+    'If false, Ctrl-Shift-Plus/Minus/Zero controls zoom, Ctrl-Minus sends ^_, ' +
+    'Ctrl-Plus/Zero do nothing.'
+  ],
 
-  'ctrl-c-copy':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'Ctrl+C copies if true, send ^C to host if false.\n' +
-   'Ctrl+Shift+C sends ^C to host if true, copies if false.'],
+  'ctrl-c-copy': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'Ctrl+C copies if true, send ^C to host if false.\n' +
+    'Ctrl+Shift+C sends ^C to host if true, copies if false.'
+  ],
 
-  'ctrl-v-paste':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'Ctrl+V pastes if true, send ^V to host if false.\n' +
-   'Ctrl+Shift+V sends ^V to host if true, pastes if false.'],
+  'ctrl-v-paste': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'Ctrl+V pastes if true, send ^V to host if false.\n' +
+    'Ctrl+Shift+V sends ^V to host if true, pastes if false.'
+  ],
 
-  'east-asian-ambiguous-as-two-column':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'Set whether East Asian Ambiguous characters have two column width.'],
+  'east-asian-ambiguous-as-two-column': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'Set whether East Asian Ambiguous characters have two column width.'
+  ],
 
-  'enable-8-bit-control':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'True to enable 8-bit control characters, false to ignore them.\n' +
-   '\n' +
-   'We\'ll respect the two-byte versions of these control characters ' +
-   'regardless of this setting.'],
+  'enable-8-bit-control': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'True to enable 8-bit control characters, false to ignore them.\n' +
+    '\n' +
+    'We\'ll respect the two-byte versions of these control characters ' +
+    'regardless of this setting.'
+  ],
 
-  'enable-bold':
-  [hterm.PreferenceManager.categories.Appearance, null, 'tristate',
-   'True if we should use bold weight font for text with the bold/bright ' +
-   'attribute.  False to use the normal weight font.  Null to autodetect.'],
+  'enable-bold': [hterm.PreferenceManager.categories.Appearance, null, 'tristate',
+    'True if we should use bold weight font for text with the bold/bright ' +
+    'attribute.  False to use the normal weight font.  Null to autodetect.'
+  ],
 
-  'enable-bold-as-bright':
-  [hterm.PreferenceManager.categories.Appearance, true, 'bool',
-   'True if we should use bright colors (8-15 on a 16 color palette) ' +
-   'for any text with the bold attribute.  False otherwise.'],
+  'enable-bold-as-bright': [hterm.PreferenceManager.categories.Appearance, true, 'bool',
+    'True if we should use bright colors (8-15 on a 16 color palette) ' +
+    'for any text with the bold attribute.  False otherwise.'
+  ],
 
-  'enable-blink':
-  [hterm.PreferenceManager.categories.Appearance, true, 'bool',
-   'True if we should respect the blink attribute.  False to ignore it.  '],
+  'enable-blink': [hterm.PreferenceManager.categories.Appearance, true, 'bool',
+    'True if we should respect the blink attribute.  False to ignore it.  '
+  ],
 
-  'enable-clipboard-notice':
-  [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
-   'Show a message in the terminal when the host writes to the clipboard.'],
+  'enable-clipboard-notice': [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
+    'Show a message in the terminal when the host writes to the clipboard.'
+  ],
 
-  'enable-clipboard-write':
-  [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
-   'Allow the host to write directly to the system clipboard.'],
+  'enable-clipboard-write': [hterm.PreferenceManager.categories.CopyPaste, true, 'bool',
+    'Allow the host to write directly to the system clipboard.'
+  ],
 
-  'enable-dec12':
-  [hterm.PreferenceManager.categories.Miscellaneous, false, 'bool',
-   'Respect the host\'s attempt to change the cursor blink status using ' +
-   'DEC Private Mode 12.'],
+  'enable-dec12': [hterm.PreferenceManager.categories.Miscellaneous, false, 'bool',
+    'Respect the host\'s attempt to change the cursor blink status using ' +
+    'DEC Private Mode 12.'
+  ],
 
-  'environment':
-  [hterm.PreferenceManager.categories.Miscellaneous, {'TERM': 'xterm-256color'},
-   'value',
-   'The default environment variables, as an object.'],
+  'environment': [hterm.PreferenceManager.categories.Miscellaneous, {
+      'TERM': 'xterm-256color'
+    },
+    'value',
+    'The default environment variables, as an object.'
+  ],
 
-  'font-family':
-  [hterm.PreferenceManager.categories.Appearance,
-   '"DejaVu Sans Mono", "Everson Mono", FreeMono, "Menlo", "Terminal", ' +
-   'monospace', 'string',
-   'Default font family for the terminal text.'],
+  'font-family': [hterm.PreferenceManager.categories.Appearance,
+    '"DejaVu Sans Mono", "Everson Mono", FreeMono, "Menlo", "Terminal", ' +
+    'monospace', 'string',
+    'Default font family for the terminal text.'
+  ],
 
-  'font-size':
-  [hterm.PreferenceManager.categories.Appearance, 15, 'int',
-   'The default font size in pixels.'],
+  'font-size': [hterm.PreferenceManager.categories.Appearance, 15, 'int',
+    'The default font size in pixels.'
+  ],
 
-  'font-smoothing':
-  [hterm.PreferenceManager.categories.Appearance, 'antialiased', 'string',
-   'CSS font-smoothing property.'],
+  'font-smoothing': [hterm.PreferenceManager.categories.Appearance, 'antialiased', 'string',
+    'CSS font-smoothing property.'
+  ],
 
-  'foreground-color':
-  [hterm.PreferenceManager.categories.Appearance, 'rgb(240, 240, 240)', 'color',
-   'The foreground color for text with no other color attributes.'],
+  'foreground-color': [hterm.PreferenceManager.categories.Appearance, 'rgb(240, 240, 240)', 'color',
+    'The foreground color for text with no other color attributes.'
+  ],
 
-  'home-keys-scroll':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'If true, home/end will control the terminal scrollbar and shift home/end ' +
-   'will send the VT keycodes.  If false then home/end sends VT codes and ' +
-   'shift home/end scrolls.'],
+  'home-keys-scroll': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'If true, home/end will control the terminal scrollbar and shift home/end ' +
+    'will send the VT keycodes.  If false then home/end sends VT codes and ' +
+    'shift home/end scrolls.'
+  ],
 
-  'keybindings':
-  [hterm.PreferenceManager.categories.Keyboard, null, 'value',
-   'A map of key sequence to key actions.  Key sequences include zero or ' +
-   'more modifier keys followed by a key code.  Key codes can be decimal or ' +
-   'hexadecimal numbers, or a key identifier.  Key actions can be specified ' +
-   'a string to send to the host, or an action identifier.  For a full ' +
-   'list of key code and action identifiers, see https://goo.gl/8AoD09.' +
-   '\n' +
-   '\n' +
-   'Sample keybindings:\n' +
-   '{ "Ctrl-Alt-K": "clearScrollback",\n' +
-   '  "Ctrl-Shift-L": "PASS",\n' +
-   '  "Ctrl-H": "\'HELLO\\n\'"\n' +
-   '}'],
+  'keybindings': [hterm.PreferenceManager.categories.Keyboard, null, 'value',
+    'A map of key sequence to key actions.  Key sequences include zero or ' +
+    'more modifier keys followed by a key code.  Key codes can be decimal or ' +
+    'hexadecimal numbers, or a key identifier.  Key actions can be specified ' +
+    'a string to send to the host, or an action identifier.  For a full ' +
+    'list of key code and action identifiers, see https://goo.gl/8AoD09.' +
+    '\n' +
+    '\n' +
+    'Sample keybindings:\n' +
+    '{ "Ctrl-Alt-K": "clearScrollback",\n' +
+    '  "Ctrl-Shift-L": "PASS",\n' +
+    '  "Ctrl-H": "\'HELLO\\n\'"\n' +
+    '}'
+  ],
 
-  'max-string-sequence':
-  [hterm.PreferenceManager.categories.Encoding, 100000, 'int',
-   'Max length of a DCS, OSC, PM, or APS sequence before we give up and ' +
-   'ignore the code.'],
+  'max-string-sequence': [hterm.PreferenceManager.categories.Encoding, 100000, 'int',
+    'Max length of a DCS, OSC, PM, or APS sequence before we give up and ' +
+    'ignore the code.'
+  ],
 
-  'media-keys-are-fkeys':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'If true, convert media keys to their Fkey equivalent. If false, let ' +
-   'the browser handle the keys.'],
+  'media-keys-are-fkeys': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'If true, convert media keys to their Fkey equivalent. If false, let ' +
+    'the browser handle the keys.'
+  ],
 
-  'meta-sends-escape':
-  [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
-   'Set whether the meta key sends a leading escape or not.'],
+  'meta-sends-escape': [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
+    'Set whether the meta key sends a leading escape or not.'
+  ],
 
-  'mouse-paste-button':
-  [hterm.PreferenceManager.categories.CopyPaste, null,
-   [null, 0, 1, 2, 3, 4, 5, 6],
-   'Mouse paste button, or null to autodetect.\n' +
-   '\n' +
-   'For autodetect, we\'ll try to enable middle button paste for non-X11 ' +
-   'platforms.  On X11 we move it to button 3.'],
+  'mouse-paste-button': [hterm.PreferenceManager.categories.CopyPaste, null, [null, 0, 1, 2, 3, 4, 5, 6],
+    'Mouse paste button, or null to autodetect.\n' +
+    '\n' +
+    'For autodetect, we\'ll try to enable middle button paste for non-X11 ' +
+    'platforms.  On X11 we move it to button 3.'
+  ],
 
-  'page-keys-scroll':
-  [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
-   'If true, page up/down will control the terminal scrollbar and shift ' +
-   'page up/down will send the VT keycodes.  If false then page up/down ' +
-   'sends VT codes and shift page up/down scrolls.'],
+  'page-keys-scroll': [hterm.PreferenceManager.categories.Keyboard, false, 'bool',
+    'If true, page up/down will control the terminal scrollbar and shift ' +
+    'page up/down will send the VT keycodes.  If false then page up/down ' +
+    'sends VT codes and shift page up/down scrolls.'
+  ],
 
-  'pass-alt-number':
-  [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
-   'Set whether we should pass Alt-1..9 to the browser.\n' +
-   '\n' +
-   'This is handy when running hterm in a browser tab, so that you don\'t ' +
-   'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
-   'in a tab it\'s better to send these keys to the host so they can be ' +
-   'used in vim or emacs.\n' +
-   '\n' +
-   'If true, Alt-1..9 will be handled by the browser.  If false, Alt-1..9 ' +
-   'will be sent to the host.  If null, autodetect based on browser platform ' +
-   'and window type.'],
+  'pass-alt-number': [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
+    'Set whether we should pass Alt-1..9 to the browser.\n' +
+    '\n' +
+    'This is handy when running hterm in a browser tab, so that you don\'t ' +
+    'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
+    'in a tab it\'s better to send these keys to the host so they can be ' +
+    'used in vim or emacs.\n' +
+    '\n' +
+    'If true, Alt-1..9 will be handled by the browser.  If false, Alt-1..9 ' +
+    'will be sent to the host.  If null, autodetect based on browser platform ' +
+    'and window type.'
+  ],
 
-  'pass-ctrl-number':
-  [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
-   'Set whether we should pass Ctrl-1..9 to the browser.\n' +
-   '\n' +
-   'This is handy when running hterm in a browser tab, so that you don\'t ' +
-   'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
-   'in a tab it\'s better to send these keys to the host so they can be ' +
-   'used in vim or emacs.\n' +
-   '\n' +
-   'If true, Ctrl-1..9 will be handled by the browser.  If false, Ctrl-1..9 ' +
-   'will be sent to the host.  If null, autodetect based on browser platform ' +
-   'and window type.'],
+  'pass-ctrl-number': [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
+    'Set whether we should pass Ctrl-1..9 to the browser.\n' +
+    '\n' +
+    'This is handy when running hterm in a browser tab, so that you don\'t ' +
+    'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
+    'in a tab it\'s better to send these keys to the host so they can be ' +
+    'used in vim or emacs.\n' +
+    '\n' +
+    'If true, Ctrl-1..9 will be handled by the browser.  If false, Ctrl-1..9 ' +
+    'will be sent to the host.  If null, autodetect based on browser platform ' +
+    'and window type.'
+  ],
 
-   'pass-meta-number':
-  [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
-   'Set whether we should pass Meta-1..9 to the browser.\n' +
-   '\n' +
-   'This is handy when running hterm in a browser tab, so that you don\'t ' +
-   'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
-   'in a tab it\'s better to send these keys to the host so they can be ' +
-   'used in vim or emacs.\n' +
-   '\n' +
-   'If true, Meta-1..9 will be handled by the browser.  If false, Meta-1..9 ' +
-   'will be sent to the host.  If null, autodetect based on browser platform ' +
-   'and window type.'],
+  'pass-meta-number': [hterm.PreferenceManager.categories.Keyboard, null, 'tristate',
+    'Set whether we should pass Meta-1..9 to the browser.\n' +
+    '\n' +
+    'This is handy when running hterm in a browser tab, so that you don\'t ' +
+    'lose Chrome\'s "switch to tab" keyboard accelerators.  When not running ' +
+    'in a tab it\'s better to send these keys to the host so they can be ' +
+    'used in vim or emacs.\n' +
+    '\n' +
+    'If true, Meta-1..9 will be handled by the browser.  If false, Meta-1..9 ' +
+    'will be sent to the host.  If null, autodetect based on browser platform ' +
+    'and window type.'
+  ],
 
-  'pass-meta-v':
-  [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
-   'Set whether meta-V gets passed to host.'],
+  'pass-meta-v': [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
+    'Set whether meta-V gets passed to host.'
+  ],
 
-  'receive-encoding':
-  [hterm.PreferenceManager.categories.Encoding, 'utf-8', ['utf-8', 'raw'],
-   'Set the expected encoding for data received from the host.\n' +
-   '\n' +
-   'Valid values are \'utf-8\' and \'raw\'.'],
+  'receive-encoding': [hterm.PreferenceManager.categories.Encoding, 'utf-8', ['utf-8', 'raw'],
+    'Set the expected encoding for data received from the host.\n' +
+    '\n' +
+    'Valid values are \'utf-8\' and \'raw\'.'
+  ],
 
-  'scroll-on-keystroke':
-  [hterm.PreferenceManager.categories.Scrolling, true, 'bool',
-   'If true, scroll to the bottom on any keystroke.'],
+  'scroll-on-keystroke': [hterm.PreferenceManager.categories.Scrolling, true, 'bool',
+    'If true, scroll to the bottom on any keystroke.'
+  ],
 
-  'scroll-on-output':
-  [hterm.PreferenceManager.categories.Scrolling, false, 'bool',
-   'If true, scroll to the bottom on terminal output.'],
+  'scroll-on-output': [hterm.PreferenceManager.categories.Scrolling, false, 'bool',
+    'If true, scroll to the bottom on terminal output.'
+  ],
 
-  'scrollbar-visible':
-  [hterm.PreferenceManager.categories.Scrolling, true, 'bool',
-   'The vertical scrollbar mode.'],
+  'scrollbar-visible': [hterm.PreferenceManager.categories.Scrolling, true, 'bool',
+    'The vertical scrollbar mode.'
+  ],
 
-  'scroll-wheel-move-multiplier':
-  [hterm.PreferenceManager.categories.Scrolling, 1, 'int',
-   'The multiplier for the pixel delta in mousewheel event caused by the ' +
-   'scroll wheel. Alters how fast the page scrolls.'],
+  'scroll-wheel-move-multiplier': [hterm.PreferenceManager.categories.Scrolling, 1, 'int',
+    'The multiplier for the pixel delta in mousewheel event caused by the ' +
+    'scroll wheel. Alters how fast the page scrolls.'
+  ],
 
-  'send-encoding':
-  [hterm.PreferenceManager.categories.Encoding, 'utf-8', ['utf-8', 'raw'],
-   'Set the encoding for data sent to host.'],
+  'send-encoding': [hterm.PreferenceManager.categories.Encoding, 'utf-8', ['utf-8', 'raw'],
+    'Set the encoding for data sent to host.'
+  ],
 
-  'shift-insert-paste':
-  [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
-   'Shift + Insert pastes if true, sent to host if false.'],
+  'shift-insert-paste': [hterm.PreferenceManager.categories.Keyboard, true, 'bool',
+    'Shift + Insert pastes if true, sent to host if false.'
+  ],
 
-  'user-css':
-  [hterm.PreferenceManager.categories.Appearance, '', 'url',
-   'URL of user stylesheet to include in the terminal document.']
+  'user-css': [hterm.PreferenceManager.categories.Appearance, '', 'url',
+    'URL of user stylesheet to include in the terminal document.'
+  ]
 };
 
 hterm.PreferenceManager.prototype = {
@@ -8159,7 +8439,8 @@
   if (opt_lastCallback) {
     if (list) {
       list.push(opt_lastCallback);
-    } else {
+    }
+    else {
       list = [opt_lastCallback];
     }
   }
@@ -8175,7 +8456,7 @@
 'use strict';
 
 lib.rtdep('lib.f', 'lib.wc',
-          'hterm.RowCol', 'hterm.Size', 'hterm.TextAttributes');
+  'hterm.RowCol', 'hterm.Size', 'hterm.TextAttributes');
 
 /**
  * @fileoverview This class represents a single terminal screen full of text.
@@ -8428,7 +8709,8 @@
   var text;
   if (this.textAttributes.isDefault()) {
     text = '';
-  } else {
+  }
+  else {
     text = lib.f.getWhitespace(this.columnCount_);
   }
 
@@ -8477,7 +8759,8 @@
   if (row >= this.rowsArray.length) {
     console.error('Row out of bounds: ' + row);
     row = this.rowsArray.length - 1;
-  } else if (row < 0) {
+  }
+  else if (row < 0) {
     console.error('Row out of bounds: ' + row);
     row = 0;
   }
@@ -8485,7 +8768,8 @@
   if (column >= this.columnCount_) {
     console.error('Column out of bounds: ' + column);
     column = this.columnCount_ - 1;
-  } else if (column < 0) {
+  }
+  else if (column < 0) {
     console.error('Column out of bounds: ' + column);
     column = 0;
   }
@@ -8507,7 +8791,8 @@
       node = this.cursorNode_;
       currentColumn = this.cursorPosition.column - this.cursorOffset_;
     }
-  } else {
+  }
+  else {
     this.cursorRowNode_ = rowNode;
   }
 
@@ -8534,7 +8819,8 @@
 hterm.Screen.prototype.syncSelectionCaret = function(selection) {
   try {
     selection.collapse(this.cursorNode_, this.cursorOffset_);
-  } catch (firefoxIgnoredException) {
+  }
+  catch (firefoxIgnoredException) {
     // FF can throw an exception if the range is off, rather than just not
     // performing the collapse.
   }
@@ -8596,7 +8882,7 @@
 
   if (this.cursorOffset_ < width - 1) {
     this.cursorNode_.textContent = hterm.TextAttributes.nodeSubstr(
-        this.cursorNode_, 0, this.cursorOffset_ + 1);
+      this.cursorNode_, 0, this.cursorOffset_ + 1);
   }
 
   // Remove all nodes after the cursor.
@@ -8612,7 +8898,8 @@
     // If the cursor was within the screen before we started then restore its
     // position.
     this.setCursorPosition(this.cursorPosition.row, currentColumn);
-  } else {
+  }
+  else {
     // Otherwise leave it at the the last column in the overflow state.
     this.cursorPosition.overflow = true;
   }
@@ -8659,21 +8946,23 @@
     // color, and strikethrough would be visible on whitespace, so we can't use
     // one of those spans to hold the text.
     if (!(this.textAttributes.underline ||
-          this.textAttributes.strikethrough ||
-          this.textAttributes.background ||
-          this.textAttributes.wcNode ||
-          this.textAttributes.tileData != null)) {
+        this.textAttributes.strikethrough ||
+        this.textAttributes.background ||
+        this.textAttributes.wcNode ||
+        this.textAttributes.tileData != null)) {
       // Best case scenario, we can just pretend the spaces were part of the
       // original string.
       str = ws + str;
-    } else if (cursorNode.nodeType == 3 ||
-               !(cursorNode.wcNode ||
-                 cursorNode.tileNode ||
-                 cursorNode.style.textDecoration ||
-                 cursorNode.style.backgroundColor)) {
+    }
+    else if (cursorNode.nodeType == 3 ||
+      !(cursorNode.wcNode ||
+        cursorNode.tileNode ||
+        cursorNode.style.textDecoration ||
+        cursorNode.style.backgroundColor)) {
       // Second best case, the current node is able to hold the whitespace.
       cursorNode.textContent = (cursorNodeText += ws);
-    } else {
+    }
+    else {
       // Worst case, we have to create a new node to hold the whitespace.
       var wsNode = cursorNode.ownerDocument.createTextNode(ws);
       this.cursorRowNode_.insertBefore(wsNode, cursorNode.nextSibling);
@@ -8690,12 +8979,14 @@
     // The new text can be placed directly in the cursor node.
     if (reverseOffset == 0) {
       cursorNode.textContent = cursorNodeText + str;
-    } else if (offset == 0) {
+    }
+    else if (offset == 0) {
       cursorNode.textContent = str + cursorNodeText;
-    } else {
+    }
+    else {
       cursorNode.textContent =
-          hterm.TextAttributes.nodeSubstr(cursorNode, 0, offset) +
-          str + hterm.TextAttributes.nodeSubstr(cursorNode, offset);
+        hterm.TextAttributes.nodeSubstr(cursorNode, 0, offset) +
+        str + hterm.TextAttributes.nodeSubstr(cursorNode, offset);
     }
 
     this.cursorOffset_ += strWidth;
@@ -8710,7 +9001,7 @@
     // At the beginning of the cursor node, the check the previous sibling.
     var previousSibling = cursorNode.previousSibling;
     if (previousSibling &&
-        this.textAttributes.matchesContainer(previousSibling)) {
+      this.textAttributes.matchesContainer(previousSibling)) {
       previousSibling.textContent += str;
       this.cursorNode_ = previousSibling;
       this.cursorOffset_ = lib.wc.strWidth(previousSibling.textContent);
@@ -8728,7 +9019,7 @@
     // At the end of the cursor node, the check the next sibling.
     var nextSibling = cursorNode.nextSibling;
     if (nextSibling &&
-        this.textAttributes.matchesContainer(nextSibling)) {
+      this.textAttributes.matchesContainer(nextSibling)) {
       nextSibling.textContent = str + nextSibling.textContent;
       this.cursorNode_ = nextSibling;
       this.cursorOffset_ = lib.wc.strWidth(str);
@@ -8769,7 +9060,7 @@
 
   var width = lib.wc.strWidth(str);
   if (this.textAttributes.matchesContainer(this.cursorNode_) &&
-      this.cursorNode_.textContent.substr(this.cursorOffset_) == str) {
+    this.cursorNode_.textContent.substr(this.cursorOffset_) == str) {
     // This overwrite would be a no-op, just move the cursor and return.
     this.cursorOffset_ += width;
     this.cursorPosition.column += width;
@@ -8805,7 +9096,7 @@
   while (node && count) {
     startLength = hterm.TextAttributes.nodeWidth(node);
     node.textContent = hterm.TextAttributes.nodeSubstr(node, 0, offset) +
-        hterm.TextAttributes.nodeSubstr(node, offset + count);
+      hterm.TextAttributes.nodeSubstr(node, offset + count);
     endLength = hterm.TextAttributes.nodeWidth(node);
     count -= startLength - endLength;
     if (offset < startLength && endLength && startLength == endLength) {
@@ -8833,11 +9124,13 @@
     if (cursorNode.previousSibling) {
       this.cursorNode_ = cursorNode.previousSibling;
       this.cursorOffset_ = hterm.TextAttributes.nodeWidth(
-          cursorNode.previousSibling);
-    } else if (cursorNode.nextSibling) {
+        cursorNode.previousSibling);
+    }
+    else if (cursorNode.nextSibling) {
       this.cursorNode_ = cursorNode.nextSibling;
       this.cursorOffset_ = 0;
-    } else {
+    }
+    else {
       var emptyNode = this.cursorRowNode_.ownerDocument.createTextNode('');
       this.cursorRowNode_.appendChild(emptyNode);
       this.cursorNode_ = emptyNode;
@@ -8858,7 +9151,7 @@
  **/
 hterm.Screen.prototype.getLineStartRow_ = function(row) {
   while (row.previousSibling &&
-         row.previousSibling.hasAttribute('line-overflow')) {
+    row.previousSibling.hasAttribute('line-overflow')) {
     row = row.previousSibling;
   }
   return row;
@@ -8872,12 +9165,13 @@
  * @return {string} Text content of line.
  **/
 hterm.Screen.prototype.getLineText_ = function(row) {
-  var rowText = "";
+  var rowText = '';
   while (row) {
     rowText += row.textContent;
     if (row.hasAttribute('line-overflow')) {
       row = row.nextSibling;
-    } else {
+    }
+    else {
       break;
     }
   }
@@ -8920,7 +9214,8 @@
     position += hterm.TextAttributes.nodeWidth(row);
     if (row.hasAttribute('line-overflow') && row.nextSibling) {
       row = row.nextSibling;
-    } else {
+    }
+    else {
       return -1;
     }
   }
@@ -8939,7 +9234,7 @@
 hterm.Screen.prototype.getPositionWithinRow_ = function(row, node, offset) {
   if (node.parentNode != row) {
     return this.getPositionWithinRow_(node.parentNode, node, offset) +
-           this.getPositionWithinRow_(row, node.parentNode, 0);
+      this.getPositionWithinRow_(row, node.parentNode, 0);
   }
   var position = 0;
   for (var i = 0; i < row.childNodes.length; i++) {
@@ -8964,7 +9259,8 @@
     if (row.hasAttribute('line-overflow') && row.nextSibling) {
       position -= hterm.TextAttributes.nodeWidth(row);
       row = row.nextSibling;
-    } else {
+    }
+    else {
       return -1;
     }
   }
@@ -8987,7 +9283,8 @@
       if (node.nodeName === 'SPAN') {
         /** Drill down to node contained by SPAN. **/
         return this.getNodeAndOffsetWithinRow_(node, position);
-      } else {
+      }
+      else {
         return [node, position];
       }
     }
@@ -9034,33 +9331,33 @@
     return;
 
   var startPosition = this.getPositionWithOverflow_(row,
-                                                    range.startContainer,
-                                                    range.startOffset);
+    range.startContainer,
+    range.startOffset);
   if (startPosition == -1)
     return;
   var endPosition = this.getPositionWithOverflow_(row,
-                                                  range.endContainer,
-                                                  range.endOffset);
+    range.endContainer,
+    range.endOffset);
   if (endPosition == -1)
     return;
 
   // Matches can start with '~' or '.', since paths frequently do.
-  var leftMatch   = '[^\\s\\[\\](){}<>"\'\\^!@#$%&*,;:`]';
-  var rightMatch  = '[^\\s\\[\\](){}<>"\'\\^!@#$%&*,;:~.`]';
+  var leftMatch = '[^\\s\\[\\](){}<>"\'\\^!@#$%&*,;:`]';
+  var rightMatch = '[^\\s\\[\\](){}<>"\'\\^!@#$%&*,;:~.`]';
   var insideMatch = '[^\\s\\[\\](){}<>"\'\\^]*';
 
   //Move start to the left.
   var rowText = this.getLineText_(row);
   var lineUpToRange = lib.wc.substring(rowText, 0, endPosition);
-  var leftRegularExpression = new RegExp(leftMatch + insideMatch + "$");
+  var leftRegularExpression = new RegExp(leftMatch + insideMatch + '$');
   var expandedStart = lineUpToRange.search(leftRegularExpression);
   if (expandedStart == -1 || expandedStart > startPosition)
     return;
 
   //Move end to the right.
   var lineFromRange = lib.wc.substring(rowText, startPosition,
-                                       lib.wc.strWidth(rowText));
-  var rightRegularExpression = new RegExp("^" + insideMatch + rightMatch);
+    lib.wc.strWidth(rowText));
+  var rightRegularExpression = new RegExp('^' + insideMatch + rightMatch);
   var found = lineFromRange.match(rightRegularExpression);
   if (!found)
     return;
@@ -9169,7 +9466,7 @@
   this.observers_ = {};
 
   this.DEBUG_ = false;
-}
+};
 
 /**
  * Proxy for the native selection object which understands how to walk up the
@@ -9222,7 +9519,7 @@
  * Returns null if none of the children are found.
  */
 hterm.ScrollPort.Selection.prototype.findFirstChild = function(
-    parent, childAry) {
+  parent, childAry) {
   var node = parent.firstChild;
 
   while (node) {
@@ -9290,7 +9587,7 @@
 
   if (!anchorRow) {
     console.error('Selection anchor is not rooted in a row node: ' +
-                  selection.anchorNode.nodeName);
+      selection.anchorNode.nodeName);
     return;
   }
 
@@ -9301,35 +9598,40 @@
 
   if (!focusRow) {
     console.error('Selection focus is not rooted in a row node: ' +
-                  selection.focusNode.nodeName);
+      selection.focusNode.nodeName);
     return;
   }
 
   if (anchorRow.rowIndex < focusRow.rowIndex) {
     anchorFirst();
 
-  } else if (anchorRow.rowIndex > focusRow.rowIndex) {
+  }
+  else if (anchorRow.rowIndex > focusRow.rowIndex) {
     focusFirst();
 
-  } else if (selection.focusNode == selection.anchorNode) {
+  }
+  else if (selection.focusNode == selection.anchorNode) {
     if (selection.anchorOffset < selection.focusOffset) {
       anchorFirst();
-    } else {
+    }
+    else {
       focusFirst();
     }
 
-  } else {
+  }
+  else {
     // The selection starts and ends in the same row, but isn't contained all
     // in a single node.
     var firstNode = this.findFirstChild(
-        anchorRow, [selection.anchorNode, selection.focusNode]);
+      anchorRow, [selection.anchorNode, selection.focusNode]);
 
     if (!firstNode)
       throw new Error('Unexpected error syncing selection.');
 
     if (firstNode == selection.anchorNode) {
       anchorFirst();
-    } else {
+    }
+    else {
       focusFirst();
     }
   }
@@ -9346,31 +9648,31 @@
 
   this.iframe_ = div.ownerDocument.createElement('iframe');
   this.iframe_.style.cssText = (
-      'border: 0;' +
-      'height: 100%;' +
-      'position: absolute;' +
-      'width: 100%');
+    'border: 0;' +
+    'height: 100%;' +
+    'position: absolute;' +
+    'width: 100%');
 
   // Set the iframe src to # in FF.  Otherwise when the frame's
   // load event fires in FF it clears out the content of the iframe.
-  if ('mozInnerScreenX' in window)  // detect a FF only property
+  if ('mozInnerScreenX' in window) // detect a FF only property
     this.iframe_.src = '#';
 
   div.appendChild(this.iframe_);
 
   this.iframe_.contentWindow.addEventListener('resize',
-                                              this.onResize_.bind(this));
+    this.onResize_.bind(this));
 
   var doc = this.document_ = this.iframe_.contentDocument;
   doc.body.style.cssText = (
-      'margin: 0px;' +
-      'padding: 0px;' +
-      'height: 100%;' +
-      'width: 100%;' +
-      'overflow: hidden;' +
-      'cursor: text;' +
-      '-webkit-user-select: none;' +
-      '-moz-user-select: none;');
+    'margin: 0px;' +
+    'padding: 0px;' +
+    'height: 100%;' +
+    'width: 100%;' +
+    'overflow: hidden;' +
+    'cursor: text;' +
+    '-webkit-user-select: none;' +
+    '-moz-user-select: none;');
 
   var style = doc.createElement('style');
   style.textContent = 'x-row {}';
@@ -9389,22 +9691,22 @@
   this.screen_.setAttribute('role', 'textbox');
   this.screen_.setAttribute('tabindex', '-1');
   this.screen_.style.cssText = (
-      'display: block;' +
-      'font-family: monospace;' +
-      'font-size: 15px;' +
-      'font-variant-ligatures: none;' +
-      'height: 100%;' +
-      'overflow-y: scroll; overflow-x: hidden;' +
-      'white-space: pre;' +
-      'width: 100%;' +
-      'outline: none !important');
+    'display: block;' +
+    'font-family: monospace;' +
+    'font-size: 15px;' +
+    'font-variant-ligatures: none;' +
+    'height: 100%;' +
+    'overflow-y: scroll; overflow-x: hidden;' +
+    'white-space: pre;' +
+    'width: 100%;' +
+    'outline: none !important');
 
   doc.body.appendChild(this.screen_);
 
   this.screen_.addEventListener('scroll', this.onScroll_.bind(this));
   this.screen_.addEventListener('mousewheel', this.onScrollWheel_.bind(this));
   this.screen_.addEventListener(
-      'DOMMouseScroll', this.onScrollWheel_.bind(this));
+    'DOMMouseScroll', this.onScrollWheel_.bind(this));
   this.screen_.addEventListener('copy', this.onCopy_.bind(this));
   this.screen_.addEventListener('paste', this.onPaste_.bind(this));
 
@@ -9413,19 +9715,19 @@
   // This is the main container for the fixed rows.
   this.rowNodes_ = doc.createElement('div');
   this.rowNodes_.style.cssText = (
-      'display: block;' +
-      'position: fixed;' +
-      'overflow: hidden;' +
-      '-webkit-user-select: text;' +
-      '-moz-user-select: text;');
+    'display: block;' +
+    'position: fixed;' +
+    'overflow: hidden;' +
+    '-webkit-user-select: text;' +
+    '-moz-user-select: text;');
   this.screen_.appendChild(this.rowNodes_);
 
   // Two nodes to hold offscreen text during the copy event.
   this.topSelectBag_ = doc.createElement('x-select-bag');
   this.topSelectBag_.style.cssText = (
-      'display: block;' +
-      'overflow: hidden;' +
-      'white-space: pre;');
+    'display: block;' +
+    'overflow: hidden;' +
+    'white-space: pre;');
 
   this.bottomSelectBag_ = this.topSelectBag_.cloneNode();
 
@@ -9462,10 +9764,10 @@
   this.svg_.setAttribute('xmlns', xmlns);
   this.svg_.setAttribute('version', '1.1');
   this.svg_.style.cssText = (
-      'position: absolute;' +
-      'top: 0;' +
-      'left: 0;' +
-      'visibility: hidden');
+    'position: absolute;' +
+    'top: 0;' +
+    'left: 0;' +
+    'visibility: hidden');
 
 
   // We send focus to this element just before a paste happens, so we can
@@ -9483,7 +9785,7 @@
 
   this.screen_.appendChild(this.pasteTarget_);
   this.pasteTarget_.addEventListener(
-      'textInput', this.handlePasteTargetTextInput_.bind(this));
+    'textInput', this.handlePasteTargetTextInput_.bind(this));
 
   this.resize();
 };
@@ -9500,7 +9802,8 @@
   this.screen_.style.fontFamily = fontFamily;
   if (opt_smoothing) {
     this.screen_.style.webkitFontSmoothing = opt_smoothing;
-  } else {
+  }
+  else {
     this.screen_.style.webkitFontSmoothing = '';
   }
 
@@ -9523,7 +9826,8 @@
 
     if (!this.userCssLink_.parentNode)
       this.document_.head.appendChild(this.userCssLink_);
-  } else if (this.userCssLink_.parentNode) {
+  }
+  else if (this.userCssLink_.parentNode) {
     this.document_.head.removeChild(this.userCssLink_);
   }
 };
@@ -9584,7 +9888,7 @@
  * This the widget width minus scrollbar width.
  */
 hterm.ScrollPort.prototype.getScreenWidth = function() {
-  return this.getScreenSize().width ;
+  return this.getScreenSize().width;
 };
 
 /**
@@ -9663,10 +9967,10 @@
     return;
 
   var self = this;
-  this.timeouts_.invalidate = setTimeout(function () {
-      delete self.timeouts_.invalidate;
-      self.invalidate();
-    }, 0);
+  this.timeouts_.invalidate = setTimeout(function() {
+    delete self.timeouts_.invalidate;
+    self.invalidate();
+  }, 0);
 };
 
 /**
@@ -9695,19 +9999,19 @@
   // Number of lines used to average the height of a single character.
   var numberOfLines = 100;
   var rulerSingleLineContents = ('XXXXXXXXXXXXXXXXXXXX' +
-                                 'XXXXXXXXXXXXXXXXXXXX' +
-                                 'XXXXXXXXXXXXXXXXXXXX' +
-                                 'XXXXXXXXXXXXXXXXXXXX' +
-                                 'XXXXXXXXXXXXXXXXXXXX');
+    'XXXXXXXXXXXXXXXXXXXX' +
+    'XXXXXXXXXXXXXXXXXXXX' +
+    'XXXXXXXXXXXXXXXXXXXX' +
+    'XXXXXXXXXXXXXXXXXXXX');
   if (!this.ruler_) {
     this.ruler_ = this.document_.createElement('div');
     this.ruler_.style.cssText = (
-        'position: absolute;' +
-        'top: 0;' +
-        'left: 0;' +
-        'visibility: hidden;' +
-        'height: auto !important;' +
-        'width: auto !important;');
+      'position: absolute;' +
+      'top: 0;' +
+      'left: 0;' +
+      'visibility: hidden;' +
+      'height: auto !important;' +
+      'width: auto !important;');
 
     // We need to put the text in a span to make the size calculation
     // work properly in Firefox
@@ -9731,7 +10035,7 @@
   var rulerSize = hterm.getClientSize(this.rulerSpan_);
 
   var size = new hterm.Size(rulerSize.width / rulerSingleLineContents.length,
-                            rulerSize.height / numberOfLines);
+    rulerSize.height / numberOfLines);
 
   this.ruler_.appendChild(this.rulerBaseline_);
   size.baseline = this.rulerBaseline_.offsetTop;
@@ -9766,8 +10070,8 @@
     // When we're debugging we add padding to the body so that the offscreen
     // elements are visible.
     this.document_.body.style.paddingTop =
-        this.document_.body.style.paddingBottom =
-        3 * this.characterSize.height + 'px';
+      this.document_.body.style.paddingBottom =
+      3 * this.characterSize.height + 'px';
   }
 };
 
@@ -9784,11 +10088,13 @@
 
   var self = this;
   this.publish(
-      'resize', { scrollPort: this },
-      function() {
-        self.scrollRowToBottom(self.rowProvider_.getRowCount());
-        self.scheduleRedraw();
-      });
+    'resize', {
+      scrollPort: this
+    },
+    function() {
+      self.scrollRowToBottom(self.rowProvider_.getRowCount());
+      self.scheduleRedraw();
+    });
 };
 
 /**
@@ -9803,7 +10109,7 @@
   // We don't want to show a partial row because it would be distracting
   // in a terminal, so we floor any fractional row count.
   this.visibleRowCount = lib.f.smartFloorDivide(
-      screenSize.height, this.characterSize.height);
+    screenSize.height, this.characterSize.height);
 
   // Then compute the height of our integral number of rows.
   var visibleRowsHeight = this.visibleRowCount * this.characterSize.height;
@@ -9835,10 +10141,10 @@
   // Resize the scroll area to appear as though it contains every row.
   this.lastRowCount_ = this.rowProvider_.getRowCount();
   this.scrollArea_.style.height = (this.characterSize.height *
-                                   this.lastRowCount_ +
-                                   this.visibleRowTopMargin +
-                                   this.visibleRowBottomMargin +
-                                   'px');
+    this.lastRowCount_ +
+    this.visibleRowTopMargin +
+    this.visibleRowBottomMargin +
+    'px');
 };
 
 /**
@@ -9852,10 +10158,10 @@
     return;
 
   var self = this;
-  this.timeouts_.redraw = setTimeout(function () {
-      delete self.timeouts_.redraw;
-      self.redraw_();
-    }, 0);
+  this.timeouts_.redraw = setTimeout(function() {
+    delete self.timeouts_.redraw;
+    self.redraw_();
+  }, 0);
 };
 
 /**
@@ -9907,7 +10213,7 @@
  */
 hterm.ScrollPort.prototype.drawTopFold_ = function(topRowIndex) {
   if (!this.selection.startRow ||
-      this.selection.startRow.rowIndex >= topRowIndex) {
+    this.selection.startRow.rowIndex >= topRowIndex) {
     // Selection is entirely below the top fold, just make sure the fold is
     // the first child.
     if (this.rowNodes_.firstChild != this.topFold_)
@@ -9917,26 +10223,27 @@
   }
 
   if (!this.selection.isMultiline ||
-      this.selection.endRow.rowIndex >= topRowIndex) {
+    this.selection.endRow.rowIndex >= topRowIndex) {
     // Only the startRow is above the fold.
     if (this.selection.startRow.nextSibling != this.topFold_)
       this.rowNodes_.insertBefore(this.topFold_,
-                                  this.selection.startRow.nextSibling);
-  } else {
+        this.selection.startRow.nextSibling);
+  }
+  else {
     // Both rows are above the fold.
     if (this.selection.endRow.nextSibling != this.topFold_) {
       this.rowNodes_.insertBefore(this.topFold_,
-                                  this.selection.endRow.nextSibling);
+        this.selection.endRow.nextSibling);
     }
 
     // Trim any intermediate lines.
     while (this.selection.startRow.nextSibling !=
-           this.selection.endRow) {
+      this.selection.endRow) {
       this.rowNodes_.removeChild(this.selection.startRow.nextSibling);
     }
   }
 
-  while(this.rowNodes_.firstChild != this.selection.startRow) {
+  while (this.rowNodes_.firstChild != this.selection.startRow) {
     this.rowNodes_.removeChild(this.rowNodes_.firstChild);
   }
 };
@@ -9956,7 +10263,7 @@
  */
 hterm.ScrollPort.prototype.drawBottomFold_ = function(bottomRowIndex) {
   if (!this.selection.endRow ||
-      this.selection.endRow.rowIndex <= bottomRowIndex) {
+    this.selection.endRow.rowIndex <= bottomRowIndex) {
     // Selection is entirely above the bottom fold, just make sure the fold is
     // the last child.
     if (this.rowNodes_.lastChild != this.bottomFold_)
@@ -9966,26 +10273,27 @@
   }
 
   if (!this.selection.isMultiline ||
-      this.selection.startRow.rowIndex <= bottomRowIndex) {
+    this.selection.startRow.rowIndex <= bottomRowIndex) {
     // Only the endRow is below the fold.
     if (this.bottomFold_.nextSibling != this.selection.endRow)
       this.rowNodes_.insertBefore(this.bottomFold_,
-                                  this.selection.endRow);
-  } else {
+        this.selection.endRow);
+  }
+  else {
     // Both rows are below the fold.
     if (this.bottomFold_.nextSibling != this.selection.startRow) {
       this.rowNodes_.insertBefore(this.bottomFold_,
-                                  this.selection.startRow);
+        this.selection.startRow);
     }
 
     // Trim any intermediate lines.
     while (this.selection.startRow.nextSibling !=
-           this.selection.endRow) {
+      this.selection.endRow) {
       this.rowNodes_.removeChild(this.selection.startRow.nextSibling);
     }
   }
 
-  while(this.rowNodes_.lastChild != this.selection.endRow) {
+  while (this.rowNodes_.lastChild != this.selection.endRow) {
     this.rowNodes_.removeChild(this.rowNodes_.lastChild);
   }
 };
@@ -10005,7 +10313,7 @@
  * adjusted around them.
  */
 hterm.ScrollPort.prototype.drawVisibleRows_ = function(
-    topRowIndex, bottomRowIndex) {
+  topRowIndex, bottomRowIndex) {
   var self = this;
 
   // Keep removing nodes, starting with currentNode, until we encounter
@@ -10033,7 +10341,7 @@
   var node = this.topFold_.nextSibling;
 
   var targetDrawCount = Math.min(this.visibleRowCount,
-                                 this.rowProvider_.getRowCount());
+    this.rowProvider_.getRowCount());
 
   for (var drawCount = 0; drawCount < targetDrawCount; drawCount++) {
     var rowIndex = topRowIndex + drawCount;
@@ -10150,7 +10458,8 @@
 
   if (this.previousRowNodeCache_ && rowIndex in this.previousRowNodeCache_) {
     node = this.previousRowNodeCache_[rowIndex];
-  } else {
+  }
+  else {
     node = this.rowProvider_.getRowNode(rowIndex);
   }
 
@@ -10174,7 +10483,8 @@
     firstRow = this.fetchRowNode_(0);
     this.rowNodes_.insertBefore(firstRow, this.topFold_);
     this.syncRowNodesDimensions_();
-  } else {
+  }
+  else {
     firstRow = this.topFold_.nextSibling;
   }
 
@@ -10188,7 +10498,8 @@
 
     lastRow = this.fetchRowNode_(lastRowIndex);
     this.rowNodes_.appendChild(lastRow);
-  } else {
+  }
+  else {
     lastRow = this.bottomFold_.previousSibling.rowIndex;
   }
 
@@ -10204,8 +10515,8 @@
  */
 hterm.ScrollPort.prototype.getScrollMax_ = function(e) {
   return (hterm.getClientHeight(this.scrollArea_) +
-          this.visibleRowTopMargin + this.visibleRowBottomMargin -
-          hterm.getClientHeight(this.screen_));
+    this.visibleRowTopMargin + this.visibleRowBottomMargin -
+    hterm.getClientHeight(this.screen_));
 };
 
 /**
@@ -10220,7 +10531,7 @@
     rowIndex + this.visibleRowCount >= this.lastRowCount_);
 
   var scrollTop = rowIndex * this.characterSize.height +
-      this.visibleRowTopMargin;
+    this.visibleRowTopMargin;
 
   var scrollMax = this.getScrollMax_();
   if (scrollTop > scrollMax)
@@ -10245,7 +10556,7 @@
     rowIndex + this.visibleRowCount >= this.lastRowCount_);
 
   var scrollTop = rowIndex * this.characterSize.height +
-      this.visibleRowTopMargin + this.visibleRowBottomMargin;
+    this.visibleRowTopMargin + this.visibleRowBottomMargin;
   scrollTop -= this.visibleRowCount * this.characterSize.height;
 
   if (scrollTop < 0)
@@ -10286,7 +10597,7 @@
 hterm.ScrollPort.prototype.onScroll_ = function(e) {
   var screenSize = this.getScreenSize();
   if (screenSize.width != this.lastScreenWidth_ ||
-      screenSize.height != this.lastScreenHeight_) {
+    screenSize.height != this.lastScreenHeight_) {
     // This event may also fire during a resize (but before the resize event!).
     // This happens when the browser moves the scrollbar as part of the resize.
     // In these cases, we want to ignore the scroll event and let onResize
@@ -10297,7 +10608,9 @@
   }
 
   this.redraw_();
-  this.publish('scroll', { scrollPort: this });
+  this.publish('scroll', {
+    scrollPort: this
+  });
 };
 
 /**
@@ -10365,7 +10678,7 @@
  * Clients may call event.preventDefault() if they want to keep the scrollport
  * from also handling the events.
  */
-hterm.ScrollPort.prototype.onCopy = function(e) { };
+hterm.ScrollPort.prototype.onCopy = function(e) {};
 
 /**
  * Handler for copy-to-clipboard events.
@@ -10385,7 +10698,7 @@
   this.selection.sync();
 
   if (!this.selection.startRow ||
-      this.selection.endRow.rowIndex - this.selection.startRow.rowIndex < 2) {
+    this.selection.endRow.rowIndex - this.selection.startRow.rowIndex < 2) {
     return;
   }
 
@@ -10399,15 +10712,16 @@
     if (this.selection.endRow.rowIndex < topRowIndex) {
       // Entire selection is above the top fold.
       endBackfillIndex = this.selection.endRow.rowIndex;
-    } else {
+    }
+    else {
       // Selection extends below the top fold.
       endBackfillIndex = this.topFold_.nextSibling.rowIndex;
     }
 
     this.topSelectBag_.textContent = this.rowProvider_.getRowsText(
-        this.selection.startRow.rowIndex + 1, endBackfillIndex);
+      this.selection.startRow.rowIndex + 1, endBackfillIndex);
     this.rowNodes_.insertBefore(this.topSelectBag_,
-                                this.selection.startRow.nextSibling);
+      this.selection.startRow.nextSibling);
     this.syncRowNodesDimensions_();
   }
 
@@ -10418,13 +10732,14 @@
     if (this.selection.startRow.rowIndex > bottomRowIndex) {
       // Entire selection is below the bottom fold.
       startBackfillIndex = this.selection.startRow.rowIndex + 1;
-    } else {
+    }
+    else {
       // Selection starts above the bottom fold.
       startBackfillIndex = this.bottomFold_.previousSibling.rowIndex + 1;
     }
 
     this.bottomSelectBag_.textContent = this.rowProvider_.getRowsText(
-        startBackfillIndex, this.selection.endRow.rowIndex);
+      startBackfillIndex, this.selection.endRow.rowIndex);
     this.rowNodes_.insertBefore(this.bottomSelectBag_, this.selection.endRow);
   }
 };
@@ -10439,7 +10754,7 @@
 
   var key = String.fromCharCode(e.which);
   var lowerKey = key.toLowerCase();
-  if ((e.ctrlKey || e.metaKey) && lowerKey == "v")
+  if ((e.ctrlKey || e.metaKey) && lowerKey == 'v')
     this.pasteTarget_.focus();
 };
 
@@ -10451,10 +10766,12 @@
 
   var self = this;
   setTimeout(function() {
-      self.publish('paste', { text: self.pasteTarget_.value });
-      self.pasteTarget_.value = '';
-      self.screen_.focus();
-    }, 0);
+    self.publish('paste', {
+      text: self.pasteTarget_.value
+    });
+    self.pasteTarget_.value = '';
+    self.screen_.focus();
+  }, 0);
 };
 
 /**
@@ -10487,9 +10804,9 @@
 'use strict';
 
 lib.rtdep('lib.colors', 'lib.PreferenceManager', 'lib.resource', 'lib.wc',
-          'lib.f', 'hterm.Keyboard', 'hterm.Options', 'hterm.PreferenceManager',
-          'hterm.Screen', 'hterm.ScrollPort', 'hterm.Size',
-          'hterm.TextAttributes', 'hterm.VT');
+  'lib.f', 'hterm.Keyboard', 'hterm.Options', 'hterm.PreferenceManager',
+  'hterm.Screen', 'hterm.ScrollPort', 'hterm.Size',
+  'hterm.TextAttributes', 'hterm.VT');
 
 /**
  * Constructor for the Terminal class.
@@ -10628,7 +10945,9 @@
   this.setDefaultTabStops();
 
   this.setProfile(opt_profileId || 'default',
-                  function() { this.onTerminalReady(); }.bind(this));
+    function() {
+      this.onTerminalReady();
+    }.bind(this));
 };
 
 /**
@@ -10647,7 +10966,7 @@
  * The terminal initialization is asynchronous, and shouldn't be used before
  * this method is called.
  */
-hterm.Terminal.prototype.onTerminalReady = function() { };
+hterm.Terminal.prototype.onTerminalReady = function() {};
 
 /**
  * Default tab with of 8 to match xterm.
@@ -10679,12 +10998,15 @@
       if (v == null) {
         if (navigator.language.toLowerCase() == 'en-us') {
           v = 'none';
-        } else {
+        }
+        else {
           v = 'right-alt';
         }
-      } else if (typeof v == 'string') {
+      }
+      else if (typeof v == 'string') {
         v = v.toLowerCase();
-      } else {
+      }
+      else {
         v = 'none';
       }
 
@@ -10713,8 +11035,9 @@
       var ary = v.match(/^lib-resource:(\S+)/);
       if (ary) {
         terminal.bellAudio_.setAttribute('src',
-                                         lib.resource.getDataUrl(ary[1]));
-      } else {
+          lib.resource.getDataUrl(ary[1]));
+      }
+      else {
         terminal.bellAudio_.setAttribute('src', v);
       }
     },
@@ -10722,7 +11045,7 @@
     'desktop-notification-bell': function(v) {
       if (v && Notification) {
         terminal.desktopNotificationBell_ =
-            Notification.permission === 'granted';
+          Notification.permission === 'granted';
         if (!terminal.desktopNotificationBell_) {
           // Note: We don't call Notification.requestPermission here because
           // Chrome requires the call be the result of a user action (such as an
@@ -10731,9 +11054,10 @@
           // A way of working around this would be to display a dialog in the
           // terminal with a "click-to-request-permission" button.
           console.warn('desktop-notification-bell is true but we do not have ' +
-                       'permission to display notifications.');
+            'permission to display notifications.');
         }
-      } else {
+      }
+      else {
         terminal.desktopNotificationBell_ = false;
       }
     },
@@ -10761,7 +11085,7 @@
     'character-map-overrides': function(v) {
       if (!(v == null || v instanceof Object)) {
         console.warn('Preference character-map-modifications is not an ' +
-                     'object: ' + v);
+          'object: ' + v);
         return;
       }
 
@@ -10779,16 +11103,18 @@
     },
 
     'cursor-blink-cycle': function(v) {
-        if (v instanceof Array &&
-            typeof v[0] == 'number' &&
-            typeof v[1] == 'number') {
-          terminal.cursorBlinkCycle_ = v;
-        } else if (typeof v == 'number') {
-          terminal.cursorBlinkCycle_ = [v, v];
-        } else {
-          // Fast blink indicates an error.
-          terminal.cursorBlinkCycle_ = [100, 100];
-        }
+      if (v instanceof Array &&
+        typeof v[0] == 'number' &&
+        typeof v[1] == 'number') {
+        terminal.cursorBlinkCycle_ = v;
+      }
+      else if (typeof v == 'number') {
+        terminal.cursorBlinkCycle_ = [v, v];
+      }
+      else {
+        // Fast blink indicates an error.
+        terminal.cursorBlinkCycle_ = [100, 100];
+      }
     },
 
     'cursor-color': function(v) {
@@ -10798,7 +11124,7 @@
     'color-palette-overrides': function(v) {
       if (!(v == null || v instanceof Object || v instanceof Array)) {
         console.warn('Preference color-palette-overrides is not an array or ' +
-                     'object: ' + v);
+          'object: ' + v);
         return;
       }
 
@@ -10911,7 +11237,8 @@
 
       try {
         terminal.keyboard.bindings.addBindings(v);
-      } catch (ex) {
+      }
+      catch (ex) {
         console.error('Error in keybindings preference: ' + ex);
       }
     },
@@ -10977,12 +11304,12 @@
     },
 
     'receive-encoding': function(v) {
-       if (!(/^(utf-8|raw)$/).test(v)) {
-         console.warn('Invalid value for "receive-encoding": ' + v);
-         v = 'utf-8';
-       }
+      if (!(/^(utf-8|raw)$/).test(v)) {
+        console.warn('Invalid value for "receive-encoding": ' + v);
+        v = 'utf-8';
+      }
 
-       terminal.vt.characterEncoding = v;
+      terminal.vt.characterEncoding = v;
     },
 
     'scroll-on-keystroke': function(v) {
@@ -11002,12 +11329,12 @@
     },
 
     'send-encoding': function(v) {
-       if (!(/^(utf-8|raw)$/).test(v)) {
-         console.warn('Invalid value for "send-encoding": ' + v);
-         v = 'utf-8';
-       }
+      if (!(/^(utf-8|raw)$/).test(v)) {
+        console.warn('Invalid value for "send-encoding": ' + v);
+        v = 'utf-8';
+      }
 
-       terminal.keyboard.characterEncoding = v;
+      terminal.keyboard.characterEncoding = v;
     },
 
     'shift-insert-paste': function(v) {
@@ -11088,9 +11415,9 @@
 hterm.Terminal.prototype.setBackgroundColor = function(color) {
   this.backgroundColor_ = lib.colors.normalizeCSS(color);
   this.primaryScreen_.textAttributes.setDefaults(
-      this.foregroundColor_, this.backgroundColor_);
+    this.foregroundColor_, this.backgroundColor_);
   this.alternateScreen_.textAttributes.setDefaults(
-      this.foregroundColor_, this.backgroundColor_);
+    this.foregroundColor_, this.backgroundColor_);
   this.scrollPort_.setBackgroundColor(color);
 };
 
@@ -11117,9 +11444,9 @@
 hterm.Terminal.prototype.setForegroundColor = function(color) {
   this.foregroundColor_ = lib.colors.normalizeCSS(color);
   this.primaryScreen_.textAttributes.setDefaults(
-      this.foregroundColor_, this.backgroundColor_);
+    this.foregroundColor_, this.backgroundColor_);
   this.alternateScreen_.textAttributes.setDefaults(
-      this.foregroundColor_, this.backgroundColor_);
+    this.foregroundColor_, this.backgroundColor_);
   this.scrollPort_.setForegroundColor(color);
 };
 
@@ -11148,17 +11475,17 @@
     environment = {};
 
   var self = this;
-  this.command = new commandClass(
-      { argString: argString || '',
-        io: this.io.push(),
-        environment: environment,
-        onExit: function(code) {
-          self.io.pop();
-          self.uninstallKeyboard();
-          if (self.prefs_.get('close-on-exit'))
-              window.close();
-        }
-      });
+  this.command = new commandClass({
+    argString: argString || '',
+    io: this.io.push(),
+    environment: environment,
+    onExit: function(code) {
+      self.io.pop();
+      self.uninstallKeyboard();
+      if (self.prefs_.get('close-on-exit'))
+        window.close();
+    }
+  });
 
   this.installKeyboard();
   this.command.run();
@@ -11181,14 +11508,14 @@
  */
 hterm.Terminal.prototype.installKeyboard = function() {
   this.keyboard.installKeyboard(this.scrollPort_.getDocument().body);
-}
+};
 
 /**
  * Uninstall the keyboard handler for this terminal.
  */
 hterm.Terminal.prototype.uninstallKeyboard = function() {
   this.keyboard.installKeyboard(null);
-}
+};
 
 /**
  * Set the font size for this terminal.
@@ -11206,7 +11533,7 @@
   this.scrollPort_.setFontSize(px);
   if (this.wcCssRule_) {
     this.wcCssRule_.style.width = this.scrollPort_.characterSize.width * 2 +
-        'px';
+      'px';
   }
 };
 
@@ -11233,7 +11560,7 @@
  */
 hterm.Terminal.prototype.syncFontFamily = function() {
   this.scrollPort_.setFontFamily(this.prefs_.get('font-family'),
-                                 this.prefs_.get('font-smoothing'));
+    this.prefs_.get('font-smoothing'));
   this.syncBoldSafeState();
 };
 
@@ -11251,7 +11578,8 @@
   var ary = navigator.userAgent.match(/\(X11;\s+(\S+)/);
   if (!ary || ary[2] == 'CrOS') {
     this.mousePasteButton = 2;
-  } else {
+  }
+  else {
     this.mousePasteButton = 3;
   }
 };
@@ -11274,8 +11602,8 @@
   var isBoldSafe = normalSize.equals(boldSize);
   if (!isBoldSafe) {
     console.warn('Bold characters disabled: Size of bold weight differs ' +
-                 'from normal.  Font family is: ' +
-                 this.scrollPort_.getFontFamily());
+      'from normal.  Font family is: ' +
+      this.scrollPort_.getFontFamily());
   }
 
   this.primaryScreen_.textAttributes.enableBold = isBoldSafe;
@@ -11287,8 +11615,8 @@
  */
 hterm.Terminal.prototype.syncBlinkState = function() {
   this.document_.documentElement.style.setProperty(
-      '--hterm-blink-node-duration',
-      this.prefs_.get('enable-blink') ? '0.7s' : '0');
+    '--hterm-blink-node-duration',
+    this.prefs_.get('enable-blink') ? '0.7s' : '0');
 };
 
 /**
@@ -11346,7 +11674,7 @@
   var column = lib.f.clamp(cursor.column, 0, this.screenSize.width - 1);
   this.screen_.setCursorPosition(row, column);
   if (cursor.column > column ||
-      cursor.column == column && cursor.overflow) {
+    cursor.column == column && cursor.overflow) {
     this.screen_.cursorPosition.overflow = true;
   }
 };
@@ -11366,7 +11694,7 @@
 hterm.Terminal.prototype.setCursorShape = function(shape) {
   this.cursorShape_ = shape;
   this.restyleCursor_();
-}
+};
 
 /**
  * Get the cursor shape
@@ -11375,7 +11703,7 @@
  */
 hterm.Terminal.prototype.getCursorShape = function() {
   return this.cursorShape_;
-}
+};
 
 /**
  * Set the width of the terminal, resizing the UI to match.
@@ -11389,8 +11717,8 @@
   }
 
   this.div_.style.width = Math.ceil(
-      this.scrollPort_.characterSize.width *
-      columnCount + this.scrollPort_.currentScrollbarWidthPx) + 'px';
+    this.scrollPort_.characterSize.width *
+    columnCount + this.scrollPort_.currentScrollbarWidthPx) + 'px';
   this.realizeSize_(columnCount, this.screenSize.height);
   this.scheduleSyncCursorPosition_();
 };
@@ -11407,7 +11735,7 @@
   }
 
   this.div_.style.height =
-      this.scrollPort_.characterSize.height * rowCount + 'px';
+    this.scrollPort_.characterSize.height * rowCount + 'px';
   this.realizeSize_(this.screenSize.width, rowCount);
   this.scheduleSyncCursorPosition_();
 };
@@ -11454,7 +11782,8 @@
   if (deltaColumns > 0) {
     if (this.defaultTabStops)
       this.setDefaultTabStops(this.screenSize.width - deltaColumns);
-  } else {
+  }
+  else {
     for (var i = this.tabStops_.length - 1; i >= 0; i--) {
       if (this.tabStops_[i] < columnCount)
         break;
@@ -11510,13 +11839,14 @@
     // We just removed rows from the top of the screen, we need to update
     // the cursor to match.
     cursor.row = Math.max(cursor.row - deltaRows, 0);
-  } else if (deltaRows > 0) {
+  }
+  else if (deltaRows > 0) {
     // Screen got larger.
 
     if (deltaRows <= this.scrollbackRows_.length) {
       var scrollbackCount = Math.min(deltaRows, this.scrollbackRows_.length);
       var rows = this.scrollbackRows_.splice(
-          this.scrollbackRows_.length - scrollbackCount, scrollbackCount);
+        this.scrollbackRows_.length - scrollbackCount, scrollbackCount);
       this.screen_.unshiftRows(rows);
       deltaRows -= scrollbackCount;
       cursor.row += scrollbackCount;
@@ -11755,7 +12085,7 @@
   this.scrollPort_.setBackgroundImage(this.prefs_.get('background-image'));
   this.scrollPort_.setBackgroundSize(this.prefs_.get('background-size'));
   this.scrollPort_.setBackgroundPosition(
-      this.prefs_.get('background-position'));
+    this.prefs_.get('background-position'));
   this.scrollPort_.setUserCss(this.prefs_.get('user-css'));
 
   this.div_.focus = this.focus.bind(this);
@@ -11765,11 +12095,13 @@
 
   this.setScrollbarVisible(this.prefs_.get('scrollbar-visible'));
   this.setScrollWheelMoveMultipler(
-      this.prefs_.get('scroll-wheel-move-multiplier'));
+    this.prefs_.get('scroll-wheel-move-multiplier'));
 
   this.document_ = this.scrollPort_.getDocument();
 
-  this.document_.body.oncontextmenu = function() { return false; };
+  this.document_.body.oncontextmenu = function() {
+    return false;
+  };
 
   var onMouse = this.onMouse_.bind(this);
   var screenNode = this.scrollPort_.getScreenNode();
@@ -11779,7 +12111,7 @@
   this.scrollPort_.onScrollWheel = onMouse;
 
   screenNode.addEventListener(
-      'focus', this.onFocusChange_.bind(this, true));
+    'focus', this.onFocusChange_.bind(this, true));
   // Listen for mousedown events on the screenNode as in FF the focus
   // events don't bubble.
   screenNode.addEventListener('mousedown', function() {
@@ -11787,35 +12119,35 @@
   }.bind(this));
 
   screenNode.addEventListener(
-      'blur', this.onFocusChange_.bind(this, false));
+    'blur', this.onFocusChange_.bind(this, false));
 
   var style = this.document_.createElement('style');
   style.textContent =
-      ('.cursor-node[focus="false"] {' +
-       '  box-sizing: border-box;' +
-       '  background-color: transparent !important;' +
-       '  border-width: 2px;' +
-       '  border-style: solid;' +
-       '}' +
-       '.wc-node {' +
-       '  display: inline-block;' +
-       '  text-align: center;' +
-       '  width: ' + this.scrollPort_.characterSize.width * 2 + 'px;' +
-       '}' +
-       ':root {' +
-       '  --hterm-blink-node-duration: 0.7s;' +
-       '}' +
-       '@keyframes blink {' +
-       '  from { opacity: 1.0; }' +
-       '  to { opacity: 0.0; }' +
-       '}' +
-       '.blink-node {' +
-       '  animation-name: blink;' +
-       '  animation-duration: var(--hterm-blink-node-duration);' +
-       '  animation-iteration-count: infinite;' +
-       '  animation-timing-function: ease-in-out;' +
-       '  animation-direction: alternate;' +
-       '}');
+    ('.cursor-node[focus="false"] {' +
+      '  box-sizing: border-box;' +
+      '  background-color: transparent !important;' +
+      '  border-width: 2px;' +
+      '  border-style: solid;' +
+      '}' +
+      '.wc-node {' +
+      '  display: inline-block;' +
+      '  text-align: center;' +
+      '  width: ' + this.scrollPort_.characterSize.width * 2 + 'px;' +
+      '}' +
+      ':root {' +
+      '  --hterm-blink-node-duration: 0.7s;' +
+      '}' +
+      '@keyframes blink {' +
+      '  from { opacity: 1.0; }' +
+      '  to { opacity: 0.0; }' +
+      '}' +
+      '.blink-node {' +
+      '  animation-name: blink;' +
+      '  animation-duration: var(--hterm-blink-node-duration);' +
+      '  animation-iteration-count: infinite;' +
+      '  animation-timing-function: ease-in-out;' +
+      '  animation-direction: alternate;' +
+      '}');
   this.document_.head.appendChild(style);
 
   var styleSheets = this.document_.styleSheets;
@@ -11825,13 +12157,13 @@
   this.cursorNode_ = this.document_.createElement('div');
   this.cursorNode_.className = 'cursor-node';
   this.cursorNode_.style.cssText =
-      ('position: absolute;' +
-       'top: -99px;' +
-       'display: block;' +
-       'width: ' + this.scrollPort_.characterSize.width + 'px;' +
-       'height: ' + this.scrollPort_.characterSize.height + 'px;' +
-       '-webkit-transition: opacity, background-color 100ms linear;' +
-       '-moz-transition: opacity, background-color 100ms linear;');
+    ('position: absolute;' +
+      'top: -99px;' +
+      'display: block;' +
+      'width: ' + this.scrollPort_.characterSize.width + 'px;' +
+      'height: ' + this.scrollPort_.characterSize.height + 'px;' +
+      '-webkit-transition: opacity, background-color 100ms linear;' +
+      '-moz-transition: opacity, background-color 100ms linear;');
 
   this.setCursorColor(this.prefs_.get('cursor-color'));
   this.setCursorBlink(!!this.prefs_.get('cursor-blink'));
@@ -11848,24 +12180,23 @@
   // It's a hack, but it's the cleanest way I could find.
   this.scrollBlockerNode_ = this.document_.createElement('div');
   this.scrollBlockerNode_.style.cssText =
-      ('position: absolute;' +
-       'top: -99px;' +
-       'display: block;' +
-       'width: 10px;' +
-       'height: 10px;');
+    ('position: absolute;' +
+      'top: -99px;' +
+      'display: block;' +
+      'width: 10px;' +
+      'height: 10px;');
   this.document_.body.appendChild(this.scrollBlockerNode_);
 
   this.scrollPort_.onScrollWheel = onMouse;
-  ['mousedown', 'mouseup', 'mousemove', 'click', 'dblclick',
-   ].forEach(function(event) {
-       this.scrollBlockerNode_.addEventListener(event, onMouse);
-       this.cursorNode_.addEventListener(event, onMouse);
-       this.document_.addEventListener(event, onMouse);
-     }.bind(this));
+  ['mousedown', 'mouseup', 'mousemove', 'click', 'dblclick',].forEach(function(event) {
+    this.scrollBlockerNode_.addEventListener(event, onMouse);
+    this.cursorNode_.addEventListener(event, onMouse);
+    this.document_.addEventListener(event, onMouse);
+  }.bind(this));
 
   this.cursorNode_.addEventListener('mousedown', function() {
-      setTimeout(this.focus.bind(this));
-    }.bind(this));
+    setTimeout(this.focus.bind(this));
+  }.bind(this));
 
   this.setReverseVideo(false);
 
@@ -12031,7 +12362,8 @@
   if (fromIndex < toIndex) {
     start = fromIndex;
     end = toIndex + count;
-  } else {
+  }
+  else {
     start = toIndex;
     end = fromIndex + count;
   }
@@ -12071,7 +12403,7 @@
  * The string is *not* parsed for escape codes.  Use the interpret() method if
  * that's what you're after.
  *
- * @param{string} str The string to print.
+ * @param {string} str The string to print.
  */
 hterm.Terminal.prototype.print = function(str) {
   var startOffset = 0;
@@ -12098,9 +12430,10 @@
       // last printed character should be the last of the string.
       // TODO: This will add to our problems with multibyte UTF-16 characters.
       substr = lib.wc.substr(str, startOffset, count - 1) +
-          lib.wc.substr(str, strWidth - 1);
+        lib.wc.substr(str, strWidth - 1);
       count = strWidth;
-    } else {
+    }
+    else {
       substr = lib.wc.substr(str, startOffset, count);
     }
 
@@ -12110,8 +12443,9 @@
         this.screen_.textAttributes.wcNode = true;
 
       if (this.options_.insertMode) {
-          this.screen_.insertString(tokens[i].str);
-      } else {
+        this.screen_.insertString(tokens[i].str);
+      }
+      else {
         this.screen_.overwriteString(tokens[i].str);
       }
       this.screen_.textAttributes.wcNode = false;
@@ -12147,7 +12481,8 @@
   if (scrollTop == 0 && scrollBottom == this.screenSize.height - 1) {
     this.vtScrollTop_ = null;
     this.vtScrollBottom_ = null;
-  } else {
+  }
+  else {
     this.vtScrollTop_ = scrollTop;
     this.vtScrollBottom_ = scrollBottom;
   }
@@ -12183,7 +12518,7 @@
     return this.vtScrollBottom_;
 
   return this.screenSize.height - 1;
-}
+};
 
 /**
  * Process a '\n' character.
@@ -12196,7 +12531,7 @@
  */
 hterm.Terminal.prototype.newLine = function() {
   var cursorAtEndOfScreen = (this.screen_.cursorPosition.row ==
-                             this.screen_.rowsArray.length - 1);
+    this.screen_.rowsArray.length - 1);
 
   if (this.vtScrollBottom_ != null) {
     // A VT Scroll region is active, we never append new rows.
@@ -12204,19 +12539,23 @@
       // We're at the end of the VT Scroll Region, perform a VT scroll.
       this.vtScrollUp(1);
       this.setAbsoluteCursorPosition(this.screen_.cursorPosition.row, 0);
-    } else if (cursorAtEndOfScreen) {
+    }
+    else if (cursorAtEndOfScreen) {
       // We're at the end of the screen, the only thing to do is put the
       // cursor to column 0.
       this.setAbsoluteCursorPosition(this.screen_.cursorPosition.row, 0);
-    } else {
+    }
+    else {
       // Anywhere else, advance the cursor row, and reset the column.
       this.setAbsoluteCursorPosition(this.screen_.cursorPosition.row + 1, 0);
     }
-  } else if (cursorAtEndOfScreen) {
+  }
+  else if (cursorAtEndOfScreen) {
     // We're at the end of the screen.  Append a new row to the terminal,
     // shifting the top row into the scrollback.
     this.appendRows_(1);
-  } else {
+  }
+  else {
     // Anywhere else in the screen just moves the cursor.
     this.setAbsoluteCursorPosition(this.screen_.cursorPosition.row + 1, 0);
   }
@@ -12237,7 +12576,8 @@
 hterm.Terminal.prototype.formFeed = function() {
   if (this.options_.autoCarriageReturn) {
     this.newLine();
-  } else {
+  }
+  else {
     this.lineFeed();
   }
 };
@@ -12253,7 +12593,8 @@
 
   if (currentRow == scrollTop) {
     this.insertLines(1);
-  } else {
+  }
+  else {
     this.setAbsoluteCursorRow(currentRow - 1);
   }
 };
@@ -12298,10 +12639,10 @@
   var count = opt_count ? Math.min(opt_count, maxCount) : maxCount;
 
   if (this.screen_.textAttributes.background ===
-      this.screen_.textAttributes.DEFAULT_COLOR) {
+    this.screen_.textAttributes.DEFAULT_COLOR) {
     var cursorRow = this.screen_.rowsArray[this.screen_.cursorPosition.row];
     if (hterm.TextAttributes.nodeWidth(cursorRow) <=
-        this.screen_.cursorPosition.column + count) {
+      this.screen_.cursorPosition.column + count) {
       this.screen_.deleteChars(count);
       this.clearCursorOverflow();
       return;
@@ -12578,7 +12919,8 @@
 hterm.Terminal.prototype.setCursorPosition = function(row, column) {
   if (this.options_.originMode) {
     this.setRelativeCursorPosition(row, column);
-  } else {
+  }
+  else {
     this.setAbsoluteCursorPosition(row, column);
   }
 };
@@ -12659,9 +13001,9 @@
 
   var self = this;
   this.timeouts_.redraw = setTimeout(function() {
-      delete self.timeouts_.redraw;
-      self.scrollPort_.redraw_();
-    }, 0);
+    delete self.timeouts_.redraw;
+    self.scrollPort_.redraw_();
+  }, 0);
 };
 
 /**
@@ -12679,9 +13021,9 @@
 
   var self = this;
   this.timeouts_.scrollDown = setTimeout(function() {
-      delete self.timeouts_.scrollDown;
-      self.scrollPort_.scrollRowToBottom(self.getRowCount());
-    }, 10);
+    delete self.timeouts_.scrollDown;
+    self.scrollPort_.scrollRowToBottom(self.getRowCount());
+  }, 10);
 };
 
 /**
@@ -12702,10 +13044,10 @@
   count = count || 1;
   var minHeight = (this.options_.originMode ? this.getVTScrollTop() : 0);
   var maxHeight = (this.options_.originMode ? this.getVTScrollBottom() :
-                   this.screenSize.height - 1);
+    this.screenSize.height - 1);
 
   var row = lib.f.clamp(this.screen_.cursorPosition.row + count,
-                        minHeight, maxHeight);
+    minHeight, maxHeight);
   this.setAbsoluteCursorRow(row);
 };
 
@@ -12749,7 +13091,8 @@
 
     this.setCursorPosition(Math.max(newRow, 0), newColumn);
 
-  } else {
+  }
+  else {
     var newColumn = Math.max(currentColumn - count, 0);
     this.setCursorColumn(newColumn);
   }
@@ -12767,7 +13110,7 @@
     return;
 
   var column = lib.f.clamp(this.screen_.cursorPosition.column + count,
-                           0, this.screenSize.width - 1);
+    0, this.screenSize.width - 1);
   this.setCursorColumn(column);
 };
 
@@ -12787,7 +13130,8 @@
   if (state) {
     this.scrollPort_.setForegroundColor(this.prefs_.get('background-color'));
     this.scrollPort_.setBackgroundColor(this.prefs_.get('foreground-color'));
-  } else {
+  }
+  else {
     this.scrollPort_.setForegroundColor(this.prefs_.get('foreground-color'));
     this.scrollPort_.setBackgroundColor(this.prefs_.get('background-color'));
   }
@@ -12800,12 +13144,12 @@
  */
 hterm.Terminal.prototype.ringBell = function() {
   this.cursorNode_.style.backgroundColor =
-      this.scrollPort_.getForegroundColor();
+    this.scrollPort_.getForegroundColor();
 
   var self = this;
   setTimeout(function() {
-      self.cursorNode_.style.backgroundColor = self.prefs_.get('cursor-color');
-    }, 200);
+    self.cursorNode_.style.backgroundColor = self.prefs_.get('cursor-color');
+  }, 200);
 
   // bellSquelchTimeout_ affects both audio and notification bells.
   if (this.bellSquelchTimeout_)
@@ -12814,19 +13158,23 @@
   if (this.bellAudio_.getAttribute('src')) {
     this.bellAudio_.play();
     this.bellSequelchTimeout_ = setTimeout(function() {
-        delete this.bellSquelchTimeout_;
-      }.bind(this), 500);
-  } else {
+      delete this.bellSquelchTimeout_;
+    }.bind(this), 500);
+  }
+  else {
     delete this.bellSquelchTimeout_;
   }
 
   if (this.desktopNotificationBell_ && !this.document_.hasFocus()) {
     var n = new Notification(
-        lib.f.replaceVars(hterm.desktopNotificationTitle,
-                          {'title': window.document.title || 'hterm'}));
+      lib.f.replaceVars(hterm.desktopNotificationTitle, {
+        'title': window.document.title || 'hterm'
+      }));
     this.bellNotificationList_.push(n);
     // TODO: Should we try to raise the window here?
-    n.onclick = function() { self.closeBellNotifications_(); };
+    n.onclick = function() {
+      self.closeBellNotifications_();
+    };
   }
 };
 
@@ -12923,7 +13271,7 @@
   this.screen_ = state ? this.alternateScreen_ : this.primaryScreen_;
 
   if (this.screen_.rowsArray.length &&
-      this.screen_.rowsArray[0].rowIndex != this.scrollbackRows_.length) {
+    this.screen_.rowsArray[0].rowIndex != this.scrollbackRows_.length) {
     // If the screen changed sizes while we were away, our rowIndexes may
     // be incorrect.
     var offset = this.scrollbackRows_.length;
@@ -12997,7 +13345,8 @@
       return;
 
     this.onCursorBlink_();
-  } else {
+  }
+  else {
     if (this.timeouts_.cursorBlink) {
       clearTimeout(this.timeouts_.cursorBlink);
       delete this.timeouts_.cursorBlink;
@@ -13013,7 +13362,7 @@
   var topRowIndex = this.scrollPort_.getTopRowIndex();
   var bottomRowIndex = this.scrollPort_.getBottomRowIndex(topRowIndex);
   var cursorRowIndex = this.scrollbackRows_.length +
-      this.screen_.cursorPosition.row;
+    this.screen_.cursorPosition.row;
 
   if (cursorRowIndex > bottomRowIndex) {
     // Cursor is scrolled off screen, move it outside of the visible area.
@@ -13022,22 +13371,22 @@
   }
 
   if (this.options_.cursorVisible &&
-      this.cursorNode_.style.display == 'none') {
+    this.cursorNode_.style.display == 'none') {
     // Re-display the terminal cursor if it was hidden by the mouse cursor.
     this.cursorNode_.style.display = '';
   }
 
 
   this.cursorNode_.style.top = this.scrollPort_.visibleRowTopMargin +
-      this.scrollPort_.characterSize.height * (cursorRowIndex - topRowIndex) +
-      'px';
+    this.scrollPort_.characterSize.height * (cursorRowIndex - topRowIndex) +
+    'px';
   this.cursorNode_.style.left = this.scrollPort_.characterSize.width *
-      this.screen_.cursorPosition.column + 'px';
+    this.screen_.cursorPosition.column + 'px';
 
   this.cursorNode_.setAttribute('title',
-                                '(' + this.screen_.cursorPosition.row +
-                                ', ' + this.screen_.cursorPosition.column +
-                                ')');
+    '(' + this.screen_.cursorPosition.row +
+    ', ' + this.screen_.cursorPosition.column +
+    ')');
 
   // Update the caret for a11y purposes.
   var selection = this.document_.getSelection();
@@ -13098,9 +13447,9 @@
 
   var self = this;
   this.timeouts_.syncCursor = setTimeout(function() {
-      self.syncCursorPosition_();
-      delete self.timeouts_.syncCursor;
-    }, 0);
+    self.syncCursorPosition_();
+    delete self.timeouts_.syncCursor;
+  }, 0);
 };
 
 /**
@@ -13118,19 +13467,19 @@
 
     this.zoomWarningNode_ = this.document_.createElement('div');
     this.zoomWarningNode_.style.cssText = (
-        'color: black;' +
-        'background-color: #ff2222;' +
-        'font-size: large;' +
-        'border-radius: 8px;' +
-        'opacity: 0.75;' +
-        'padding: 0.2em 0.5em 0.2em 0.5em;' +
-        'top: 0.5em;' +
-        'right: 1.2em;' +
-        'position: absolute;' +
-        '-webkit-text-size-adjust: none;' +
-        '-webkit-user-select: none;' +
-        '-moz-text-size-adjust: none;' +
-        '-moz-user-select: none;');
+      'color: black;' +
+      'background-color: #ff2222;' +
+      'font-size: large;' +
+      'border-radius: 8px;' +
+      'opacity: 0.75;' +
+      'padding: 0.2em 0.5em 0.2em 0.5em;' +
+      'top: 0.5em;' +
+      'right: 1.2em;' +
+      'position: absolute;' +
+      '-webkit-text-size-adjust: none;' +
+      '-webkit-user-select: none;' +
+      '-moz-text-size-adjust: none;' +
+      '-moz-user-select: none;');
 
     this.zoomWarningNode_.addEventListener('click', function(e) {
       this.parentNode.removeChild(this);
@@ -13138,15 +13487,15 @@
   }
 
   this.zoomWarningNode_.textContent = lib.MessageManager.replaceReferences(
-      hterm.zoomWarningMessage,
-      [parseInt(this.scrollPort_.characterSize.zoomFactor * 100)]);
+    hterm.zoomWarningMessage, [parseInt(this.scrollPort_.characterSize.zoomFactor * 100)]);
 
   this.zoomWarningNode_.style.fontFamily = this.prefs_.get('font-family');
 
   if (state) {
     if (!this.zoomWarningNode_.parentNode)
       this.div_.parentNode.appendChild(this.zoomWarningNode_);
-  } else if (this.zoomWarningNode_.parentNode) {
+  }
+  else if (this.zoomWarningNode_.parentNode) {
     this.zoomWarningNode_.parentNode.removeChild(this.zoomWarningNode_);
   }
 };
@@ -13171,15 +13520,15 @@
 
     this.overlayNode_ = this.document_.createElement('div');
     this.overlayNode_.style.cssText = (
-        'border-radius: 15px;' +
-        'font-size: xx-large;' +
-        'opacity: 0.75;' +
-        'padding: 0.2em 0.5em 0.2em 0.5em;' +
-        'position: absolute;' +
-        '-webkit-user-select: none;' +
-        '-webkit-transition: opacity 180ms ease-in;' +
-        '-moz-user-select: none;' +
-        '-moz-transition: opacity 180ms ease-in;');
+      'border-radius: 15px;' +
+      'font-size: xx-large;' +
+      'opacity: 0.75;' +
+      'padding: 0.2em 0.5em 0.2em 0.5em;' +
+      'position: absolute;' +
+      '-webkit-user-select: none;' +
+      '-webkit-transition: opacity 180ms ease-in;' +
+      '-moz-user-select: none;' +
+      '-moz-transition: opacity 180ms ease-in;');
 
     this.overlayNode_.addEventListener('mousedown', function(e) {
       e.preventDefault();
@@ -13201,9 +13550,9 @@
   var overlaySize = hterm.getClientSize(this.overlayNode_);
 
   this.overlayNode_.style.top =
-      (divSize.height - overlaySize.height) / 2 + 'px';
+    (divSize.height - overlaySize.height) / 2 + 'px';
   this.overlayNode_.style.left = (divSize.width - overlaySize.width -
-      this.scrollPort_.currentScrollbarWidthPx) / 2 + 'px';
+    this.scrollPort_.currentScrollbarWidthPx) / 2 + 'px';
 
   var self = this;
 
@@ -13214,14 +13563,14 @@
     return;
 
   this.overlayTimeout_ = setTimeout(function() {
-      self.overlayNode_.style.opacity = '0';
-      self.overlayTimeout_ = setTimeout(function() {
-          if (self.overlayNode_.parentNode)
-            self.overlayNode_.parentNode.removeChild(self.overlayNode_);
-          self.overlayTimeout_ = null;
-          self.overlayNode_.style.opacity = '0.75';
-        }, 200);
-    }, opt_timeout || 1500);
+    self.overlayNode_.style.opacity = '0';
+    self.overlayTimeout_ = setTimeout(function() {
+      if (self.overlayNode_.parentNode)
+        self.overlayNode_.parentNode.removeChild(self.overlayNode_);
+      self.overlayTimeout_ = null;
+      self.overlayNode_.style.opacity = '0.75';
+    }, 200);
+  }, opt_timeout || 1500);
 };
 
 /**
@@ -13245,10 +13594,10 @@
   var copySource = this.document_.createElement('pre');
   copySource.textContent = str;
   copySource.style.cssText = (
-      '-webkit-user-select: text;' +
-      '-moz-user-select: text;' +
-      'position: absolute;' +
-      'top: -99px');
+    '-webkit-user-select: text;' +
+    '-moz-user-select: text;' +
+    'position: absolute;' +
+    'top: -99px');
 
   this.document_.body.appendChild(copySource);
 
@@ -13275,7 +13624,7 @@
 /**
  * Returns the selected text, or null if no text is selected.
  *
- * @return {string|null}
+ * @return {?string}
  */
 hterm.Terminal.prototype.getSelectionText = function() {
   var selection = this.scrollPort_.selection;
@@ -13307,7 +13656,7 @@
 
   // End offset measures from the end of the line.
   var endOffset = (hterm.TextAttributes.nodeWidth(selection.endNode) -
-                   selection.endOffset);
+    selection.endOffset);
   node = selection.endNode;
 
   if (node.nodeName != 'X-ROW') {
@@ -13327,7 +13676,7 @@
   }
 
   var rv = this.getRowsText(selection.startRow.rowIndex,
-                            selection.endRow.rowIndex + 1);
+    selection.endRow.rowIndex + 1);
   return lib.wc.substring(rv, startOffset, lib.wc.strWidth(rv) - endOffset);
 };
 
@@ -13365,7 +13714,7 @@
 hterm.Terminal.prototype.openUrl = function(url) {
   var win = window.open(url, '_blank');
   win.focus();
-}
+};
 
 /**
  * Open the selected url.
@@ -13388,7 +13737,7 @@
     str = 'http://' + str;
 
   this.openUrl(str);
-}
+};
 
 
 /**
@@ -13413,15 +13762,15 @@
   }
 
   var reportMouseEvents = (!this.defeatMouseReports_ &&
-      this.vt.mouseReport != this.vt.MOUSE_REPORT_DISABLED);
+    this.vt.mouseReport != this.vt.MOUSE_REPORT_DISABLED);
 
   e.processedByTerminalHandler_ = true;
 
   // One based row/column stored on the mouse event.
   e.terminalRow = parseInt((e.clientY - this.scrollPort_.visibleRowTopMargin) /
-                           this.scrollPort_.characterSize.height) + 1;
+    this.scrollPort_.characterSize.height) + 1;
   e.terminalColumn = parseInt(e.clientX /
-                              this.scrollPort_.characterSize.width) + 1;
+    this.scrollPort_.characterSize.width) + 1;
 
   if (e.type == 'mousedown' && e.terminalColumn > this.screenSize.width) {
     // Mousedown in the scrollbar area.
@@ -13434,9 +13783,10 @@
     // cursor is over top.  This keeps the terminal cursor from interfering
     // with local text selection.
     if (e.terminalRow - 1 == this.screen_.cursorPosition.row &&
-        e.terminalColumn - 1 == this.screen_.cursorPosition.column) {
+      e.terminalColumn - 1 == this.screen_.cursorPosition.column) {
       this.cursorNode_.style.display = 'none';
-    } else if (this.cursorNode_.style.display == 'none') {
+    }
+    else if (this.cursorNode_.style.display == 'none') {
       this.cursorNode_.style.display = '';
     }
   }
@@ -13447,7 +13797,8 @@
       // alt-mousedown, then the mouse will act on the local selection.
       this.defeatMouseReports_ = true;
       this.setSelectionEnabled(true);
-    } else {
+    }
+    else {
       // Otherwise we defer ownership of the mouse to the VT.
       this.defeatMouseReports_ = false;
       this.document_.getSelection().collapseToEnd();
@@ -13468,7 +13819,7 @@
       // have expanded the selection text at the first click event.
       clearTimeout(this.timeouts_.openUrl);
       this.timeouts_.openUrl = setTimeout(this.openSelectedUrl_.bind(this),
-                                          500);
+        500);
       return;
     }
 
@@ -13476,18 +13827,19 @@
       this.paste();
 
     if (e.type == 'mouseup' && e.which == 1 && this.copyOnSelect &&
-        !this.document_.getSelection().isCollapsed) {
+      !this.document_.getSelection().isCollapsed) {
       this.copySelectionToClipboard(this.document_);
     }
 
     if ((e.type == 'mousemove' || e.type == 'mouseup') &&
-        this.scrollBlockerNode_.engaged) {
+      this.scrollBlockerNode_.engaged) {
       // Disengage the scroll-blocker after one of these events.
       this.scrollBlockerNode_.engaged = false;
       this.scrollBlockerNode_.style.top = '-99px';
     }
 
-  } else /* if (this.reportMouseEvents) */ {
+  }
+  else /* if (this.reportMouseEvents) */ {
     if (!this.scrollBlockerNode_.engaged) {
       if (e.type == 'mousedown') {
         // Move the scroll-blocker into place if we want to keep the scrollport
@@ -13495,7 +13847,8 @@
         this.scrollBlockerNode_.engaged = true;
         this.scrollBlockerNode_.style.top = (e.clientY - 5) + 'px';
         this.scrollBlockerNode_.style.left = (e.clientX - 5) + 'px';
-      } else if (e.type == 'mousemove') {
+      }
+      else if (e.type == 'mousemove') {
         // Oh.  This means that drag-scroll was disabled AFTER the mouse down,
         // in which case it's too late to engage the scroll-blocker.
         this.document_.getSelection().collapseToEnd();
@@ -13522,7 +13875,7 @@
  *
  * @param {Event} e The mouse event to handle.
  */
-hterm.Terminal.prototype.onMouse = function(e) { };
+hterm.Terminal.prototype.onMouse = function(e) {};
 
 /**
  * React when focus changes.
@@ -13579,9 +13932,9 @@
  */
 hterm.Terminal.prototype.onResize_ = function() {
   var columnCount = Math.floor(this.scrollPort_.getScreenWidth() /
-                               this.scrollPort_.characterSize.width) || 0;
+    this.scrollPort_.characterSize.width) || 0;
   var rowCount = lib.f.smartFloorDivide(this.scrollPort_.getScreenHeight(),
-                            this.scrollPort_.characterSize.height) || 0;
+    this.scrollPort_.characterSize.height) || 0;
 
   if (columnCount <= 0 || rowCount <= 0) {
     // We avoid these situations since they happen sometimes when the terminal
@@ -13593,7 +13946,7 @@
   }
 
   var isNewSize = (columnCount != this.screenSize.width ||
-                   rowCount != this.screenSize.height);
+    rowCount != this.screenSize.height);
 
   // We do this even if the size didn't change, just to be sure everything is
   // in sync.
@@ -13617,14 +13970,15 @@
   }
 
   if (this.cursorNode_.getAttribute('focus') == 'false' ||
-      this.cursorNode_.style.opacity == '0') {
+    this.cursorNode_.style.opacity == '0') {
     this.cursorNode_.style.opacity = '1';
     this.timeouts_.cursorBlink = setTimeout(this.myOnCursorBlink_,
-                                            this.cursorBlinkCycle_[0]);
-  } else {
+      this.cursorBlinkCycle_[0]);
+  }
+  else {
     this.cursorNode_.style.opacity = '0';
     this.timeouts_.cursorBlink = setTimeout(this.myOnCursorBlink_,
-                                            this.cursorBlinkCycle_[1]);
+      this.cursorBlinkCycle_[1]);
   }
 };
 
@@ -13659,8 +14013,8 @@
  */
 hterm.Terminal.prototype.closeBellNotifications_ = function() {
   this.bellNotificationList_.forEach(function(n) {
-      n.close();
-    });
+    n.close();
+  });
   this.bellNotificationList_.length = 0;
 };
 // SOURCE FILE: hterm/js/hterm_terminal_io.js
@@ -13847,9 +14201,9 @@
  * @param {string} string The string to print.
  */
 hterm.Terminal.IO.prototype.print =
-hterm.Terminal.IO.prototype.writeUTF16 = function(string) {
-  this.writeUTF8(lib.encodeUTF8(string));
-};
+  hterm.Terminal.IO.prototype.writeUTF16 = function(string) {
+    this.writeUTF8(lib.encodeUTF8(string));
+  };
 
 /**
  * Print a UTF-16 JavaScript string to the terminal followed by a newline.
@@ -13857,9 +14211,9 @@
  * @param {string} string The string to print.
  */
 hterm.Terminal.IO.prototype.println =
-hterm.Terminal.IO.prototype.writelnUTF16 = function(string) {
-  this.writelnUTF8(lib.encodeUTF8(string));
-};
+  hterm.Terminal.IO.prototype.writelnUTF16 = function(string) {
+    this.writelnUTF8(lib.encodeUTF8(string));
+  };
 // SOURCE FILE: hterm/js/hterm_text_attributes.js
 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
@@ -14009,17 +14363,17 @@
  */
 hterm.TextAttributes.prototype.isDefault = function() {
   return (this.foregroundSource == this.SRC_DEFAULT &&
-          this.backgroundSource == this.SRC_DEFAULT &&
-          !this.bold &&
-          !this.faint &&
-          !this.italic &&
-          !this.blink &&
-          !this.underline &&
-          !this.strikethrough &&
-          !this.inverse &&
-          !this.invisible &&
-          !this.wcNode &&
-          this.tileData == null);
+    this.backgroundSource == this.SRC_DEFAULT &&
+    !this.bold &&
+    !this.faint &&
+    !this.italic &&
+    !this.blink &&
+    !this.underline &&
+    !this.strikethrough &&
+    !this.inverse &&
+    !this.invisible &&
+    !this.wcNode &&
+    this.tileData == null);
 };
 
 /**
@@ -14120,14 +14474,14 @@
   // We don't want to put multiple characters in a wcNode or a tile.
   // See the comments in createContainer.
   return (!(this.wcNode || obj.wcNode) &&
-          !(this.tileData != null || obj.tileNode) &&
-          this.foreground == style.color &&
-          this.background == style.backgroundColor &&
-          (this.enableBold && this.bold) == !!style.fontWeight &&
-          this.blink == obj.blinkNode &&
-          this.italic == !!style.fontStyle &&
-          !!this.underline == !!obj.underline &&
-          !!this.strikethrough == !!obj.strikethrough);
+    !(this.tileData != null || obj.tileNode) &&
+    this.foreground == style.color &&
+    this.background == style.backgroundColor &&
+    (this.enableBold && this.bold) == !!style.fontWeight &&
+    this.blink == obj.blinkNode &&
+    this.italic == !!style.fontStyle &&
+    !!this.underline == !!obj.underline &&
+    !!this.strikethrough == !!obj.strikethrough);
 };
 
 hterm.TextAttributes.prototype.setDefaults = function(foreground, background) {
@@ -14174,7 +14528,7 @@
 
   if (this.enableBoldAsBright && this.bold) {
     if (foregroundSource != this.SRC_DEFAULT &&
-        foregroundSource != this.SRC_RGB) {
+      foregroundSource != this.SRC_RGB) {
       foregroundSource = getBrightIndex(foregroundSource);
     }
   }
@@ -14187,18 +14541,18 @@
   // Set fore/background colors unless already specified in rgb(r, g, b) form.
   if (foregroundSource != this.SRC_RGB) {
     this.foreground = ((foregroundSource == this.SRC_DEFAULT) ?
-                       defaultForeground : this.colorPalette[foregroundSource]);
+      defaultForeground : this.colorPalette[foregroundSource]);
   }
 
   if (this.faint && !this.invisible) {
     var colorToMakeFaint = ((this.foreground == this.DEFAULT_COLOR) ?
-                            this.defaultForeground : this.foreground);
+      this.defaultForeground : this.foreground);
     this.foreground = lib.colors.mix(colorToMakeFaint, 'rgb(0, 0, 0)', 0.3333);
   }
 
   if (backgroundSource != this.SRC_RGB) {
     this.background = ((backgroundSource == this.SRC_DEFAULT) ?
-                       defaultBackground : this.colorPalette[backgroundSource]);
+      defaultBackground : this.colorPalette[backgroundSource]);
   }
 };
 
@@ -14226,10 +14580,10 @@
   var style2 = obj2.style;
 
   return (style1.color == style2.color &&
-          style1.backgroundColor == style2.backgroundColor &&
-          style1.fontWeight == style2.fontWeight &&
-          style1.fontStyle == style2.fontStyle &&
-          style1.textDecoration == style2.textDecoration);
+    style1.backgroundColor == style2.backgroundColor &&
+    style1.fontWeight == style2.fontWeight &&
+    style1.fontStyle == style2.fontStyle &&
+    style1.textDecoration == style2.textDecoration);
 };
 
 /**
@@ -14241,7 +14595,7 @@
  * @return {boolean} True if the object is unstyled.
  */
 hterm.TextAttributes.containerIsDefault = function(obj) {
-  return typeof obj == 'string'  || obj.nodeType == 3;
+  return typeof obj == 'string' || obj.nodeType == 3;
 };
 
 /**
@@ -14254,10 +14608,11 @@
 hterm.TextAttributes.nodeWidth = function(node) {
   if (node.wcNode) {
     return lib.wc.strWidth(node.textContent);
-  } else {
+  }
+  else {
     return node.textContent.length;
   }
-}
+};
 
 /**
  * Static method to get the substr of a node's textContent.  The start index
@@ -14272,10 +14627,11 @@
 hterm.TextAttributes.nodeSubstr = function(node, start, width) {
   if (node.wcNode) {
     return lib.wc.substr(node.textContent, start, width);
-  } else {
+  }
+  else {
     return node.textContent.substr(start, width);
   }
-}
+};
 
 /**
  * Static method to get the substring based of a node's textContent.  The
@@ -14290,7 +14646,8 @@
 hterm.TextAttributes.nodeSubstring = function(node, start, end) {
   if (node.wcNode) {
     return lib.wc.substring(node.textContent, start, end);
-  } else {
+  }
+  else {
     return node.textContent.substring(start, end);
   }
 };
@@ -14307,18 +14664,25 @@
  */
 hterm.TextAttributes.splitWidecharString = function(str) {
   var rv = [];
-  var base = 0, length = 0;
+  var base = 0,
+    length = 0;
 
   for (var i = 0; i < str.length;) {
     var c = str.codePointAt(i);
     var increment = (c <= 0xffff) ? 1 : 2;
     if (c < 128 || lib.wc.charWidth(c) == 1) {
       length += increment;
-    } else {
+    }
+    else {
       if (length) {
-        rv.push({str: str.substr(base, length)});
+        rv.push({
+          str: str.substr(base, length)
+        });
       }
-      rv.push({str: str.substr(i, increment), wcNode: true});
+      rv.push({
+        str: str.substr(i, increment),
+        wcNode: true
+      });
       base = i + increment;
       length = 0;
     }
@@ -14326,7 +14690,9 @@
   }
 
   if (length)
-    rv.push({str: str.substr(base, length)});
+    rv.push({
+      str: str.substr(base, length)
+    });
 
   return rv;
 };
@@ -14338,7 +14704,7 @@
 'use strict';
 
 lib.rtdep('lib.colors', 'lib.f', 'lib.UTF8Decoder',
-          'hterm.VT.CharacterMap');
+  'hterm.VT.CharacterMap');
 
 /**
  * Constructor for the VT escape sequence interpreter.
@@ -14402,9 +14768,9 @@
   // This is used in parseUnknown_ to quickly scan a string for the next
   // control character.
   var cc1 = Object.keys(hterm.VT.CC1).map(
-      function(e) {
-        return '\\x' + lib.f.zpad(e.charCodeAt().toString(16), 2)
-      }).join('');
+    function(e) {
+      return '\\x' + lib.f.zpad(e.charCodeAt().toString(16), 2);
+    }).join('');
   this.cc1Pattern_ = new RegExp('[' + cc1 + ']');
 
   // Decoder to maintain UTF-8 decode state.
@@ -14719,7 +15085,7 @@
 
     case 'mouseup':
       // Mouse up has no indication of which button was released.
-      response = '\x1b[M\x23' + x + y;
+      response = '\x1b[M#' + x + y;
       break;
 
     case 'mousemove':
@@ -14768,7 +15134,7 @@
     this.parseState_.func.call(this, this.parseState_);
 
     if (this.parseState_.func == func && this.parseState_.pos == pos &&
-        this.parseState_.buf == buf) {
+      this.parseState_.buf == buf) {
       throw 'Parser did not alter the state!';
     }
   }
@@ -14855,16 +15221,18 @@
   if (ch >= '@' && ch <= '~') {
     // This is the final character.
     this.dispatch('CSI', this.leadingModifier_ + this.trailingModifier_ + ch,
-                  parseState);
+      parseState);
     parseState.resetParseFunction();
 
-  } else if (ch == ';') {
+  }
+  else if (ch == ';') {
     // Parameter delimiter.
     if (this.trailingModifier_) {
       // Parameter delimiter after the trailing modifier.  That's a paddlin'.
       parseState.resetParseFunction();
 
-    } else {
+    }
+    else {
       if (!args.length) {
         // They omitted the first param, we need to supply it.
         args.push('');
@@ -14873,33 +15241,40 @@
       args.push('');
     }
 
-  } else if (ch >= '0' && ch <= '9') {
+  }
+  else if (ch >= '0' && ch <= '9') {
     // Next byte in the current parameter.
 
     if (this.trailingModifier_) {
       // Numeric parameter after the trailing modifier.  That's a paddlin'.
       parseState.resetParseFunction();
-    } else {
+    }
+    else {
       if (!args.length) {
         args[0] = ch;
-      } else {
+      }
+      else {
         args[args.length - 1] += ch;
       }
     }
 
-  } else if (ch >= ' ' && ch <= '?' && ch != ':') {
+  }
+  else if (ch >= ' ' && ch <= '?' && ch != ':') {
     // Modifier character.
     if (!args.length) {
       this.leadingModifier_ += ch;
-    } else {
+    }
+    else {
       this.trailingModifier_ += ch;
     }
 
-  } else if (this.cc1Pattern_.test(ch)) {
+  }
+  else if (this.cc1Pattern_.test(ch)) {
     // Control character.
     this.dispatch('CC1', ch, parseState);
 
-  } else {
+  }
+  else {
     // Unexpected character in sequence, bail out.
     parseState.resetParseFunction();
   }
@@ -14951,7 +15326,7 @@
 
     if (abortReason) {
       console.log('parseUntilStringTerminator_: aborting: ' + abortReason,
-                  args[0]);
+        args[0]);
       parseState.reset(args[0]);
       return false;
     }
@@ -14970,7 +15345,7 @@
 
   parseState.resetParseFunction();
   parseState.advance(nextTerminator +
-                     (buf.substr(nextTerminator, 1) == '\x1b' ? 2 : 1));
+    (buf.substr(nextTerminator, 1) == '\x1b' ? 2 : 1));
 
   return true;
 };
@@ -15002,7 +15377,7 @@
     // (APC, '\x9f') from locking up the terminal waiting for its expected
     // (ST, '\x9c') or (BEL, '\x07').
     console.warn('Ignoring 8-bit control code: 0x' +
-                 code.charCodeAt(0).toString(16));
+      code.charCodeAt(0).toString(16));
     return;
   }
 
@@ -15025,9 +15400,11 @@
 hterm.VT.prototype.setANSIMode = function(code, state) {
   if (code == '4') {
     this.terminal.setInsertMode(state);
-  } else if (code == '20') {
+  }
+  else if (code == '20') {
     this.terminal.setAutoCarriageReturn(state);
-  } else if (this.warnUnimplemented) {
+  }
+  else if (this.warnUnimplemented) {
     console.warn('Unimplemented ANSI Mode: ' + code);
   }
 };
@@ -15101,11 +15478,11 @@
  */
 hterm.VT.prototype.setDECMode = function(code, state) {
   switch (code) {
-    case '1':  // DECCKM
+    case '1': // DECCKM
       this.terminal.keyboard.applicationCursor = state;
       break;
 
-    case '3':  // DECCOLM
+    case '3': // DECCOLM
       if (this.allowColumnWidthChanges_) {
         this.terminal.setWidth(state ? 132 : 80);
 
@@ -15114,96 +15491,98 @@
       }
       break;
 
-    case '5':  // DECSCNM
+    case '5': // DECSCNM
       this.terminal.setReverseVideo(state);
       break;
 
-    case '6':  // DECOM
+    case '6': // DECOM
       this.terminal.setOriginMode(state);
       break;
 
-    case '7':  // DECAWM
+    case '7': // DECAWM
       this.terminal.setWraparound(state);
       break;
 
-    case '12':  // att610
+    case '12': // att610
       if (this.enableDec12)
         this.terminal.setCursorBlink(state);
       break;
 
-    case '25':  // DECTCEM
+    case '25': // DECTCEM
       this.terminal.setCursorVisible(state);
       break;
 
-    case '40':  // no-spec
+    case '40': // no-spec
       this.terminal.allowColumnWidthChanges_ = state;
       break;
 
-    case '45':  // no-spec
+    case '45': // no-spec
       this.terminal.setReverseWraparound(state);
       break;
 
-    case '67':  // DECBKM
+    case '67': // DECBKM
       this.terminal.keyboard.backspaceSendsBackspace = state;
       break;
 
-    case '1000':  // Report on mouse clicks only.
+    case '1000': // Report on mouse clicks only.
       this.mouseReport = (
-          state ? this.MOUSE_REPORT_CLICK : this.MOUSE_REPORT_DISABLED);
+        state ? this.MOUSE_REPORT_CLICK : this.MOUSE_REPORT_DISABLED);
       break;
 
-    case '1002':  // Report on mouse clicks and drags
+    case '1002': // Report on mouse clicks and drags
       this.mouseReport = (
-          state ? this.MOUSE_REPORT_DRAG : this.MOUSE_REPORT_DISABLED);
+        state ? this.MOUSE_REPORT_DRAG : this.MOUSE_REPORT_DISABLED);
       break;
 
-    case '1010':  // rxvt
+    case '1010': // rxvt
       this.terminal.scrollOnOutput = state;
       break;
 
-    case '1011':  // rxvt
+    case '1011': // rxvt
       this.terminal.scrollOnKeystroke = state;
       break;
 
-    case '1036':  // no-spec
+    case '1036': // no-spec
       this.terminal.keyboard.metaSendsEscape = state;
       break;
 
-    case '1039':  // no-spec
+    case '1039': // no-spec
       if (state) {
         if (!this.terminal.keyboard.previousAltSendsWhat_) {
           this.terminal.keyboard.previousAltSendsWhat_ =
-              this.terminal.keyboard.altSendsWhat;
+            this.terminal.keyboard.altSendsWhat;
           this.terminal.keyboard.altSendsWhat = 'escape';
         }
-      } else if (this.terminal.keyboard.previousAltSendsWhat_) {
+      }
+      else if (this.terminal.keyboard.previousAltSendsWhat_) {
         this.terminal.keyboard.altSendsWhat =
-            this.terminal.keyboard.previousAltSendsWhat_;
+          this.terminal.keyboard.previousAltSendsWhat_;
         this.terminal.keyboard.previousAltSendsWhat_ = null;
       }
       break;
 
     case '47':
-    case '1047':  // no-spec
+    case '1047': // no-spec
       this.terminal.setAlternateMode(state);
       break;
 
-    case '1048':  // Save cursor as in DECSC.
+    case '1048': // Save cursor as in DECSC.
       this.savedState_.save();
 
-    case '1049':  // 1047 + 1048 + clear.
+    case '1049': // 1047 + 1048 + clear.
       if (state) {
         this.savedState_.save();
         this.terminal.setAlternateMode(state);
         this.terminal.clear();
-      } else {
+      }
+      else {
         this.terminal.setAlternateMode(state);
         this.savedState_.restore();
       }
 
       break;
 
-    case '2004':  // Bracketed paste mode.
+    case '2004': // Bracketed paste mode.
       this.terminal.setBracketedPaste(state);
       break;
 
@@ -15265,7 +15644,7 @@
  *
  * Silently ignored.
  */
-hterm.VT.CC1['\x00'] = function () {};
+hterm.VT.CC1['\x00'] = function() {};
 
 /**
  * Enquiry (ENQ).
@@ -15432,9 +15811,9 @@
  * Like newline, only keep the X position
  */
 hterm.VT.CC1['\x84'] =
-hterm.VT.ESC['D'] = function() {
-  this.terminal.lineFeed();
-};
+  hterm.VT.ESC['D'] = function() {
+    this.terminal.lineFeed();
+  };
 
 /**
  * Next Line (NEL).
@@ -15442,18 +15821,18 @@
  * Like newline, but doesn't add lines.
  */
 hterm.VT.CC1['\x85'] =
-hterm.VT.ESC['E'] = function() {
-  this.terminal.setCursorColumn(0);
-  this.terminal.cursorDown(1);
-};
+  hterm.VT.ESC['E'] = function() {
+    this.terminal.setCursorColumn(0);
+    this.terminal.cursorDown(1);
+  };
 
 /**
  * Horizontal Tabulation Set (HTS).
  */
 hterm.VT.CC1['\x88'] =
-hterm.VT.ESC['H'] = function() {
-  this.terminal.setTabStop(this.terminal.getCursorColumn());
-};
+  hterm.VT.ESC['H'] = function() {
+    this.terminal.setTabStop(this.terminal.getCursorColumn());
+  };
 
 /**
  * Reverse Index (RI).
@@ -15461,9 +15840,9 @@
  * Move up one line.
  */
 hterm.VT.CC1['\x8d'] =
-hterm.VT.ESC['M'] = function() {
-  this.terminal.reverseLineFeed();
-};
+  hterm.VT.ESC['M'] = function() {
+    this.terminal.reverseLineFeed();
+  };
 
 /**
  * Single Shift 2 (SS2).
@@ -15473,7 +15852,7 @@
  * Not currently implemented.
  */
 hterm.VT.CC1['\x8e'] =
-hterm.VT.ESC['N'] = hterm.VT.ignore;
+  hterm.VT.ESC['N'] = hterm.VT.ignore;
 
 /**
  * Single Shift 3 (SS3).
@@ -15483,7 +15862,7 @@
  * Not currently implemented.
  */
 hterm.VT.CC1['\x8f'] =
-hterm.VT.ESC['O'] = hterm.VT.ignore;
+  hterm.VT.ESC['O'] = hterm.VT.ignore;
 
 /**
  * Device Control String (DCS).
@@ -15494,10 +15873,10 @@
  * TODO(rginda): Consider implementing DECRQSS, the rest don't seem applicable.
  */
 hterm.VT.CC1['\x90'] =
-hterm.VT.ESC['P'] = function(parseState) {
-  parseState.resetArguments();
-  parseState.func = this.parseUntilStringTerminator_;
-};
+  hterm.VT.ESC['P'] = function(parseState) {
+    parseState.resetArguments();
+    parseState.func = this.parseUntilStringTerminator_;
+  };
 
 /**
  * Start of Protected Area (SPA).
@@ -15505,7 +15884,7 @@
  * Will not implement.
  */
 hterm.VT.CC1['\x96'] =
-hterm.VT.ESC['V'] = hterm.VT.ignore;
+  hterm.VT.ESC['V'] = hterm.VT.ignore;
 
 /**
  * End of Protected Area (EPA).
@@ -15513,7 +15892,7 @@
  * Will not implement.
  */
 hterm.VT.CC1['\x97'] =
-hterm.VT.ESC['W'] = hterm.VT.ignore;
+  hterm.VT.ESC['W'] = hterm.VT.ignore;
 
 /**
  * Start of String (SOS).
@@ -15521,7 +15900,7 @@
  * Will not implement.
  */
 hterm.VT.CC1['\x98'] =
-hterm.VT.ESC['X'] = hterm.VT.ignore;
+  hterm.VT.ESC['X'] = hterm.VT.ignore;
 
 /**
  * Single Character Introducer (SCI, also DECID).
@@ -15529,9 +15908,9 @@
  * Return Terminal ID.  Obsolete form of 'ESC [ c' (DA).
  */
 hterm.VT.CC1['\x9a'] =
-hterm.VT.ESC['Z'] = function() {
-  this.terminal.io.sendString('\x1b[?1;2c');
-};
+  hterm.VT.ESC['Z'] = function() {
+    this.terminal.io.sendString('\x1b[?1;2c');
+  };
 
 /**
  * Control Sequence Introducer (CSI).
@@ -15539,12 +15918,12 @@
  * The lead into most escape sequences.  See [CSI].
  */
 hterm.VT.CC1['\x9b'] =
-hterm.VT.ESC['['] = function(parseState) {
-  parseState.resetArguments();
-  this.leadingModifier_ = '';
-  this.trailingModifier_ = '';
-  parseState.func = this.parseCSI_;
-};
+  hterm.VT.ESC['['] = function(parseState) {
+    parseState.resetArguments();
+    this.leadingModifier_ = '';
+    this.trailingModifier_ = '';
+    parseState.func = this.parseCSI_;
+  };
 
 /**
  * String Terminator (ST).
@@ -15555,7 +15934,7 @@
  * sequences.  See the 'parseUntilStringTerminator_' method.
  */
 hterm.VT.CC1['\x9c'] =
-hterm.VT.ESC['\\'] = hterm.VT.ignore;
+  hterm.VT.ESC['\\'] = hterm.VT.ignore;
 
 /**
  * Operating System Command (OSC).
@@ -15563,43 +15942,44 @@
  * Commands relating to the operating system.
  */
 hterm.VT.CC1['\x9d'] =
-hterm.VT.ESC[']'] = function(parseState) {
-  parseState.resetArguments();
+  hterm.VT.ESC[']'] = function(parseState) {
+    parseState.resetArguments();
 
-  function parseOSC(parseState) {
-    if (!this.parseUntilStringTerminator_(parseState)) {
-      // The string sequence was too long.
-      return;
-    }
+    function parseOSC(parseState) {
+      if (!this.parseUntilStringTerminator_(parseState)) {
+        // The string sequence was too long.
+        return;
+      }
 
-    if (parseState.func == parseOSC) {
-      // We're not done parsing the string yet.
-      return;
-    }
+      if (parseState.func == parseOSC) {
+        // We're not done parsing the string yet.
+        return;
+      }
 
-    // We're done.
-    var ary = parseState.args[0].match(/^(\d+);(.*)$/);
-    if (ary) {
-      parseState.args[0] = ary[2];
-      this.dispatch('OSC', ary[1], parseState);
-    } else {
-      console.warn('Invalid OSC: ' + JSON.stringify(parseState.args[0]));
-    }
+      // We're done.
+      var ary = parseState.args[0].match(/^(\d+);(.*)$/);
+      if (ary) {
+        parseState.args[0] = ary[2];
+        this.dispatch('OSC', ary[1], parseState);
+      }
+      else {
+        console.warn('Invalid OSC: ' + JSON.stringify(parseState.args[0]));
+      }
+    };
+
+    parseState.func = parseOSC;
   };
 
-  parseState.func = parseOSC;
-};
-
 /**
  * Privacy Message (PM).
  *
  * Will not implement.
  */
 hterm.VT.CC1['\x9e'] =
-hterm.VT.ESC['^'] = function(parseState) {
-  parseState.resetArguments();
-  parseState.func = this.parseUntilStringTerminator_;
-};
+  hterm.VT.ESC['^'] = function(parseState) {
+    parseState.resetArguments();
+    parseState.func = this.parseUntilStringTerminator_;
+  };
 
 /**
  * Application Program Control (APC).
@@ -15607,10 +15987,10 @@
  * Will not implement.
  */
 hterm.VT.CC1['\x9f'] =
-hterm.VT.ESC['_'] = function(parseState) {
-  parseState.resetArguments();
-  parseState.func = this.parseUntilStringTerminator_;
-};
+  hterm.VT.ESC['_'] = function(parseState) {
+    parseState.resetArguments();
+    parseState.func = this.parseUntilStringTerminator_;
+  };
 
 /**
  * ESC \x20 - Unclear to me where these originated, possibly in xterm.
@@ -15625,7 +16005,7 @@
  *   ESC \x20 M - Set ANSI conformance level 2.
  *   ESC \x20 N - Set ANSI conformance level 3.
  */
-hterm.VT.ESC['\x20'] = function(parseState) {
+hterm.VT.ESC[' '] = function(parseState) {
   parseState.func = function(parseState) {
     var ch = parseState.consumeChar();
     if (this.warnUnimplemented)
@@ -15708,37 +16088,41 @@
  * TODO(rginda): Implement.
  */
 hterm.VT.ESC['('] =
-hterm.VT.ESC[')'] =
-hterm.VT.ESC['*'] =
-hterm.VT.ESC['+'] =
-hterm.VT.ESC['-'] =
-hterm.VT.ESC['.'] =
-hterm.VT.ESC['/'] = function(parseState, code) {
-  parseState.func = function(parseState) {
-    var ch = parseState.consumeChar();
-    if (ch == '\x1b') {
-      parseState.resetParseFunction();
-      parseState.func();
-      return;
-    }
-
-    if (ch in hterm.VT.CharacterMap.maps) {
-      if (code == '(') {
-        this.G0 = hterm.VT.CharacterMap.maps[ch];
-      } else if (code == ')' || code == '-') {
-        this.G1 = hterm.VT.CharacterMap.maps[ch];
-      } else if (code == '*' || code == '.') {
-        this.G2 = hterm.VT.CharacterMap.maps[ch];
-      } else if (code == '+' || code == '/') {
-        this.G3 = hterm.VT.CharacterMap.maps[ch];
+  hterm.VT.ESC[')'] =
+  hterm.VT.ESC['*'] =
+  hterm.VT.ESC['+'] =
+  hterm.VT.ESC['-'] =
+  hterm.VT.ESC['.'] =
+  hterm.VT.ESC['/'] = function(parseState, code) {
+    parseState.func = function(parseState) {
+      var ch = parseState.consumeChar();
+      if (ch == '\x1b') {
+        parseState.resetParseFunction();
+        parseState.func();
+        return;
       }
-    } else if (this.warnUnimplemented) {
-      console.log('Invalid character set for "' + code + '": ' + ch);
-    }
 
-    parseState.resetParseFunction();
+      if (ch in hterm.VT.CharacterMap.maps) {
+        if (code == '(') {
+          this.G0 = hterm.VT.CharacterMap.maps[ch];
+        }
+        else if (code == ')' || code == '-') {
+          this.G1 = hterm.VT.CharacterMap.maps[ch];
+        }
+        else if (code == '*' || code == '.') {
+          this.G2 = hterm.VT.CharacterMap.maps[ch];
+        }
+        else if (code == '+' || code == '/') {
+          this.G3 = hterm.VT.CharacterMap.maps[ch];
+        }
+      }
+      else if (this.warnUnimplemented) {
+        console.log('Invalid character set for "' + code + '": ' + ch);
+      }
+
+      parseState.resetParseFunction();
+    };
   };
-};
 
 /**
  * Back Index (DECBI).
@@ -15806,7 +16190,7 @@
  * Will not implement.
  */
 hterm.VT.ESC['l'] =
-hterm.VT.ESC['m'] = hterm.VT.ignore;
+  hterm.VT.ESC['m'] = hterm.VT.ignore;
 
 /**
  * Lock Shift 2 (LS2)
@@ -16032,7 +16416,7 @@
  */
 hterm.VT.CSI['H'] = function(parseState) {
   this.terminal.setCursorPosition(parseState.iarg(0, 1) - 1,
-                                  parseState.iarg(1, 1) - 1);
+    parseState.iarg(1, 1) - 1);
 };
 
 /**
@@ -16050,37 +16434,42 @@
  * Erase in Display (ED, DECSED).
  */
 hterm.VT.CSI['J'] =
-hterm.VT.CSI['?J'] = function(parseState, code) {
-  var arg = parseState.args[0];
+  hterm.VT.CSI['?J'] = function(parseState, code) {
+    var arg = parseState.args[0];
 
-  if (!arg || arg == '0') {
+    if (!arg || arg == '0') {
       this.terminal.eraseBelow();
-  } else if (arg == '1') {
-    this.terminal.eraseAbove();
-  } else if (arg == '2') {
-    this.terminal.clear();
-  } else if (arg == '3') {
-    // The xterm docs say this means "Erase saved lines", but we'll just clear
-    // the display since killing the scrollback seems rude.
-    this.terminal.clear();
-  }
-};
+    }
+    else if (arg == '1') {
+      this.terminal.eraseAbove();
+    }
+    else if (arg == '2') {
+      this.terminal.clear();
+    }
+    else if (arg == '3') {
+      // The xterm docs say this means "Erase saved lines", but we'll just clear
+      // the display since killing the scrollback seems rude.
+      this.terminal.clear();
+    }
+  };
 
 /**
  * Erase in line (EL, DECSEL).
  */
 hterm.VT.CSI['K'] =
-hterm.VT.CSI['?K'] = function(parseState, code) {
-  var arg = parseState.args[0];
+  hterm.VT.CSI['?K'] = function(parseState, code) {
+    var arg = parseState.args[0];
 
-  if (!arg || arg == '0') {
-    this.terminal.eraseToRight();
-  } else if (arg == '1'){
-    this.terminal.eraseToLeft();
-  } else if (arg == '2') {
-    this.terminal.eraseLine();
-  }
-};
+    if (!arg || arg == '0') {
+      this.terminal.eraseToRight();
+    }
+    else if (arg == '1') {
+      this.terminal.eraseToLeft();
+    }
+    else if (arg == '2') {
+      this.terminal.eraseLine();
+    }
+  };
 
 /**
  * Insert Lines (IL).
@@ -16217,7 +16606,8 @@
   if (!parseState.args[0] || parseState.args[0] == '0') {
     // Clear tab stop at cursor.
     this.terminal.clearTabStopAtCursor(false);
-  } else if (parseState.args[0] == '3') {
+  }
+  else if (parseState.args[0] == '3') {
     // Clear all tab stops.
     this.terminal.clearAllTabStops();
   }
@@ -16248,7 +16638,7 @@
  * These commands control the printer.  Will not implement.
  */
 hterm.VT.CSI['i'] =
-hterm.VT.CSI['?i'] = hterm.VT.ignore;
+  hterm.VT.CSI['?i'] = hterm.VT.ignore;
 
 /**
  * Reset Mode (RM).
@@ -16376,47 +16766,64 @@
     if (arg < 30) {
       if (arg == 0) {
         attrs.reset();
-      } else if (arg == 1) {
+      }
+      else if (arg == 1) {
         attrs.bold = true;
-      } else if (arg == 2) {
+      }
+      else if (arg == 2) {
         attrs.faint = true;
-      } else if (arg == 3) {
+      }
+      else if (arg == 3) {
         attrs.italic = true;
-      } else if (arg == 4) {
+      }
+      else if (arg == 4) {
         attrs.underline = true;
-      } else if (arg == 5) {
+      }
+      else if (arg == 5) {
         attrs.blink = true;
-      } else if (arg == 7) {  // Inverse.
+      }
+      else if (arg == 7) { // Inverse.
         attrs.inverse = true;
-      } else if (arg == 8) {  // Invisible.
+      }
+      else if (arg == 8) { // Invisible.
         attrs.invisible = true;
-      } else if (arg == 9) {
+      }
+      else if (arg == 9) {
         attrs.strikethrough = true;
-      } else if (arg == 22) {
+      }
+      else if (arg == 22) {
         attrs.bold = false;
         attrs.faint = false;
-      } else if (arg == 23) {
+      }
+      else if (arg == 23) {
         attrs.italic = false;
-      } else if (arg == 24) {
+      }
+      else if (arg == 24) {
         attrs.underline = false;
-      } else if (arg == 25) {
+      }
+      else if (arg == 25) {
         attrs.blink = false;
-      } else if (arg == 27) {
+      }
+      else if (arg == 27) {
         attrs.inverse = false;
-      } else if (arg == 28) {
+      }
+      else if (arg == 28) {
         attrs.invisible = false;
-      } else if (arg == 29) {
+      }
+      else if (arg == 29) {
         attrs.strikethrough = false;
       }
 
-    } else if (arg < 50) {
+    }
+    else if (arg < 50) {
       // Select fore/background color from bottom half of 16 color palette
       // or from the 256 color palette or alternative specify color in fully
       // qualified rgb(r, g, b) form.
       if (arg < 38) {
         attrs.foregroundSource = arg - 30;
 
-      } else if (arg == 38) {
+      }
+      else if (arg == 38) {
         // First check for true color definition
         var trueColor = getTrueColor(i);
         if (trueColor != null) {
@@ -16424,7 +16831,8 @@
           attrs.foreground = trueColor;
 
           i += 5;
-        } else {
+        }
+        else {
           // Check for 256 color
           var c = get256(i);
           if (c == null)
@@ -16438,13 +16846,16 @@
           attrs.foregroundSource = c;
         }
 
-      } else if (arg == 39) {
+      }
+      else if (arg == 39) {
         attrs.foregroundSource = attrs.SRC_DEFAULT;
 
-      } else if (arg < 48) {
+      }
+      else if (arg < 48) {
         attrs.backgroundSource = arg - 40;
 
-      } else if (arg == 48) {
+      }
+      else if (arg == 48) {
         // First check for true color definition
         var trueColor = getTrueColor(i);
         if (trueColor != null) {
@@ -16452,7 +16863,8 @@
           attrs.background = trueColor;
 
           i += 5;
-        } else {
+        }
+        else {
           // Check for 256 color
           var c = get256(i);
           if (c == null)
@@ -16465,20 +16877,23 @@
 
           attrs.backgroundSource = c;
         }
-      } else {
+      }
+      else {
         attrs.backgroundSource = attrs.SRC_DEFAULT;
       }
 
-    } else if (arg >= 90 && arg <= 97) {
+    }
+    else if (arg >= 90 && arg <= 97) {
       attrs.foregroundSource = arg - 90 + 8;
 
-    } else if (arg >= 100 && arg <= 107) {
+    }
+    else if (arg >= 100 && arg <= 107) {
       attrs.backgroundSource = arg - 100 + 8;
     }
   }
 
   attrs.setDefaults(this.terminal.getForegroundColor(),
-                    this.terminal.getBackgroundColor());
+    this.terminal.getBackgroundColor());
 };
 
 /**
@@ -16497,7 +16912,8 @@
 hterm.VT.CSI['n'] = function(parseState) {
   if (parseState.args[0] == '5') {
     this.terminal.io.sendString('\x1b0n');
-  } else if (parseState.args[0] == '6') {
+  }
+  else if (parseState.args[0] == '6') {
     var row = this.terminal.getCursorRow() + 1;
     var col = this.terminal.getCursorColumn() + 1;
     this.terminal.io.sendString('\x1b[' + row + ';' + col + 'R');
@@ -16529,13 +16945,17 @@
     var row = this.terminal.getCursorRow() + 1;
     var col = this.terminal.getCursorColumn() + 1;
     this.terminal.io.sendString('\x1b[' + row + ';' + col + 'R');
-  } else if (parseState.args[0] == '15') {
+  }
+  else if (parseState.args[0] == '15') {
     this.terminal.io.sendString('\x1b[?11n');
-  } else if (parseState.args[0] == '25') {
+  }
+  else if (parseState.args[0] == '25') {
     this.terminal.io.sendString('\x1b[?21n');
-  } else if (parseState.args[0] == '26') {
+  }
+  else if (parseState.args[0] == '26') {
     this.terminal.io.sendString('\x1b[?12;1;0;0n');
-  } else if (parseState.args[0] == '53') {
+  }
+  else if (parseState.args[0] == '53') {
     this.terminal.io.sendString('\x1b[?50n');
   }
 };
@@ -16601,16 +17021,20 @@
   if (arg == '0' || arg == '1') {
     this.terminal.setCursorShape(hterm.Terminal.cursorShape.BLOCK);
     this.terminal.setCursorBlink(true);
-  } else if (arg == '2') {
+  }
+  else if (arg == '2') {
     this.terminal.setCursorShape(hterm.Terminal.cursorShape.BLOCK);
     this.terminal.setCursorBlink(false);
-  } else if (arg == '3') {
+  }
+  else if (arg == '3') {
     this.terminal.setCursorShape(hterm.Terminal.cursorShape.UNDERLINE);
     this.terminal.setCursorBlink(true);
-  } else if (arg == '4') {
+  }
+  else if (arg == '4') {
     this.terminal.setCursorShape(hterm.Terminal.cursorShape.UNDERLINE);
     this.terminal.setCursorBlink(false);
-  } else {
+  }
+  else {
     console.warn('Unknown cursor style: ' + arg);
   }
 };
@@ -16627,7 +17051,7 @@
  */
 hterm.VT.CSI['r'] = function(parseState) {
   var args = parseState.args;
-  var scrollTop = args[0] ? parseInt(args[0], 10) -1 : null;
+  var scrollTop = args[0] ? parseInt(args[0], 10) - 1 : null;
   var scrollBottom = args[1] ? parseInt(args[1], 10) - 1 : null;
   this.terminal.setVTScrollRegion(scrollTop, scrollBottom);
   this.terminal.setCursorPosition(0, 0);
@@ -16753,7 +17177,8 @@
     if (parseState.args.length < 2)
       return;
     this.terminal.getTextAttributes().tileData = parseState.args[1];
-  } else if (arg == '1') {
+  }
+  else if (arg == '1') {
     // End a glyph.
     this.terminal.getTextAttributes().tileData = null;
   }
@@ -16844,8 +17269,8 @@
   this.glmap = glmap;
 
   var glkeys = Object.keys(this.glmap).map(function(key) {
-      return '\\x' + lib.f.zpad(key.charCodeAt(0).toString(16));
-    });
+    return '\\x' + lib.f.zpad(key.charCodeAt(0).toString(16));
+  });
 
   this.glre = new RegExp('[' + glkeys.join('') + ']', 'g');
 
@@ -16854,24 +17279,28 @@
   this.grmap = {};
 
   glkeys.forEach(function(glkey) {
-      var grkey = String.fromCharCode(glkey.charCodeAt(0) & 0x80);
-      this.grmap[grkey] = this.glmap[glkey];
-    }.bind(this));
+    var grkey = String.fromCharCode(glkey.charCodeAt(0) & 0x80);
+    this.grmap[grkey] = this.glmap[glkey];
+  }.bind(this));
 
   var grkeys = Object.keys(this.grmap).map(function(key) {
-      return '\\x' + lib.f.zpad(key.charCodeAt(0).toString(16), 2);
-    });
+    return '\\x' + lib.f.zpad(key.charCodeAt(0).toString(16), 2);
+  });
 
   this.grre = new RegExp('[' + grkeys.join('') + ']', 'g');
 
   this.GL = function(str) {
     return str.replace(this.glre,
-                       function(ch) { return this.glmap[ch] }.bind(this));
+      function(ch) {
+        return this.glmap[ch];
+      }.bind(this));
   }.bind(this);
 
   this.GR = function(str) {
     return str.replace(this.grre,
-                       function(ch) { return this.grmap[ch] }.bind(this));
+      function(ch) {
+        return this.grmap[ch];
+      }.bind(this));
   }.bind(this);
 };
 
@@ -16886,93 +17315,93 @@
  * http://vt100.net/docs/vt220-rm/table2-4.html
  */
 hterm.VT.CharacterMap.maps['0'] = new hterm.VT.CharacterMap(
-    'graphic', {
-      '\x60':'\u25c6',  // ` -> diamond
-      '\x61':'\u2592',  // a -> grey-box
-      '\x62':'\u2409',  // b -> h/t
-      '\x63':'\u240c',  // c -> f/f
-      '\x64':'\u240d',  // d -> c/r
-      '\x65':'\u240a',  // e -> l/f
-      '\x66':'\u00b0',  // f -> degree
-      '\x67':'\u00b1',  // g -> +/-
-      '\x68':'\u2424',  // h -> n/l
-      '\x69':'\u240b',  // i -> v/t
-      '\x6a':'\u2518',  // j -> bottom-right
-      '\x6b':'\u2510',  // k -> top-right
-      '\x6c':'\u250c',  // l -> top-left
-      '\x6d':'\u2514',  // m -> bottom-left
-      '\x6e':'\u253c',  // n -> line-cross
-      '\x6f':'\u23ba',  // o -> scan1
-      '\x70':'\u23bb',  // p -> scan3
-      '\x71':'\u2500',  // q -> scan5
-      '\x72':'\u23bc',  // r -> scan7
-      '\x73':'\u23bd',  // s -> scan9
-      '\x74':'\u251c',  // t -> left-tee
-      '\x75':'\u2524',  // u -> right-tee
-      '\x76':'\u2534',  // v -> bottom-tee
-      '\x77':'\u252c',  // w -> top-tee
-      '\x78':'\u2502',  // x -> vertical-line
-      '\x79':'\u2264',  // y -> less-equal
-      '\x7a':'\u2265',  // z -> greater-equal
-      '\x7b':'\u03c0',  // { -> pi
-      '\x7c':'\u2260',  // | -> not-equal
-      '\x7d':'\u00a3',  // } -> british-pound
-      '\x7e':'\u00b7',  // ~ -> dot
-    });
+  'graphic', {
+    '`': '◆', // ` -> diamond
+    'a': '▒', // a -> grey-box
+    'b': '␉', // b -> h/t
+    'c': '␌', // c -> f/f
+    'd': '␍', // d -> c/r
+    'e': '␊', // e -> l/f
+    'f': '°', // f -> degree
+    'g': '±', // g -> +/-
+    'h': '␤', // h -> n/l
+    'i': '␋', // i -> v/t
+    'j': '┘', // j -> bottom-right
+    'k': '┐', // k -> top-right
+    'l': '┌', // l -> top-left
+    'm': '└', // m -> bottom-left
+    'n': '┼', // n -> line-cross
+    'o': '⎺', // o -> scan1
+    'p': '⎻', // p -> scan3
+    'q': '─', // q -> scan5
+    'r': '⎼', // r -> scan7
+    's': '⎽', // s -> scan9
+    't': '├', // t -> left-tee
+    'u': '┤', // u -> right-tee
+    'v': '┴', // v -> bottom-tee
+    'w': '┬', // w -> top-tee
+    'x': '│', // x -> vertical-line
+    'y': '≤', // y -> less-equal
+    'z': '≥', // z -> greater-equal
+    '{': 'π', // { -> pi
+    '|': '≠', // | -> not-equal
+    '}': '£', // } -> british-pound
+    '~': '·', // ~ -> dot
+  });
 
 /**
  * British character map.
  * http://vt100.net/docs/vt220-rm/table2-5.html
  */
 hterm.VT.CharacterMap.maps['A'] = new hterm.VT.CharacterMap(
-    'british', {
-      '\x23': '\u00a3',  // # -> british-pound
-    });
+  'british', {
+    '#': '£', // # -> british-pound
+  });
 
 /**
  * US ASCII map, no changes.
  */
 hterm.VT.CharacterMap.maps['B'] = new hterm.VT.CharacterMap(
-    'us', null);
+  'us', null);
 
 /**
  * Dutch character map.
  * http://vt100.net/docs/vt220-rm/table2-6.html
  */
 hterm.VT.CharacterMap.maps['4'] = new hterm.VT.CharacterMap(
-    'dutch', {
-      '\x23': '\u00a3',  // # -> british-pound
+  'dutch', {
+    '#': '£', // # -> british-pound
 
-      '\x40': '\u00be',  // @ -> 3/4
+    '@': '¾', // @ -> 3/4
 
-      '\x5b': '\u0132',  // [ -> 'ij' ligature (xterm goes with \u00ff?)
-      '\x5c': '\u00bd',  // \ -> 1/2
-      '\x5d': '\u007c',  // ] -> vertical bar
+    '[': 'IJ', // [ -> 'ij' ligature (xterm goes with \u00ff?)
+    '\\': '½', // \ -> 1/2
+    ']': '|', // ] -> vertical bar
 
-      '\x7b': '\u00a8',  // { -> two dots
-      '\x7c': '\u0066',  // | -> f
-      '\x7d': '\u00bc',  // } -> 1/4
-      '\x7e': '\u00b4',  // ~ -> acute
-    });
+    '{': '¨', // { -> two dots
+    '|': 'f', // | -> f
+    '}': '¼', // } -> 1/4
+    '~': '´', // ~ -> acute
+  });
 
 /**
  * Finnish character map.
  * http://vt100.net/docs/vt220-rm/table2-7.html
  */
 hterm.VT.CharacterMap.maps['C'] =
-hterm.VT.CharacterMap.maps['5'] = new hterm.VT.CharacterMap(
+  hterm.VT.CharacterMap.maps['5'] = new hterm.VT.CharacterMap(
     'finnish', {
-      '\x5b': '\u00c4',  // [ -> 'A' umlaut
-      '\x5c': '\u00d6',  // \ -> 'O' umlaut
-      '\x5d': '\u00c5',  // ] -> 'A' ring
-      '\x5e': '\u00dc',  // ~ -> 'u' umlaut
+      '[': 'Ä', // [ -> 'A' umlaut
+      '\\': 'Ö', // \ -> 'O' umlaut
+      ']': 'Å', // ] -> 'A' ring
+      '^': 'Ü', // ~ -> 'u' umlaut
 
-      '\x60': '\u00e9',  // ` -> 'e' acute
+      '`': 'é', // ` -> 'e' acute
 
-      '\x7b': '\u00e4',  // { -> 'a' umlaut
-      '\x7c': '\u00f6',  // | -> 'o' umlaut
-      '\x7d': '\u00e5',  // } -> 'a' ring
-      '\x7e': '\u00fc',  // ~ -> 'u' umlaut
+      '{': 'ä', // { -> 'a' umlaut
+      '|': 'ö', // | -> 'o' umlaut
+      '}': 'å', // } -> 'a' ring
+      '~': 'ü', // ~ -> 'u' umlaut
     });
 
 /**
@@ -16980,102 +17409,102 @@
  * http://vt100.net/docs/vt220-rm/table2-8.html
  */
 hterm.VT.CharacterMap.maps['R'] = new hterm.VT.CharacterMap(
-    'french', {
-      '\x23': '\u00a3',  // # -> british-pound
+  'french', {
+    '#': '£', // # -> british-pound
 
-      '\x40': '\u00e0',  // @ -> 'a' grave
+    '@': 'à', // @ -> 'a' grave
 
-      '\x5b': '\u00b0',  // [ -> ring
-      '\x5c': '\u00e7',  // \ -> 'c' cedilla
-      '\x5d': '\u00a7',  // ] -> section symbol (double s)
+    '[': '°', // [ -> ring
+    '\\': 'ç', // \ -> 'c' cedilla
+    ']': '§', // ] -> section symbol (double s)
 
-      '\x7b': '\u00e9',  // { -> 'e' acute
-      '\x7c': '\u00f9',  // | -> 'u' grave
-      '\x7d': '\u00e8',  // } -> 'e' grave
-      '\x7e': '\u00a8',  // ~ -> umlaut
-    });
+    '{': 'é', // { -> 'e' acute
+    '|': 'ù', // | -> 'u' grave
+    '}': 'è', // } -> 'e' grave
+    '~': '¨', // ~ -> umlaut
+  });
 
 /**
  * French Canadian character map.
  * http://vt100.net/docs/vt220-rm/table2-9.html
  */
 hterm.VT.CharacterMap.maps['Q'] = new hterm.VT.CharacterMap(
-    'french canadian', {
-      '\x40': '\u00e0',  // @ -> 'a' grave
+  'french canadian', {
+    '@': 'à', // @ -> 'a' grave
 
-      '\x5b': '\u00e2',  // [ -> 'a' circumflex
-      '\x5c': '\u00e7',  // \ -> 'c' cedilla
-      '\x5d': '\u00ea',  // ] -> 'e' circumflex
-      '\x5e': '\u00ee',  // ^ -> 'i' circumflex
+    '[': 'â', // [ -> 'a' circumflex
+    '\\': 'ç', // \ -> 'c' cedilla
+    ']': 'ê', // ] -> 'e' circumflex
+    '^': 'î', // ^ -> 'i' circumflex
 
-      '\x60': '\u00f4',  // ` -> 'o' circumflex
+    '`': 'ô', // ` -> 'o' circumflex
 
-      '\x7b': '\u00e9',  // { -> 'e' acute
-      '\x7c': '\u00f9',  // | -> 'u' grave
-      '\x7d': '\u00e8',  // } -> 'e' grave
-      '\x7e': '\u00fb',  // ~ -> 'u' circumflex
-    });
+    '{': 'é', // { -> 'e' acute
+    '|': 'ù', // | -> 'u' grave
+    '}': 'è', // } -> 'e' grave
+    '~': 'û', // ~ -> 'u' circumflex
+  });
 
 /**
  * German character map.
  * http://vt100.net/docs/vt220-rm/table2-10.html
  */
 hterm.VT.CharacterMap.maps['K'] = new hterm.VT.CharacterMap(
-    'german', {
-      '\x40': '\u00a7',  // @ -> section symbol (double s)
+  'german', {
+    '@': '§', // @ -> section symbol (double s)
 
-      '\x5b': '\u00c4',  // [ -> 'A' umlaut
-      '\x5c': '\u00d6',  // \ -> 'O' umlaut
-      '\x5d': '\u00dc',  // ] -> 'U' umlaut
+    '[': 'Ä', // [ -> 'A' umlaut
+    '\\': 'Ö', // \ -> 'O' umlaut
+    ']': 'Ü', // ] -> 'U' umlaut
 
-      '\x7b': '\u00e4',  // { -> 'a' umlaut
-      '\x7c': '\u00f6',  // | -> 'o' umlaut
-      '\x7d': '\u00fc',  // } -> 'u' umlaut
-      '\x7e': '\u00df',  // ~ -> eszett
-    });
+    '{': 'ä', // { -> 'a' umlaut
+    '|': 'ö', // | -> 'o' umlaut
+    '}': 'ü', // } -> 'u' umlaut
+    '~': 'ß', // ~ -> eszett
+  });
 
 /**
  * Italian character map.
  * http://vt100.net/docs/vt220-rm/table2-11.html
  */
 hterm.VT.CharacterMap.maps['Y'] = new hterm.VT.CharacterMap(
-    'italian', {
-      '\x23': '\u00a3',  // # -> british-pound
+  'italian', {
+    '#': '£', // # -> british-pound
 
-      '\x40': '\u00a7',  // @ -> section symbol (double s)
+    '@': '§', // @ -> section symbol (double s)
 
-      '\x5b': '\u00b0',  // [ -> ring
-      '\x5c': '\u00e7',  // \ -> 'c' cedilla
-      '\x5d': '\u00e9',  // ] -> 'e' acute
+    '[': '°', // [ -> ring
+    '\\': 'ç', // \ -> 'c' cedilla
+    ']': 'é', // ] -> 'e' acute
 
-      '\x60': '\u00f9',  // ` -> 'u' grave
+    '`': 'ù', // ` -> 'u' grave
 
-      '\x7b': '\u00e0',  // { -> 'a' grave
-      '\x7c': '\u00f2',  // | -> 'o' grave
-      '\x7d': '\u00e8',  // } -> 'e' grave
-      '\x7e': '\u00ec',  // ~ -> 'i' grave
-    });
+    '{': 'à', // { -> 'a' grave
+    '|': 'ò', // | -> 'o' grave
+    '}': 'è', // } -> 'e' grave
+    '~': 'ì', // ~ -> 'i' grave
+  });
 
 /**
  * Norwegian/Danish character map.
  * http://vt100.net/docs/vt220-rm/table2-12.html
  */
 hterm.VT.CharacterMap.maps['E'] =
-hterm.VT.CharacterMap.maps['6'] = new hterm.VT.CharacterMap(
+  hterm.VT.CharacterMap.maps['6'] = new hterm.VT.CharacterMap(
     'norwegian/danish', {
-      '\x40': '\u00c4',  // @ -> 'A' umlaut
+      '@': 'Ä', // @ -> 'A' umlaut
 
-      '\x5b': '\u00c6',  // [ -> 'AE' ligature
-      '\x5c': '\u00d8',  // \ -> 'O' stroke
-      '\x5d': '\u00c5',  // ] -> 'A' ring
-      '\x5e': '\u00dc',  // ^ -> 'U' umlaut
+      '[': 'Æ', // [ -> 'AE' ligature
+      '\\': 'Ø', // \ -> 'O' stroke
+      ']': 'Å', // ] -> 'A' ring
+      '^': 'Ü', // ^ -> 'U' umlaut
 
-      '\x60': '\u00e4',  // ` -> 'a' umlaut
+      '`': 'ä', // ` -> 'a' umlaut
 
-      '\x7b': '\u00e6',  // { -> 'ae' ligature
-      '\x7c': '\u00f8',  // | -> 'o' stroke
-      '\x7d': '\u00e5',  // } -> 'a' ring
-      '\x7e': '\u00fc',  // ~ -> 'u' umlaut
+      '{': 'æ', // { -> 'ae' ligature
+      '|': 'ø', // | -> 'o' stroke
+      '}': 'å', // } -> 'a' ring
+      '~': 'ü', // ~ -> 'u' umlaut
     });
 
 /**
@@ -17083,40 +17512,40 @@
  * http://vt100.net/docs/vt220-rm/table2-13.html
  */
 hterm.VT.CharacterMap.maps['Z'] = new hterm.VT.CharacterMap(
-    'spanish', {
-      '\x23': '\u00a3',  // # -> british-pound
+  'spanish', {
+    '#': '£', // # -> british-pound
 
-      '\x40': '\u00a7',  // @ -> section symbol (double s)
+    '@': '§', // @ -> section symbol (double s)
 
-      '\x5b': '\u00a1',  // [ -> '!' inverted
-      '\x5c': '\u00d1',  // \ -> 'N' tilde
-      '\x5d': '\u00bf',  // ] -> '?' inverted
+    '[': '¡', // [ -> '!' inverted
+    '\\': 'Ñ', // \ -> 'N' tilde
+    ']': '¿', // ] -> '?' inverted
 
-      '\x7b': '\u00b0',  // { -> ring
-      '\x7c': '\u00f1',  // | -> 'n' tilde
-      '\x7d': '\u00e7',  // } -> 'c' cedilla
-    });
+    '{': '°', // { -> ring
+    '|': 'ñ', // | -> 'n' tilde
+    '}': 'ç', // } -> 'c' cedilla
+  });
 
 /**
  * Swedish character map.
  * http://vt100.net/docs/vt220-rm/table2-14.html
  */
 hterm.VT.CharacterMap.maps['7'] =
-hterm.VT.CharacterMap.maps['H'] = new hterm.VT.CharacterMap(
+  hterm.VT.CharacterMap.maps['H'] = new hterm.VT.CharacterMap(
     'swedish', {
-      '\x40': '\u00c9',  // @ -> 'E' acute
+      '@': 'É', // @ -> 'E' acute
 
-      '\x5b': '\u00c4',  // [ -> 'A' umlaut
-      '\x5c': '\u00d6',  // \ -> 'O' umlaut
-      '\x5d': '\u00c5',  // ] -> 'A' ring
-      '\x5e': '\u00dc',  // ^ -> 'U' umlaut
+      '[': 'Ä', // [ -> 'A' umlaut
+      '\\': 'Ö', // \ -> 'O' umlaut
+      ']': 'Å', // ] -> 'A' ring
+      '^': 'Ü', // ^ -> 'U' umlaut
 
-      '\x60': '\u00e9',  // ` -> 'e' acute
+      '`': 'é', // ` -> 'e' acute
 
-      '\x7b': '\u00e4',  // { -> 'a' umlaut
-      '\x7c': '\u00f6',  // | -> 'o' umlaut
-      '\x7d': '\u00e5',  // } -> 'a' ring
-      '\x7e': '\u00fc',  // ~ -> 'u' umlaut
+      '{': 'ä', // { -> 'a' umlaut
+      '|': 'ö', // | -> 'o' umlaut
+      '}': 'å', // } -> 'a' ring
+      '~': 'ü', // ~ -> 'u' umlaut
     });
 
 /**
@@ -17124,172 +17553,170 @@
  * http://vt100.net/docs/vt220-rm/table2-15.html
  */
 hterm.VT.CharacterMap.maps['='] = new hterm.VT.CharacterMap(
-    'swiss', {
-      '\x23': '\u00f9',  // # -> 'u' grave
+  'swiss', {
+    '#': 'ù', // # -> 'u' grave
 
-      '\x40': '\u00e0',  // @ -> 'a' grave
+    '@': 'à', // @ -> 'a' grave
 
-      '\x5b': '\u00e9',  // [ -> 'e' acute
-      '\x5c': '\u00e7',  // \ -> 'c' cedilla
-      '\x5d': '\u00ea',  // ] -> 'e' circumflex
-      '\x5e': '\u00ee',  // ^ -> 'i' circumflex
-      '\x5f': '\u00e8',  // _ -> 'e' grave
+    '[': 'é', // [ -> 'e' acute
+    '\\': 'ç', // \ -> 'c' cedilla
+    ']': 'ê', // ] -> 'e' circumflex
+    '^': 'î', // ^ -> 'i' circumflex
+    '_': 'è', // _ -> 'e' grave
 
-      '\x60': '\u00f4',  // ` -> 'o' circumflex
+    '`': 'ô', // ` -> 'o' circumflex
 
-      '\x7b': '\u00e4',  // { -> 'a' umlaut
-      '\x7c': '\u00f6',  // | -> 'o' umlaut
-      '\x7d': '\u00fc',  // } -> 'u' umlaut
-      '\x7e': '\u00fb',  // ~ -> 'u' circumflex
-    });
+    '{': 'ä', // { -> 'a' umlaut
+    '|': 'ö', // | -> 'o' umlaut
+    '}': 'ü', // } -> 'u' umlaut
+    '~': 'û', // ~ -> 'u' circumflex
+  });
 lib.resource.add('hterm/audio/bell', 'audio/ogg;base64',
-'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' +
-'zinmkFLKMeUcUko5p5xTzjkIHYTKMQadgxAppRxTzinHHITMQeWcg9BBKAAAIMABACDAQig0ZEUA' +
-'ECcA4HAkz5M0SxQlSxNFzxRl1xNN15U0zTQ1UVRVyxNV1VRV2xZNVbYlTRNNTfRUVRNFVRVV05ZN' +
-'VbVtzzRl2VRV3RZV1bZl2xZ+V5Z13zNNWRZV1dZNVbV115Z9X9ZtXZg0zTQ1UVRVTRRV1VRV2zZV' +
-'17Y1UXRVUVVlWVRVWXZlWfdVV9Z9SxRV1VNN2RVVVbZV2fVtVZZ94XRVXVdl2fdVWRZ+W9eF4fZ9' +
-'4RhV1dZN19V1VZZ9YdZlYbd13yhpmmlqoqiqmiiqqqmqtm2qrq1bouiqoqrKsmeqrqzKsq+rrmzr' +
-'miiqrqiqsiyqqiyrsqz7qizrtqiquq3KsrCbrqvrtu8LwyzrunCqrq6rsuz7qizruq3rxnHrujB8' +
-'pinLpqvquqm6um7runHMtm0co6rqvirLwrDKsu/rui+0dSFRVXXdlF3jV2VZ921fd55b94WybTu/' +
-'rfvKceu60vg5z28cubZtHLNuG7+t+8bzKz9hOI6lZ5q2baqqrZuqq+uybivDrOtCUVV9XZVl3zdd' +
-'WRdu3zeOW9eNoqrquirLvrDKsjHcxm8cuzAcXds2jlvXnbKtC31jyPcJz2vbxnH7OuP2daOvDAnH' +
-'jwAAgAEHAIAAE8pAoSErAoA4AQAGIecUUxAqxSB0EFLqIKRUMQYhc05KxRyUUEpqIZTUKsYgVI5J' +
-'yJyTEkpoKZTSUgehpVBKa6GU1lJrsabUYu0gpBZKaS2U0lpqqcbUWowRYxAy56RkzkkJpbQWSmkt' +
-'c05K56CkDkJKpaQUS0otVsxJyaCj0kFIqaQSU0mptVBKa6WkFktKMbYUW24x1hxKaS2kEltJKcYU' +
-'U20txpojxiBkzknJnJMSSmktlNJa5ZiUDkJKmYOSSkqtlZJSzJyT0kFIqYOOSkkptpJKTKGU1kpK' +
-'sYVSWmwx1pxSbDWU0lpJKcaSSmwtxlpbTLV1EFoLpbQWSmmttVZraq3GUEprJaUYS0qxtRZrbjHm' +
-'GkppraQSW0mpxRZbji3GmlNrNabWam4x5hpbbT3WmnNKrdbUUo0txppjbb3VmnvvIKQWSmktlNJi' +
-'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' +
-'m2L/kruPM6Q7oz4tvDQy+bZ3HzOi+gNHA4DZEgA=' +
-''
+  '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' +
+  'zinmkFLKMeUcUko5p5xTzjkIHYTKMQadgxAppRxTzinHHITMQeWcg9BBKAAAIMABACDAQig0ZEUA' +
+  'ECcA4HAkz5M0SxQlSxNFzxRl1xNN15U0zTQ1UVRVyxNV1VRV2xZNVbYlTRNNTfRUVRNFVRVV05ZN' +
+  'VbVtzzRl2VRV3RZV1bZl2xZ+V5Z13zNNWRZV1dZNVbV115Z9X9ZtXZg0zTQ1UVRVTRRV1VRV2zZV' +
+  '17Y1UXRVUVVlWVRVWXZlWfdVV9Z9SxRV1VNN2RVVVbZV2fVtVZZ94XRVXVdl2fdVWRZ+W9eF4fZ9' +
+  '4RhV1dZN19V1VZZ9YdZlYbd13yhpmmlqoqiqmiiqqqmqtm2qrq1bouiqoqrKsmeqrqzKsq+rrmzr' +
+  'miiqrqiqsiyqqiyrsqz7qizrtqiquq3KsrCbrqvrtu8LwyzrunCqrq6rsuz7qizruq3rxnHrujB8' +
+  'pinLpqvquqm6um7runHMtm0co6rqvirLwrDKsu/rui+0dSFRVXXdlF3jV2VZ921fd55b94WybTu/' +
+  'rfvKceu60vg5z28cubZtHLNuG7+t+8bzKz9hOI6lZ5q2baqqrZuqq+uybivDrOtCUVV9XZVl3zdd' +
+  'WRdu3zeOW9eNoqrquirLvrDKsjHcxm8cuzAcXds2jlvXnbKtC31jyPcJz2vbxnH7OuP2daOvDAnH' +
+  'jwAAgAEHAIAAE8pAoSErAoA4AQAGIecUUxAqxSB0EFLqIKRUMQYhc05KxRyUUEpqIZTUKsYgVI5J' +
+  'yJyTEkpoKZTSUgehpVBKa6GU1lJrsabUYu0gpBZKaS2U0lpqqcbUWowRYxAy56RkzkkJpbQWSmkt' +
+  'c05K56CkDkJKpaQUS0otVsxJyaCj0kFIqaQSU0mptVBKa6WkFktKMbYUW24x1hxKaS2kEltJKcYU' +
+  'U20txpojxiBkzknJnJMSSmktlNJa5ZiUDkJKmYOSSkqtlZJSzJyT0kFIqYOOSkkptpJKTKGU1kpK' +
+  'sYVSWmwx1pxSbDWU0lpJKcaSSmwtxlpbTLV1EFoLpbQWSmmttVZraq3GUEprJaUYS0qxtRZrbjHm' +
+  'GkppraQSW0mpxRZbji3GmlNrNabWam4x5hpbbT3WmnNKrdbUUo0txppjbb3VmnvvIKQWSmktlNJi' +
+  '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' +
+  'm2L/kruPM6Q7oz4tvDQy+bZ3HzOi+gNHA4DZEgA=' +
+  ''
 );
 
 lib.resource.add('hterm/concat/date', 'text/plain',
-'Tue, 25 Apr 2017 15:12:45 +0000' +
-''
+  'Tue, 25 Apr 2017 15:12:45 +0000' +
+  ''
 );
 
 lib.resource.add('hterm/changelog/version', 'text/plain',
-'1.62' +
-''
+  '1.62' +
+  ''
 );
 
 lib.resource.add('hterm/changelog/date', 'text/plain',
-'2017-04-17' +
-''
+  '2017-04-17' +
+  ''
 );
 
 lib.resource.add('hterm/git/HEAD', 'text/plain',
-'git rev-parse HEAD' +
-''
+  'git rev-parse HEAD' +
+  ''
 );
-
-