text: const fs = require("fs");
  const path = require("path");
  const sriToolbox = require("sri-toolbox");
  
  const version = process.argv[2];
  
  function read(file, encoding) {
      return new Promise((resolve, reject) =>
          fs.readFile(file, encoding, (err, body) =>
              err ? reject(err) : resolve(body)));
  }
  
  function write(file, data) {
      return new Promise((resolve, reject) =>
          fs.writeFile(file, data, (err) =>
              err ? reject(err) : resolve()));
  }
  
  Promise.all(process.argv.slice(3).map(file =>
      read(file, "utf8")
      .then(body => {
          // 1 - url prefix: "http…/KaTeX/
          // 2 - opening quote: "
          // 3 - preserved suffix: /katex.min.js" integrity="…"
          // 4 - file name: katex.min.js
          // 5 - integrity opening quote: "
          // 6 - old hash: sha384-…
          // 7 - integrity hash algorithm: sha384
          const re = /((["'])https?:\/\/cdnjs.cloudflare.com\/ajax\/libs\/KaTeX\/)[^\/"']+(\/([^"']+)\2(?:\s+integrity=(["'])(([^-]+)-[^"']+)\5)?)/g;
          const hashes = {};
          body = body.replace(re, (m, pre, oq1, post, file, oq2, old, algo) => {
              if (old) {
                  hashes[old] = { file, algo };
              }
              return pre + version + post;
          });
          return Promise.all(Object.keys(hashes).map(hash =>
              read(path.join("dist", hashes[hash].file), null)
              .then(data => {
                  body = body.replace(hash, sriToolbox.generate({
                      algorithms: [hashes[hash].algo],
                  }, data));
              })
          )).then(() => write(file, body));
      })
  )).then(() => process.exit(0), err => {
      console.error(err.stack);
      process.exit(1);
  });
  