Index: frontend/node_modules/data-urls/lib/parser.js
===================================================================
--- frontend/node_modules/data-urls/lib/parser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/data-urls/lib/parser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,74 @@
+"use strict";
+const MIMEType = require("whatwg-mimetype");
+const { parseURL, serializeURL } = require("whatwg-url");
+const {
+  stripLeadingAndTrailingASCIIWhitespace,
+  stringPercentDecode,
+  isomorphicDecode,
+  forgivingBase64Decode
+} = require("./utils.js");
+
+module.exports = stringInput => {
+  const urlRecord = parseURL(stringInput);
+
+  if (urlRecord === null) {
+    return null;
+  }
+
+  return module.exports.fromURLRecord(urlRecord);
+};
+
+module.exports.fromURLRecord = urlRecord => {
+  if (urlRecord.scheme !== "data") {
+    return null;
+  }
+
+  const input = serializeURL(urlRecord, true).substring("data:".length);
+
+  let position = 0;
+
+  let mimeType = "";
+  while (position < input.length && input[position] !== ",") {
+    mimeType += input[position];
+    ++position;
+  }
+  mimeType = stripLeadingAndTrailingASCIIWhitespace(mimeType);
+
+  if (position === input.length) {
+    return null;
+  }
+
+  ++position;
+
+  const encodedBody = input.substring(position);
+
+  let body = stringPercentDecode(encodedBody);
+
+  // Can't use /i regexp flag because it isn't restricted to ASCII.
+  const mimeTypeBase64MatchResult = /(.*); *[Bb][Aa][Ss][Ee]64$/.exec(mimeType);
+  if (mimeTypeBase64MatchResult) {
+    const stringBody = isomorphicDecode(body);
+    body = forgivingBase64Decode(stringBody);
+
+    if (body === null) {
+      return null;
+    }
+    mimeType = mimeTypeBase64MatchResult[1];
+  }
+
+  if (mimeType.startsWith(";")) {
+    mimeType = "text/plain" + mimeType;
+  }
+
+  let mimeTypeRecord;
+  try {
+    mimeTypeRecord = new MIMEType(mimeType);
+  } catch (e) {
+    mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII");
+  }
+
+  return {
+    mimeType: mimeTypeRecord,
+    body
+  };
+};
Index: frontend/node_modules/data-urls/lib/utils.js
===================================================================
--- frontend/node_modules/data-urls/lib/utils.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/data-urls/lib/utils.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+"use strict";
+const { percentDecode } = require("whatwg-url");
+const { atob } = require("abab");
+
+exports.stripLeadingAndTrailingASCIIWhitespace = string => {
+  return string.replace(/^[ \t\n\f\r]+/, "").replace(/[ \t\n\f\r]+$/, "");
+};
+
+exports.stringPercentDecode = input => {
+  return percentDecode(Buffer.from(input, "utf-8"));
+};
+
+exports.isomorphicDecode = input => {
+  return input.toString("binary");
+};
+
+exports.forgivingBase64Decode = data => {
+  const asString = atob(data);
+  if (asString === null) {
+    return null;
+  }
+  return Buffer.from(asString, "binary");
+};
