~harmless/security.txt

690d61def861f27c6a9709119bbfa2ca45bf1040 — QbanB 1 year, 8 months ago 614b6f2 + ef8216c
Merge pull request #2 from HarmlessSystems/feature/mvp-signed

Merge MVP branch into master before release
A .github/workflow/lint.yml => .github/workflow/lint.yml +11 -0
@@ 0,0 1,11 @@
name: Lint
on: [pull_request, push]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install node_modules
      run: yarn
    - name: Lint Node.js
      run:  yarn run lint
\ No newline at end of file

A .gitignore => .gitignore +3 -0
@@ 0,0 1,3 @@
node_modules/
build/
.DS_Store

A .jshintrc => .jshintrc +14 -0
@@ 0,0 1,14 @@
{
  "curly": true, 
  "eqeqeq": true,
  "latedef": true,
  "undef": true,
  "unused": true,
  "browser": true,
  "esversion": 6,
  "globals": {
    "browser": true,
    "console": true,
    "chrome": true
  }
}

A .jshintrc.node => .jshintrc.node +9 -0
@@ 0,0 1,9 @@
{
  "curly": true, 
  "eqeqeq": true,
  "latedef": true,
  "undef": true,
  "unused": true,
  "node": true,
  "esversion": 6
}

A Gruntfile.js => Gruntfile.js +183 -0
@@ 0,0 1,183 @@
'use strict';

const browsers = ['firefox', 'chrome', 'opera', 'edge'];

module.exports = function(grunt) {
 
  require('load-grunt-tasks')(grunt);

  const packageJSON = grunt.file.readJSON('package.json');

  grunt.initConfig({
    package: packageJSON,
    manifest: grunt.file.readJSON('src/manifest.json'),
    browsers: browsers,
    mkdir: {
      all: {
        options: {
          create: browsers.map(browser => `build/${browser}`)
        }
      }
    },
    clean: {
      all: ['build']
    },
    copy: {
      src: {
        files: browsers.map((browser) => {
          return {
            expand: true,
            cwd: 'src/',
            src: ['**', '!manifest*json'],
            dest: `build/${browser}`
          };
        })
      },
      misc: {
        files: browsers.map((browser) => {
          return {
            expand: true,
            cwd: '.',
            src: ['security.txt', 'LICENSE'],
            dest: `build/${browser}`
          };
        })
      },
      polyfill: {
        files: browsers.map((browser) => {
          return {
            src: 'node_modules/webextension-polyfill/dist/browser-polyfill.js',
            dest: `build/${browser}/js/browser-polyfill.js`
          };
        })
      }
    },
    jshint: {
      extension: {
        options: {
          jshintrc: '.jshintrc'
        },
        src: [
          'src/js/**.js'
        ]
      },
      node: {
        options: {
          jshintrc: '.jshintrc.node'
        },
        src: ['Gruntfile.js']
      },
    },
    compress: {
      firefox: {
        options: {
          archive: `build/release/${packageJSON.name}-${packageJSON.version}-firefox.zip`
        },
        files: [{
          expand: true,
          cwd: 'build/firefox',
          src: ['**'],
          dest: '/'
        }]
      },
      chrome: {
        options: {
          archive: `build/release/${packageJSON.name}-${packageJSON.version}-chrome.zip`
        },
        files: [{
          expand: true,
          cwd: 'build/chrome',
          src: ['**'],
          dest: '/'
        }]
      },
      opera: {
        options: {
          archive: `build/release/${packageJSON.name}-${packageJSON.version}-opera.zip`
        },
        files: [{
          expand: true,
          cwd: 'build/opera',
          src: ['**'],
          dest: '/'
        }]
      },
      edge: {
        options: {
          archive: `build/release/${packageJSON.name}-${packageJSON.version}-edge.zip`
        },
        files: [{
          expand: true,
          cwd: 'build/edge',
          src: ['**'],
          dest: '/'
        }]
      }
    }
  });

  grunt.registerTask('manifests', 'Combine manifest.json files', () => {
    const {merge} = require('lodash/object');
    function rmNotes(obj) {
      const notesRegExp = new RegExp('^_notes_');
      Object.keys(obj).forEach((key) => {
        if (notesRegExp.test(key)) {
          delete obj[key];
        }
      });
    }

    const pkg = grunt.config.get('package');
    const manifest = grunt.config.get('manifest');

    manifest.name = pkg.name;
    manifest.version = pkg.version;
    manifest.author = pkg.author;
    manifest.homepage_url = pkg.homepage;

    rmNotes(manifest);
    
    grunt.log.subhead('Creating browser specific manifest files');

    browsers.forEach((browser) => {
      const browserManifest = grunt.file.readJSON(`src/manifest.${browser}.json`);
      const manifestCopy = Object.assign({}, manifest);
      const filePath = `build/${browser}/manifest.json`;
      rmNotes(browserManifest);
      merge(manifestCopy, browserManifest);
      grunt.file.write(filePath, JSON.stringify(manifestCopy, null, 2));
      grunt.log.ok(filePath);
    });
  });

  grunt.registerTask('quirks', 'Append browser global to work around quirks', () => {
    const {appendFileSync} = require('fs');
    browsers.forEach((browser) => {
      appendFileSync(`build/${browser}/js/global.js`, `\nconst BROWSER_QUIRKS = '${browser}';`);
    });
  });

  grunt.registerTask('lint', [
    'jshint:extension',
    'jshint:node',
  ]);

  grunt.registerTask('default', [
    'lint',
    'clean',
    'mkdir',
    'manifests',
    'copy:src',
    'copy:polyfill',
    'copy:misc',
    'quirks'
  ]);

  grunt.registerTask('release', [
    'default',
    'compress:firefox',
    'compress:chrome',
    'compress:opera',
    'compress:edge'
  ]);
};

M README.md => README.md +28 -1
@@ 1,2 1,29 @@
# security.txt
 Cross-platform browser extension for security.txt and humans.txt files.

Cross-platform browser extension for security.txt and humans.txt files.

As you browse the web, this extension will check for a [security.txt](https://tools.ietf.org/html/draft-foudil-securitytxt-08) 
and [humans.txt](http://humanstxt.org) file on each site you visit. If either file exists, the pageAction can be clicked to 
display the files.

## Building locally

``yarn && yarn run build``

Each supported browser has a subdirectory within the `build` directory.

## Developer Quick Reference

- [Firefox Browser Extensions MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions)
- [Chrome Extension Developer Guide](https://developer.chrome.com/extensions/devguide)
- [Opera Extensions Documentation](https://dev.opera.com/extensions/)
- [Microsoft Edge (EdgeHTML) extensions](https://docs.microsoft.com/en-us/microsoft-edge/extensions/)

## [License](LICENSE)

This project is licensed under the [BSD-2-Clause](https://opensource.org/licenses/BSD-2-Clause) license except where otherwise noted in the source files.

- [awsm.css](https://github.com/igoradamenko/awsm.css) is under the [MIT](https://opensource.org/licenses/MIT) license
- [webextension-polyfill](https://github.com/mozilla/webextension-polyfill) is under the [MPL-2.0](https://opensource.org/licenses/MPL-2.0)

See the [package.json](package.json) file for node modules used for building the project.
\ No newline at end of file

A package.json => package.json +27 -0
@@ 0,0 1,27 @@
{
  "name": "security.txt",
  "version": "1.0.0",
  "description": "Cross-platform browser extension for security.txt and humans.txt files.",
  "homepage": "https://www.harmless.systems/products/security-txt.html",
  "main": "Gruntfile.js",
  "repository": "git@github.com:HarmlessSystems/security.txt.git",
  "author": "Harmless Systems <info@harmless.systems>",
  "license": "BSD-2-Clause",
  "scripts": {
    "build": "grunt",
    "lint": "grunt lint",
    "release": "grunt release"
  },
  "devDependencies": {
    "grunt": "^1.0.4",
    "grunt-cli": "^1.3.2",
    "grunt-contrib-clean": "^2.0.0",
    "grunt-contrib-compress": "^1.6.0",
    "grunt-contrib-copy": "^1.0.0",
    "grunt-contrib-jshint": "^2.1.0",
    "grunt-mkdir": "^1.0.0",
    "load-grunt-tasks": "^5.1.0",
    "lodash": "^4.17.15",
    "webextension-polyfill": "^0.6.0"
  }
}

A security.txt => security.txt +23 -0
@@ 0,0 1,23 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Contact: mailto:security@harmless.systems
Encryption: https://www.harmless.systems/pgp.txt
Preferred-Languages: en
Canonical: https://www.harmless.systems/.well-known/security.txt
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEeMmm6tovSoPQaXo1LPLT0YMTN3sFAl4AT5cACgkQLPLT0YMT
N3u+8w//ekTyhm0bK4M4jMm27edj+gyC6XQJwTi7/PV1LsTRrZblRZK/1ZkjUztc
4BdgMMlOHVwYHGDqOQR8p4vSzb7sFYKYBBiA6Mh7sLr2ekZWDj5d68/k5cTRNrGD
8hU6ts8y6q3rgAcSygiYOZglcA64Gy2XW8Rqn8udndrqfB3Llu5SKMzQ9M2Henop
Ih01rTkIsPs8JVEw+JjZW+bn1/5h3pqNv5lpME/X/Y4hbWbHcLl7/u4GqwYnJm4R
QoEKq3iTnrTZYKJyF+57kZq/VXHQ8OIEKG4CMge3uVqSRRZinimvVsq9TCqwCc2E
07+SKkib6Nvn79KYN6Q0+X6FqhKloPKIjEbdM+RUuFnLl/9/xdiwnSZG3FuAQD3S
LSzDoL/V7s1diQoM5b7Daf/Ho+iH60Vm2QECcuAuLg/UCpdaS0MyEEua1jTLVnxq
Z8PomG+mH6vL9tCd8EZ+uuJYKTL3EOLywYMa115kUvoUl4rxtaVOWCIEKudeGWLp
2iYrgERKX0uFIEYwAHDDtXDq2sVsHybxXW7ViiXyiST+na7LYyMA8c4EUQ6YTkZB
hOAY+7222wY9jAmpxbGTS9LHBMrd6ObaRovfR8y62I+UYyyMMOyTcBXeM6wzfIJj
nbGo6Xyxd0xGVCJDYHHbT/c5vLr598B8Vujqi/NoeYE61fNe0gA=
=j+Yx
-----END PGP SIGNATURE-----

A src/_locales/en/messages.json => src/_locales/en/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "Displays the security.txt and humans.txt files for a website if available.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "Preferences",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "Also check for a humans.txt file: ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "Enabled",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "Disabled",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "Reset all preferences to default values",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "No security.txt or humans.txt found.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "No security.txt found",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "Found security.txt",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "Found humans.txt",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "Found security.txt and humans.txt",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "Copy security.txt to clipboard",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "Copied security.txt!",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "Copy humans.txt to clipboard",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "Copied humans.txt!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "Thanks for installing",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "Thank you for installing the security.txt browser extension!",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "What is security.txt?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "security.txt is a proposed standard that provides a means for websites and software authors to define their security policies. This is useful to security researchers or anyone who would like to properly disclose a vulnerability to the owners of the website or software.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "What is humans.txt?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "humans.txt is a less formal initiative for providing human-readable information about the authors of the website.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "How does the browser extension work?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "As you browse the web and navigate to different websites, the browser extension checks the website to see if it supports either type of file. If it does, an ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " icon is shown in the URL bar. You can click this icon to view more details about the text files that were located.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "More information",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "You can find more information about security.txt extension on our blog post and initial release announcement.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "We appreciate your feedback",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "If you encounter any issues using this extension or would like to contact us with any feedback or suggestions you can reach us by email at: ",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "If you have a Github account, you can also open an issue on this extension's Github page at: ",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update."
  }
}
\ No newline at end of file

A src/_locales/es/messages.json => src/_locales/es/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "Muestra los archivos security.txt y humans.txt de un sitio web, si están disponibles.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "Preferencias",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "Tambien comprueba la existencia de un archivo humans.txt: ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "Habilitado",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "Deshabilitado",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "Restablece todas las preferencias a los valores predeterminados",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "security.txt o humans.txt. no han sido encontrados.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "security.txt no ha sido encontrado",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "security.txt ha sido encontrado",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "humans.txt ha sido encontrado",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "security.txt y humans.txt han sido encontrados",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "Copia security.txt al portapapeles",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "security.txt copiado!",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "Copia human.txt al portapapeles",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "humans.txt copiado!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "Gracias por instalar",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "Gracias por instalar la extensión del navegador web security.txt!",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "¿Qué es security.txt?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "security.txt es un estándar propuesto que proporciona un medio para que los sitios web y los autores de software definan sus pólizas de seguridad. Esto es útil para los investigadores de seguridad o cualquier persona que desee divulgar adecuadamente una vulnerabilidad de seguridad a los propietarios del sitio web o software.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "¿Qué es humans.txt?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "humans.txt es una iniciativa menos formal para proporcionar información legible por humanos sobre los autores del sitio web.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "¿Cómo funciona la extensión del navegador web?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "A medida que navega por la web y navega a diferentes sitios web, la extensión del navegador verifica el sitio web para ver si soporta cualquiera de los dos tipos de archivo. Si lo soporta, un  ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " icono se muestra en la barra de URL. Puede hacer clic en este icono para ver más detalles sobre los archivos de texto que se ubicaron.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "Mas informacion",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "Puede encontrar más información sobre la extensión security.txt en nuestra publicación de blog y anuncio de lanzamiento inicial.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "Agradecemos sus comentarios y sugerencias",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "Si encuentra algún problema al usar esta extensión o desea contactarnos con cualquier comentario o sugerencia, puede comunicarse con nosotros por correo electrónico a: ",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "Si tiene una cuenta de Github, también puede abrir un asunto en la página de Github de esta extensión en: ",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Notas de Lanzamiento",
    "description" : "Page title for release notes page shown on extension update."
  }
}
\ No newline at end of file

A src/_locales/fil/messages.json => src/_locales/fil/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "Ipinapakita ang security.txt at humans.txt file para sa website kung mayroon.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "Kagustuhan",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "Tinitingnan din ang humans.txt file: ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "Pinapagana",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "Hindi Pinapagana",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "Ibalik lahat ng kagustuhan sa default na halaga",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "Walang security.txt o humans.txt na nahanap.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "Walang security.txt na nahanap",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "Nahanap ang security.txt",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "Nahanap ang humans.txt",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "Nahanap ang security.txt at humans.txt",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "Kopyahin ang security.txt sa clipboard",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "Nakopya ang security.txt!",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "Kopyahin ang humans.txt sa clipboard",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "Kinopya ang humans.txt!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "Salamat sa pag-iinstall",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "Salamat sa pag-iinstall ng browser extension ng security.txt!",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "Ano ang security.txt?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "Ang security.txt ay iminungkahing pamantayan na nagbibigay ng paraan sa mga website at may-akda ng software na tukuyin ang kanilang mga patakaran sa seguridad. Ito ay kapaki-pakinabang sa mga mananaliksik ng seguridad o sinumang nais na maayos na ibunyag ang kahinaan sa mga may-ari ng website o software.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "Ano ang humans.txt?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "Ang humans.txt ay isang hindi gaanong pormal na inisyatibo para sa pagbibigay ng nababasang impormasyon ng tao tungkol sa mga may-akda ng website.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "Paano gumagana ang extension ng browser?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "Habang nagba-browse ka sa web, at nagna-navigate sa iba't ibang website, sinusuri ng extension ng browser ang website upang makita kung sinusuportahan nito ang alinman sa uri ng file. Kung sinusuportahan ito, may ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " ipinapakita ang icon sa URL bar. Maaari mong pindutin ang icon na ito upang matingnan ang iba pang detalye tungkol sa mga makikitang text file.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "Iba pang impormasyon",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "Maaari mong mahanap ang iba pang impormasyon tungkol sa extension na security.txt sa aming blog post at paunang pahayag.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "Pinahahalagahan namin ang iyong puna",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "Kung nakatagpo ka ng anumang isyu gamit ang extension na ito o nais mong makipag-ugnayan sa amin sa anumang puna o mungkahi, maaari kang makipag-ugnayan sa amin sa pamamagitan ng email sa: ",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "Kung mayroon kang account sa Github, maaari ka ring magbukas ng isyu sa pahina sa Github ng extension na ito: ",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update."
  }
}

A src/_locales/fr/messages.json => src/_locales/fr/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "Affiche si possible les fichiers security.txt et humans.txt pour un site web.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "Préférences",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "Vérifier également la présence d'un fichier humans.txt : ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "Activé",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "Désactivé",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "Réinitialiser toutes les préférences aux valeurs par défaut",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "Pas de fichier security.txt ou human.txt trouvé.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "Pas de fichier security.txt trouvé.",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "security.txt trouvé",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "human.txt trouvé",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "security.txt et human.txt trouvés",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "Copier security.txt dans le presse-papiers",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "security.txt copié !",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "Copier humans.txt dans le presse-papiers.",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "human.txt copié !",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "Merci pour l'installation",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "Merci d'avoir installé l'extension de navigateur security.txt !",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "Qu'est-ce que security.txt ?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "security.txt est un standard proposé qui fournit un moyen pour les sites web et les développeurs de logiciels de définir leurs politiques de sécurité. Il est utile aux spécialistes de la sécurité ou à toute personne qui souhaite signaler correctement les failles de sécurité.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "Qu'est-ce que humans.txt ?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "humans.txt est une initiative moins formelle visant à fournir des informations sur les auteurs du site compréhensibles pour les utilisateurs.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "Comment fonctionne l'extension de navigateur ?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "Lorsque vous naviguez sur le web, et que vous vous rendez sur différents sites, l'extension de navigateur vérifie le site web pour voir s'il prend en charge l'un ou l'autre des deux types de fichiers. Si c'est le cas, une ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " icône apparaît dans la barre d'URL. Vous pouvez cliquer sur cette icône pour afficher plus de détails sur les fichiers texte qui ont été localisés.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "Plus d'informations",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "Vous pouvez trouver plus d'informations sur l'extension security.txt sur notre blog et dans le communiqué de la première version.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "Nous apprécions vos commentaires",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "Si vous rencontrez des problèmes en utilisant cette extension ou si vous souhaitez nous faire part de vos commentaires ou suggestions, vous pouvez nous contacter par mail à :",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "Si vous avez un compte Github, vous pouvez également faire part de ce problème sur la page Github de cette extension à l'adresse :",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update."
  }
}
\ No newline at end of file

A src/_locales/ko/messages.json => src/_locales/ko/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "웹사이트에 security.txt 와 humans.txt. 가 있다면 표시합니다.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "환경설정",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "human.txt 파일도 있는지 확인: ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "활성화됨",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "비활성화됨",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "모든 환경설정을 기본값으로 리셋",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "security.txt 나 humans.txt 가 발견되지 않았습니다.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "security.txt 가 발견되지 않았습니다",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "security.txt 를 찾았습니다",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "humans.txt 를 찾았습니다",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "security.txt 와 humans.txt 를 찾았습니다",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "security.txt 를 클립보드로 복사",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "security.txt 를 복사하였습니다!",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "humans.txt 를 클립보드로 복사",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "humans.txt 를 복사하였습니다!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "감사합니다",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "security.txt 브라우저 익스텐션을 설치해주셔서 감사드립니다!",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "security.txt 란 무엇인가요?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "security.txt는 웹사이트 및 소프트웨어 작성자가 보안 정책을 정의하는 수단을 제공할 수 있도록 제안된 표준입니다. 이것은 보안연구원이나 취약점을 정확히 공개하고자 하는 사람에게 유용합니다.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "humans.txt 란 무엇인가요?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "humans.txt는 웹사이트 작성자에 대한 사람이 읽을 수 있는 정보를 제공하는 덜 공식적인 수단입니다.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "이 브라우저 익스텐션은 어떻게 작동하나요?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "이 브라우저 익스텐션은 사용자가 웹사이트를 방문하면 그 사이트가 security.txt 나 humans.txt 의 지원여부를 확인합니다. 만약 지원한다면 아이콘 ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " 이 URL바에 표시되며 그것을 클릭하면 더 자세한 정보를 얻을 수 있습니다.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "더 알아보기n",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "저희 블로그 게시물 및 초기 릴리스 공지에서 security.txt 익스텐션에 대한 더 자세한 정보를 찾을 수 있습니다.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "여러분의 피드백은 많은 도움이 됩니다",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "이 확장 프로그램을 사용하면서 문제가 발생하거나 의견이나 제안 사항이 있는 경우 저희에게 연락하시려면 다음 주소로 이메일을 보내십시오. ",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "만약 Github 를 사용하신다면 아래의 링크에서도 문제제기나 의견 교환을 하실 수 있습니다. ",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update."
  }
}
\ No newline at end of file

A src/_locales/tl/messages.json => src/_locales/tl/messages.json +122 -0
@@ 0,0 1,122 @@
{
  "extension_description": {
    "message": "Ipinapakita ang security.txt at humans.txt file para sa website kung mayroon.",
    "description" : "Description of the browser extension describing how it functions. (A-1)"
  },
  "options_title": {
    "message": "Kagustuhan",
    "description" : "Title text of options/preferences page. (A-2)"
  },
  "check_humanstxt": {
    "message": "Tinitingnan din ang humans.txt file: ",
    "description" : "Label text for an option which enables checking for humans.txt files. (A-3)"
  },
  "check_humanstxt_ON": {
    "message": "Pinapagana",
    "description" : "Text shown when checking for a humans.txt file is enabled. (A-4)"
  },
  "check_humanstxt_OFF": {
    "message": "Hindi Pinapagana",
    "description" : "Text shown when checking for a humans.txt file is disabled. (A-5)"
  },
  "reset_default": {
    "message": "Ibalik lahat ng kagustuhan sa default na halaga",
    "description" : "Text for a button which resets all options/preferences to default values. (A-6)"
  },
  "found_nothing": {
    "message": "Walang security.txt o humans.txt na nahanap.",
    "description" : "Text shown when neither a humans.txt or security.txt file is found. (B-1)"
  },
  "not_found_security_txt": {
    "message": "Walang security.txt na nahanap",
    "description" : "Text shown when a security.txt file is not found. (B-2)"
  },
  "found_security_txt": {
    "message": "Nahanap ang security.txt",
    "description" : "Text shown when a security.txt file has been found. (B-3)"
  },
   "found_humans_txt": {
    "message": "Nahanap ang humans.txt",
    "description" : "Text shown when a humans.txt file has been found. (B-4)"
  },
  "found_security_and_humans_txt": {
    "message": "Nahanap ang security.txt at humans.txt",
    "description" : "Text shown when both a humans.txt and a security.txt file has been found. (B-5)"
  },
  "copy_security_clipboard": {
    "message": "Kopyahin ang security.txt sa clipboard",
    "description" : "Text for button to copy security.txt text to clipboard. (C-1)"
  },
  "copied_security_to_clipboard": {
    "message": "Nakopya ang security.txt!",
    "description" : "Message shown when security.txt text has been copied to the clipboard. (C-2)"
  },
  "copy_humans_clipboard": {
    "message": "Kopyahin ang humans.txt sa clipboard",
    "description" : "Text for button to copy humans.txt text to clipboard. (C-3)"
  },
  "copied_humans_to_clipboard": {
    "message": "Kinopya ang humans.txt!",
    "description" : "Message shown when humans.txt text has been copied to the clipboard. (C-4)"
  },
  "install_title": {
    "message": "Salamat sa pag-iinstall",
    "description" : "Headline shown on web page after installation of extension. (D-1)"
  },
  "install_subtitle": {
    "message": "Salamat sa pag-iinstall ng browser extension ng security.txt!",
    "description" : "Subtitle shown below install title. (D-2)"
  },
  "what_is_security_txt": {
    "message": "Ano ang security.txt?",
    "description" : "Headline for description of the security.txt initiative. (D-3)"
  },
  "what_is_security_txt_content": {
    "message": "Ang security.txt ay iminungkahing pamantayan na nagbibigay ng paraan sa mga website at may-akda ng software na tukuyin ang kanilang mga patakaran sa seguridad. Ito ay kapaki-pakinabang sa mga mananaliksik ng seguridad o sinumang nais na maayos na ibunyag ang kahinaan sa mga may-ari ng website o software.",
    "description" : "Description of the security.txt initiative. (D-4)"
  },
  "what_is_humans_txt": {
    "message": "Ano ang humans.txt?",
    "description" : "Headline for description of the humans.txt initiative. (D-5)"
  },
  "what_is_humans_txt_content": {
    "message": "Ang humans.txt ay isang hindi gaanong pormal na inisyatibo para sa pagbibigay ng nababasang impormasyon ng tao tungkol sa mga may-akda ng website.",
    "description" : "Description of the humans.txt initiative. (D-6)"
  },
  "how_does_it_work": {
    "message": "Paano gumagana ang extension ng browser?",
    "description" : "Headline for description of the browser extension works. (D-7)"
  },
  "how_does_it_work_content_pre": {
    "message": "Habang nagba-browse ka sa web, at nagna-navigate sa iba't ibang website, sinusuri ng extension ng browser ang website upang makita kung sinusuportahan nito ang alinman sa uri ng file. Kung sinusuportahan ito, may ",
    "description" : "Content explaining how the browser extension works (before the inline icon). (D-8)"
  },
  "how_does_it_work_content_post": {
    "message": " ipinapakita ang icon sa URL bar. Maaari mong pindutin ang icon na ito upang matingnan ang iba pang detalye tungkol sa mga makikitang text file.",
    "description" : "Content explaining how the browser extension works (after the inline icon) (D-9)."
  },
  "more_info": {
    "message": "Iba pang impormasyon",
    "description" : "Headline for description of where the user can find more information about the browser extension. (D-10)"
  },
  "more_info_content": {
    "message": "Maaari mong mahanap ang iba pang impormasyon tungkol sa extension na security.txt sa aming blog post at paunang pahayag.",
    "description" : "Details and a link to more information. (D-11)"
  },
  "feedback_appreciated": {
    "message": "Pinahahalagahan namin ang iyong puna",
    "description" : "Headline for section describing where the user can submit their feedback or any issues. (D-12)"
  },
  "feedback_pre_email": {
    "message": "Kung nakatagpo ka ng anumang isyu gamit ang extension na ito o nais mong makipag-ugnayan sa amin sa anumang puna o mungkahi, maaari kang makipag-ugnayan sa amin sa pamamagitan ng email sa: ",
    "description" : "Text show before the email address link where feedback can be submitted. (D-13)"
  },
  "feedback_pre_github": {
    "message": "Kung mayroon kang account sa Github, maaari ka ring magbukas ng isyu sa pahina sa Github ng extension na ito: ",
    "description" : "Text show before the Github page link where feedback can be submitted. (D-14)"
  },
  "release_title": {
    "message": "Release Notes",
    "description" : "Page title for release notes page shown on extension update."
  }
}

A src/css/awsm.css => src/css/awsm.css +683 -0
@@ 0,0 1,683 @@
@charset "UTF-8";
/*!
 * awsm.css v3.0.4 (https://igoradamenko.github.io/awsm.css/)
 * Copyright 2015 Igor Adamenko <mail@igoradamenko.com> (https://igoradamenko.com)
 * Licensed under MIT (https://github.com/igoradamenko/awsm.css/blob/master/LICENSE.md)
 */
html{
  font-family:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "PT Sans", "Open Sans", "Fira Sans", "Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size:100%;
  line-height:1.4;
  background:white;
  color:black;
  -webkit-overflow-scrolling:touch;
}

body{
  margin:1.2em;
  font-size:1rem;
}
@media (min-width: 20rem){
  body{
    font-size:calc(1rem + 0.00625 * (100vw - 20rem));
  }
}
@media (min-width: 40rem){
  body{
    font-size:1.125rem;
  }
}
body header,
body main,
body footer,
body article{
  position:relative;
  max-width:40rem;
  margin:0 auto;
}
body > header{
  margin-bottom:3.5em;
}
body > header h1{
  margin:0;
  font-size:1.5em;
}
body > header p{
  margin:0;
  font-size:0.85em;
}
body > footer{
  margin-top:6em;
  padding-bottom:1.5em;
  text-align:center;
  font-size:0.8rem;
  color:#aaaaaa;
}

nav{
  margin:1em 0;
}
nav ul{
  list-style:none;
  margin:0;
  padding:0;
}
nav li{
  display:inline-block;
  margin-right:1em;
  margin-bottom:0.25em;
}
nav a:visited{
  color:#0064c1;
}
nav a:hover{
  color:#f00000;
}

ul, ol{
  margin-top:0;
  padding-top:0;
  padding-left:2.5em;
}
ul li + li, ol li + li{
  margin-top:0.25em;
}
ul li > details, ol li > details{
  margin:0;
}

p{
  margin:1em 0;
  -webkit-hyphens:auto;
      -ms-hyphens:auto;
          hyphens:auto;
}
p:first-child{
  margin-top:0;
}
p:last-child{
  margin-bottom:0;
}
p + ul, p + ol{
  margin-top:-0.75em;
}
p img, p picture{
  float:right;
  margin-bottom:0.5em;
  margin-left:0.5em;
}
p picture img{
  float:none;
  margin:0;
}

dd{
  margin-bottom:1em;
  margin-left:0;
  padding-left:2.5em;
}

dt{
  font-weight:700;
}

blockquote{
  margin:0;
  padding-left:2.5em;
}

aside{
  margin:0.5em 0;
  font-style:italic;
  color:#aaaaaa;
}
@media (min-width: 65rem){
  aside{
    position:absolute;
    right:-12.5rem;
    width:9.375rem;
    max-width:9.375rem;
    margin:0;
    padding-left:0.5em;
    font-size:0.8em;
    border-left:1px solid #f2f2f2;
  }
}
aside:first-child{
  margin-top:0;
}
aside:last-child{
  margin-bottom:0;
}

section + section{
  margin-top:2em;
}

h1, h2, h3, h4, h5, h6{
  margin:1.25em 0 0;
  line-height:1.2;
}
h1:hover > a[href^="#"][id]:empty, h1:focus > a[href^="#"][id]:empty, h2:hover > a[href^="#"][id]:empty, h2:focus > a[href^="#"][id]:empty, h3:hover > a[href^="#"][id]:empty, h3:focus > a[href^="#"][id]:empty, h4:hover > a[href^="#"][id]:empty, h4:focus > a[href^="#"][id]:empty, h5:hover > a[href^="#"][id]:empty, h5:focus > a[href^="#"][id]:empty, h6:hover > a[href^="#"][id]:empty, h6:focus > a[href^="#"][id]:empty{
  opacity:1;
}
h1 + p, h1 + details, h2 + p, h2 + details, h3 + p, h3 + details, h4 + p, h4 + details, h5 + p, h5 + details, h6 + p, h6 + details{
  margin-top:0.5em;
}
h1 > a[href^="#"][id]:empty, h2 > a[href^="#"][id]:empty, h3 > a[href^="#"][id]:empty, h4 > a[href^="#"][id]:empty, h5 > a[href^="#"][id]:empty, h6 > a[href^="#"][id]:empty{
  position:absolute;
  left:-0.65em;
  opacity:0;
  text-decoration:none;
  font-weight:400;
  line-height:1;
  color:#aaaaaa;
}
@media (min-width: 40rem){
  h1 > a[href^="#"][id]:empty, h2 > a[href^="#"][id]:empty, h3 > a[href^="#"][id]:empty, h4 > a[href^="#"][id]:empty, h5 > a[href^="#"][id]:empty, h6 > a[href^="#"][id]:empty{
    left:-0.8em;
  }
}
h1 > a[href^="#"][id]:empty:target, h1 > a[href^="#"][id]:empty:hover, h1 > a[href^="#"][id]:empty:focus, h2 > a[href^="#"][id]:empty:target, h2 > a[href^="#"][id]:empty:hover, h2 > a[href^="#"][id]:empty:focus, h3 > a[href^="#"][id]:empty:target, h3 > a[href^="#"][id]:empty:hover, h3 > a[href^="#"][id]:empty:focus, h4 > a[href^="#"][id]:empty:target, h4 > a[href^="#"][id]:empty:hover, h4 > a[href^="#"][id]:empty:focus, h5 > a[href^="#"][id]:empty:target, h5 > a[href^="#"][id]:empty:hover, h5 > a[href^="#"][id]:empty:focus, h6 > a[href^="#"][id]:empty:target, h6 > a[href^="#"][id]:empty:hover, h6 > a[href^="#"][id]:empty:focus{
  opacity:1;
  box-shadow:none;
  color:black;
}
h1 > a[href^="#"][id]:empty:target:focus, h2 > a[href^="#"][id]:empty:target:focus, h3 > a[href^="#"][id]:empty:target:focus, h4 > a[href^="#"][id]:empty:target:focus, h5 > a[href^="#"][id]:empty:target:focus, h6 > a[href^="#"][id]:empty:target:focus{
  outline:none;
}
h1 > a[href^="#"][id]:empty::before, h2 > a[href^="#"][id]:empty::before, h3 > a[href^="#"][id]:empty::before, h4 > a[href^="#"][id]:empty::before, h5 > a[href^="#"][id]:empty::before, h6 > a[href^="#"][id]:empty::before{
  content:"§ ";
}

h1{
  font-size:2.5em;
}

h2{
  font-size:1.75em;
}

h3{
  font-size:1.25em;
}

h4{
  font-size:1.15em;
}

h5{
  font-size:1em;
}

h6{
  margin-top:1em;
  font-size:1em;
  color:#aaaaaa;
}

article + article{
  margin-top:4em;
}
article header p{
  font-size:0.6em;
  color:#aaaaaa;
}
article header p + h1, article header p + h2{
  margin-top:-0.25em;
}
article header h1 + p, article header h2 + p{
  margin-top:0.25em;
}
article header h1 a, article header h2 a{
  color:black;
}
article header h1 a:visited, article header h2 a:visited{
  color:#aaaaaa;
}
article header h1 a:visited:hover, article header h2 a:visited:hover{
  color:#f00000;
}
article > footer{
  margin-top:1.5em;
  font-size:0.85em;
}

a{
  color:#0064c1;
}
a:visited{
  color:#8d39d0;
}
a:hover, a:active{
  outline-width:0;
}
a:hover{
  color:#f00000;
}
a abbr{
  font-size:1em;
}

abbr{
  margin-right:-0.075em;
  text-decoration:none;
  -webkit-hyphens:none;
      -ms-hyphens:none;
          hyphens:none;
  letter-spacing:0.075em;
  font-size:0.9em;
}

img, picture{
  display:block;
  max-width:100%;
  margin:0 auto;
}

audio, video{
  width:100%;
  max-width:100%;
}

figure{
  margin:1em 0 0.5em;
  padding:0;
}
figure + p{
  margin-top:0.5em;
}
figure figcaption{
  opacity:0.65;
  font-size:0.85em;
}

table{
  display:inline-block;
  border-spacing:0;
  border-collapse:collapse;
  overflow-x:auto;
  max-width:100%;
  text-align:left;
  vertical-align:top;
  background:linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 0 0, linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 100% 0;
  background-attachment:scroll, scroll;
  background-size:1px 100%, 1px 100%;
  background-repeat:no-repeat, no-repeat;
}
table caption{
  font-size:0.9em;
  background:white;
}
table td, table th{
  padding:0.35em 0.75em;
  vertical-align:top;
  font-size:0.9em;
  border:1px solid #f2f2f2;
  border-top:0;
  border-left:0;
}
table td:first-child, table th:first-child{
  padding-left:0;
  background-image:linear-gradient(to right, white 50%, rgba(255, 255, 255, 0) 100%);
  background-size:2px 100%;
  background-repeat:no-repeat;
}
table td:last-child, table th:last-child{
  padding-right:0;
  border-right:0;
  background-image:linear-gradient(to left, white 50%, rgba(255, 255, 255, 0) 100%);
  background-position:100% 0;
  background-size:2px 100%;
  background-repeat:no-repeat;
}
table td:only-child, table th:only-child{
  background-image:linear-gradient(to right, white 50%, rgba(255, 255, 255, 0) 100%), linear-gradient(to left, white 50%, rgba(255, 255, 255, 0) 100%);
  background-position:0 0, 100% 0;
  background-size:2px 100%, 2px 100%;
  background-repeat:no-repeat, no-repeat;
}
table th{
  line-height:1.2;
}

form{
  margin-right:auto;
  margin-left:auto;
}
@media (min-width: 40rem){
  form{
    max-width:80%;
  }
}
form select, form label{
  display:block;
}
form label:not(:first-child){
  margin-top:1em;
}
form p label{
  display:inline;
}
form p label + label{
  margin-left:1em;
}
form legend:first-child + label{
  margin-top:0;
}
form select, form input[type], form textarea{
  margin-bottom:1em;
}
form input[type=checkbox], form input[type=radio]{
  margin-bottom:0;
}

fieldset{
  margin:0;
  padding:0.5em 1em;
  border:1px solid #aaaaaa;
}

legend{
  color:#aaaaaa;
}

button{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
}
button:focus{
  border:1px solid black;
}
button:hover{
  border:1px solid black;
}
button:active{
  background-color:#aaaaaa;
}

select{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  padding-right:1.2em;
  background-position:top 55% right 0.35em;
  background-size:0.5em;
  background-repeat:no-repeat;
  -webkit-appearance:button;
     -moz-appearance:button;
          appearance:button;
}
select:focus{
  border:1px solid black;
}
select:hover{
  border:1px solid black;
}
select:active{
  background-color:#aaaaaa;
}

input[type=text], input[type=password], input[type^=date], input[type=email], input[type=number], input[type=search], input[type=tel], input[type=time], input[type=month], input[type=week], input[type=url]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
}
input[type=text]:focus, input[type=password]:focus, input[type^=date]:focus, input[type=email]:focus, input[type=number]:focus, input[type=search]:focus, input[type=tel]:focus, input[type=time]:focus, input[type=month]:focus, input[type=week]:focus, input[type=url]:focus{
  border:1px solid black;
}
input[type=text]::-moz-placeholder, input[type=password]::-moz-placeholder, input[type^=date]::-moz-placeholder, input[type=email]::-moz-placeholder, input[type=number]::-moz-placeholder, input[type=search]::-moz-placeholder, input[type=tel]::-moz-placeholder, input[type=time]::-moz-placeholder, input[type=month]::-moz-placeholder, input[type=week]::-moz-placeholder, input[type=url]::-moz-placeholder{
  color:#aaaaaa;
}
input[type=text]::-webkit-input-placeholder, input[type=password]::-webkit-input-placeholder, input[type^=date]::-webkit-input-placeholder, input[type=email]::-webkit-input-placeholder, input[type=number]::-webkit-input-placeholder, input[type=search]::-webkit-input-placeholder, input[type=tel]::-webkit-input-placeholder, input[type=time]::-webkit-input-placeholder, input[type=month]::-webkit-input-placeholder, input[type=week]::-webkit-input-placeholder, input[type=url]::-webkit-input-placeholder{
  color:#aaaaaa;
}
input[type=text]:-ms-input-placeholder, input[type=password]:-ms-input-placeholder, input[type^=date]:-ms-input-placeholder, input[type=email]:-ms-input-placeholder, input[type=number]:-ms-input-placeholder, input[type=search]:-ms-input-placeholder, input[type=tel]:-ms-input-placeholder, input[type=time]:-ms-input-placeholder, input[type=month]:-ms-input-placeholder, input[type=week]:-ms-input-placeholder, input[type=url]:-ms-input-placeholder{
  color:#aaaaaa;
}
input[type=submit], input[type=button], input[type=reset]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
}
input[type=submit]:focus, input[type=button]:focus, input[type=reset]:focus{
  border:1px solid black;
}
input[type=submit]:hover, input[type=button]:hover, input[type=reset]:hover{
  border:1px solid black;
}
input[type=submit]:active, input[type=button]:active, input[type=reset]:active{
  background-color:#aaaaaa;
}
input[type=color]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
  width:6em;
}
input[type=color]:focus{
  border:1px solid black;
}
input[type=color]::-moz-placeholder{
  color:#aaaaaa;
}
input[type=color]::-webkit-input-placeholder{
  color:#aaaaaa;
}
input[type=color]:-ms-input-placeholder{
  color:#aaaaaa;
}
input[type=color]:hover{
  border:1px solid black;
}
input[type=file]{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:inline-block;
  width:auto;
  background:#f2f2f2;
  color:black;
  cursor:pointer;
  display:block;
  width:100%;
  height:auto;
  padding:0.75em 0.5em;
  font-size:12px;
  line-height:1;
}
input[type=file]:focus{
  border:1px solid black;
}
input[type=file]:hover{
  border:1px solid black;
}
input[type=file]:active{
  background-color:#aaaaaa;
}
input[type=checkbox], input[type=radio]{
  margin:-0.2em 0.75em 0 0;
  vertical-align:middle;
}

textarea{
  outline:none;
  box-sizing:border-box;
  height:2em;
  margin:0;
  padding:calc(.25em - 1px) 0.5em;
  font-family:inherit;
  font-size:1em;
  border:1px solid #aaaaaa;
  border-radius:2px;
  background:white;
  color:black;
  display:block;
  width:100%;
  line-height:calc(2em - 1px * 2 - (.25em - 1px) * 2);
  -webkit-appearance:none;
     -moz-appearance:none;
          appearance:none;
  height:4.5em;
  resize:vertical;
  padding-top:0.5em;
  padding-bottom:0.5em;
}
textarea:focus{
  border:1px solid black;
}
textarea::-moz-placeholder{
  color:#aaaaaa;
}
textarea::-webkit-input-placeholder{
  color:#aaaaaa;
}
textarea:-ms-input-placeholder{
  color:#aaaaaa;
}

output{
  display:block;
}

code, kbd, var, samp{
  font-family:Consolas, "Lucida Console", Monaco, monospace;
  font-style:normal;
}

pre{
  overflow-x:auto;
  font-size:0.8em;
  background:linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 0 0, linear-gradient(rgba(0, 0, 0, 0.15) 0%, rgba(0, 0, 0, 0.15) 100%) 100% 0;
  background-attachment:scroll, scroll;
  background-size:1px 100%, 1px 100%;
  background-repeat:no-repeat, no-repeat;
}
pre > code{
  display:inline-block;
  overflow-x:visible;
  box-sizing:border-box;
  min-width:100%;
  border-right:3px solid white;
  border-left:1px solid white;
}

hr{
  height:1px;
  margin:2em 0;
  border:0;
  background:#f2f2f2;
}

details{
  margin:1em 0;
}
details[open]{
  padding-bottom:0.5em;
  border-bottom:1px solid #f2f2f2;
}

summary{
  display:inline-block;
  font-weight:700;
  border-bottom:1px dashed;
  cursor:pointer;
}
summary::-webkit-details-marker{
  display:none;
}

noscript{
  color:#d00000;
}

::selection{
  background:rgba(0, 100, 193, 0.25);
}

p > img {
  display: inline;
  vertical-align: bottom;
  float: none;
  margin-bottom: 0;
  margin-left: 0;
}
\ No newline at end of file

A src/css/options.css => src/css/options.css +32 -0
@@ 0,0 1,32 @@
body {
  padding-top: 1em;
  font-size: 15px;
}

form > div {
  padding: 0.25em;
}

select {
  cursor: pointer;
}

button {
  margin-top: 2em;
  cursor: pointer;
}

@media (prefers-color-scheme: dark) {
  body {
    color: white;
    background: #202023;
  }
}

@media (prefers-color-scheme: light) {
  body {
    color: #202023;
    background: white;
  }
}


A src/css/popup.css => src/css/popup.css +94 -0
@@ 0,0 1,94 @@
* {
  margin: 0;
  padding: 0;
}
body {
  overflow: hidden;
  min-width: 650px;
  font-size: 11px;
}
.tabs {
  background: #fff;
  height:100%;
}
.tabs h2 {
  text-align: center;
}
.tabs input {
  display: none;
}
.tabs label {
  box-sizing: border-box;
  display: inline-block;
  padding: 15px 25px;
  color: #ccc;
  margin-bottom: -1px;
  margin-left: -1px;
}
.tabs label:before {
  content:'';
  display:block;
  width:100%;
  height:15px;
  background-color:#fff;
  position:absolute;
  bottom:-11px;
  left:0;
  z-index:10;  
}
.tabs label:hover {
  color: #888;
  cursor: pointer;
}
.tabs input:checked + label {
  position: relative;
  color: #000;
  background: #fff;
  border-left: 1px solid #bbb;
  border-right: 1px solid #bbb;
  border-bottom: 1px solid #fff;
}
.tabs input:checked + label:after {
  display: block;
  content: '';
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}
#securityTxt, #humansTxt{
  display: none;
  border-top: 1px solid #bbb;
  padding:5px;
}
#securityTab:checked ~ #securityTxt,
#humansTab:checked ~ #humansTxt {
  display: block;
}

textarea {
  padding-top: 5px;
  border:none;
  width:100%;
  min-height:300px;
  font-family: monospace;
  margin-top:5px;
  border:none;
}

textarea:focus {
  border:none;
}

button {
  opacity: 0.8;
  position:absolute;
  right:20px;
  top:15px;
  background:rgba(225,225,225,0.8);
  cursor: pointer;
}

button:hover {
  opacity: 1;
  background:rgba(225,225,225,0.9);
  cursor: pointer;
}
\ No newline at end of file

A src/img/19.png => src/img/19.png +0 -0
A src/img/20.png => src/img/20.png +0 -0
A src/img/30.png => src/img/30.png +0 -0
A src/img/35.png => src/img/35.png +0 -0
A src/img/38.png => src/img/38.png +0 -0
A src/img/40.png => src/img/40.png +0 -0
A src/img/48.png => src/img/48.png +0 -0
A src/img/96.png => src/img/96.png +0 -0
A src/img/info.128.png => src/img/info.128.png +0 -0
A src/img/info.16.png => src/img/info.16.png +0 -0
A src/img/info.19.png => src/img/info.19.png +0 -0
A src/img/info.24.png => src/img/info.24.png +0 -0
A src/img/info.32.png => src/img/info.32.png +0 -0
A src/img/info.48.png => src/img/info.48.png +0 -0
A src/img/info.96.png => src/img/info.96.png +0 -0
A src/img/info.inactive.16.png => src/img/info.inactive.16.png +0 -0
A src/img/info.inactive.19.png => src/img/info.inactive.19.png +0 -0
A src/img/info.inactive.24.png => src/img/info.inactive.24.png +0 -0
A src/img/info.inactive.32.png => src/img/info.inactive.32.png +0 -0
A src/img/info.inactive.48.png => src/img/info.inactive.48.png +0 -0
A src/img/info.inactive.96.png => src/img/info.inactive.96.png +0 -0
A src/img/info.svg => src/img/info.svg +23 -0
@@ 0,0 1,23 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48">
<defs>
<radialGradient id="b" gradientUnits="userSpaceOnUse" cy="28.46" cx="26.54" gradientTransform="matrix(1.156 .005968 -.005968 1.261 -4.845 -7.341)" r="22.38">
<stop stop-color="#9cbcde" offset="0"/>
<stop stop-color="#204a87" offset="1"/>
</radialGradient>
<radialGradient id="a" gradientUnits="userSpaceOnUse" cy="17.68" cx="-9.5" gradientTransform="matrix(4.446 0 0 6.866 67.3-104.4)" r="8.75">
<stop stop-color="#fff" offset="0"/>
<stop stop-color="#b8b8b8" offset="1"/>
</radialGradient>
<radialGradient id="c" gradientUnits="userSpaceOnUse" cy="42" cx="31.55" gradientTransform="matrix(1 0 0 .3333 -7.55 28)" r="18">
<stop offset="0"/>
<stop stop-opacity="0" offset="1"/>
</radialGradient>
</defs>
<ellipse opacity="0.63" rx="18" ry="6" cy="42" cx="24" fill="url(#c)"/>
<circle cy="24" cx="24" r="21.5" fill="#204a87"/>
<g stroke-linejoin="round" stroke="#fff">
<circle stroke-opacity=".94" r="18.6" cy="24" cx="24" stroke-width="2.5" fill="url(#b)"/>
<path stroke-width=".8" d="m21.5 19.4h5v15.9h-5v-15.9zm0-6.6h5v4.2h-5v-4.2z" stroke-opacity=".78" fill="url(#a)"/>
</g>
</svg>
\ No newline at end of file

A src/install.html => src/install.html +49 -0
@@ 0,0 1,49 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="install_title"></title>
    <link rel="stylesheet" href="css/awsm.css"/>
  </head>
  <body>
    <header>
      <h1 data-i18n="install_title"></h1>
      <p data-i18n="install_subtitle"></p>
    </header>
    <main>
      <article>
        <section>
          <h3 data-i18n="what_is_security_txt"></h3>
          <p data-i18n="what_is_security_txt_content"></p>
          <h3 data-i18n="what_is_humans_txt"></h3>
          <p data-i18n="what_is_humans_txt_content"></p>
          <h3 data-i18n="how_does_it_work"></h3>
          <p>
            <span data-i18n="how_does_it_work_content_pre"></span>
            <img src="img/info.24.png" alt="Info icon" title="Info icon"/>
            <span data-i18n="how_does_it_work_content_post"></span>
          </p>
          <h3 data-i18n="more_info"></h3>
          <p>
            <a data-i18n="more_info_content" href="https://www.harmless.systems/blog/2020-01-18-security-txt-browser-extension.html"></a>
          </p>
          <h3 data-i18n="feedback_appreciated"></h3>
          <p>
            <span data-i18n="feedback_pre_email"></span>
            <a href="mailto:info@harmless.systems">info@harmless.systems</a>
          </p>
          <p>
            <span data-i18n="feedback_pre_github"></span>
            <a href="https://github.com/HarmlessSystems/security.txt/issues">HarmlessSystems/security.txt</a>
          </p>
        </section>
      </article>
    </main>
    <footer>
      <p>&copy; <span class="current-year"></span> <a href="https://www.harmless.systems">Harmless Systems</a></p>
    </footer>
    <script src="js/browser-polyfill.js"></script>
    <script src="js/global.js"></script>
    <script src="js/install.js"></script>
  </body>
</html>
\ No newline at end of file

A src/js/background.js => src/js/background.js +188 -0
@@ 0,0 1,188 @@
/* globals i18n, BROWSER_QUIRKS */

const httpRegExp = new RegExp('^http');

function isPlainText(result) {
  if (typeof result.headers.get('Content-Type') === 'string') {
    return result.headers.get('Content-Type').indexOf('text/plain') !== -1;
  }
  return false;
}

function fetchError(error) {
  console.log('fetch() fail:', error);
}

function fetchFiles(tabId, tab) {
  const tabURL = new URL(tab.url);
  const host = `${tabURL.protocol}//${tabURL.host}`;
  const fetchOptions = {method: 'HEAD'};

  const finalResults = {
    security: '',
    humans: ''
  };

  let humansTxtCheck = true;

  fetch(`${host}/.well-known/security.txt`, fetchOptions).then((result) => {

    console.log(`${host}/.well-known/security.txt`, result.status,
      result.headers.get('Content-Type'));

    if (!result.ok || !isPlainText(result)) {

      return fetch(`${host}/security.txt`, fetchOptions).then((result) => {

        console.log(`${host}/security.txt`, result.status,
          result.headers.get('Content-Type'));

        if (result.ok && isPlainText(result)) {
          finalResults.security = `${host}/security.txt`;
        }
      }, fetchError);
    }

    finalResults.security =`${host}/.well-known/security.txt`;

  }, fetchError).finally(() => {

    browser.storage.local.get('check_humanstxt').then((result) => {

      if (result && result.hasOwnProperty('check_humanstxt') && 
          result.check_humanstxt === 'OFF') {
        humansTxtCheck = false;
        return console.log('humans.txt check disabled');
      }

      // XXX I've encountered at least one site (netflix.com) where a HEAD 
      // doesn't work on a humans.txt file (403 response). While odd, in all 
      // fairness, the "humans.txt" files is intedned for "humans" who wouldn't
      // be making HEAD requests but rather navigating to the URL manually...
      return fetch(`${host}/humans.txt`/*, fetchOptions*/).then((result) => {

        console.log(`${host}/humans.txt`, result.status,
          result.headers.get('Content-Type'));

        if (result.ok && isPlainText(result)) {
          finalResults.humans = `${host}/humans.txt`;
        }
      }, fetchError);

    }, fetchError).finally(() => {

      let title = i18n((humansTxtCheck) ?
        'found_nothing' : 'not_found_security_txt');

      if (finalResults.security && !finalResults.humans) {
        title = i18n('found_security_txt');
      } else if (!finalResults.security && finalResults.humans) {
        title = i18n('found_humans_txt');
      } else if (finalResults.security && finalResults.humans) {
        title = i18n('found_security_and_humans_txt');
      }

      if (finalResults.security || finalResults.humans) {
        localStorage.setItem(finalResults.host, JSON.stringify(finalResults));
        browser.pageAction.show(tabId);
        browser.pageAction.setPopup({
          tabId: tabId,
          popup: `popup.html?security=${finalResults.security}` +
            `&humans=${finalResults.humans}`
        });

        // XXX Note that we need to change icons for Chrome/Edge bug with 
        // pageAction.hide() interesting enough, the bug doesn't impact Opera
        if (BROWSER_QUIRKS === 'chrome' || BROWSER_QUIRKS === 'edge') {
          browser.pageAction.setIcon({
            tabId: tabId,
            path: {
              '16': 'img/info.16.png',
              '19': 'img/info.19.png',
              '24': 'img/info.24.png',
              '32': 'img/info.32.png',
              '48': 'img/info.48.png',
              '96': 'img/info.96.png'
            }
          });
        }
      } else {
        browser.pageAction.hide(tabId);
        browser.pageAction.setPopup({
          tabId: tabId,
          // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pageAction/setPopup
          // If an empty string ("") is passed here, the popup is disabled, and 
          // the extension will receive pageAction.onClicked events.
          popup: ''
        });

        if (BROWSER_QUIRKS === 'chrome' || BROWSER_QUIRKS === 'edge') {
          browser.pageAction.setIcon({
            tabId: tabId,
            path: {
              '16': 'img/info.inactive.16.png',
              '19': 'img/info.inactive.19.png',
              '24': 'img/info.inactive.24.png',
              '32': 'img/info.inactive.32.png',
              '48': 'img/info.inactive.48.png',
              '96': 'img/info.inactive.96.png'
            }
          });
        }
      }

      browser.pageAction.setTitle({
        tabId,
        title
      });
    });
  });
}

function tabsOnUpdated(tabId, changeInfo, tab) {
  if (changeInfo.url && httpRegExp.test(changeInfo.url)) {
    fetchFiles(tabId, tab);
  }
}

function runtimeOnInstalled(details) {

  // Process each existing tab that's open when the extension is installed
  browser.tabs.query({}).then((tabs) => {
    tabs.forEach((tab) => {
      if (httpRegExp.test(tab.url)) {
        fetchFiles(tab.id, {url: tab.url});
      }
    });
  });

  switch (details.reason) {
    case 'install': 
      browser.tabs.create({
        url: browser.runtime.getURL('install.html')
      });
    break;
    // XXX No updates yet
    // case 'update':
    //   browser.tabs.create({
    //     url: browser.runtime.getURL('release.html')
    //   });
    // break;
    default:
      console.log('browser.runtime.onInstalled', details);
    break;
  }
}

try {
  browser.tabs.onUpdated.addListener(tabsOnUpdated, {
    urls: ['http://*/*', 'https://*/*'],
    properties: ['status']
  });
} catch (e) {
  // Chrome/Opera/Edge doesn't support filters on tabs.onUpdated
  console.log('Handled error:', e);
  browser.tabs.onUpdated.addListener(tabsOnUpdated);
}

browser.runtime.onInstalled.addListener(runtimeOnInstalled);
\ No newline at end of file

A src/js/global.js => src/js/global.js +55 -0
@@ 0,0 1,55 @@
/* jshint unused: false */

const defaultOptions = {
  check_humanstxt: 'ON'
};

function i18n(msg) {
  return browser.i18n.getMessage(msg) || msg;
}

const i18nTag = {
  generic: (element) => {
    let content;
    if (element.dataset.i18n) {
      content = i18n(element.dataset.i18n);
    } else if (element.id) {
      content = i18n(element.id);
    }
    if (content) {
      element.textContent = content;
    }
  },
  LABEL: (element) => {
    if (element.attributes.for) {
      const content = i18n(element.attributes.for.value);
      if (content) {
        element.textContent = content;
      }
    } else {
      i18nTag.generic(element);
    }
  },
  SELECT: (element) => {
    if (!element.id || !element.options.length) {
      return;
    }
    for (let i = 0; i < element.options.length; i++) {
      element.options[i].textContent = i18n(element.id + '_' +
        element.options[i].value);
    }
  }
};

function i18nHydrate() {
  document.querySelectorAll('[data-i18n]').forEach((element) => {
    if (i18nTag[element.tagName]) {
      i18nTag[element.tagName](element);
    } else {
      i18nTag.generic(element);
    }
  });
  document.querySelectorAll('.current-year').forEach((element) => {
    element.innerText = (new Date()).getFullYear();
  });
}
\ No newline at end of file

A src/js/install.js => src/js/install.js +5 -0
@@ 0,0 1,5 @@
/* globals i18nHydrate */

window.addEventListener('DOMContentLoaded', () => {
  i18nHydrate();
});
\ No newline at end of file

A src/js/options.js => src/js/options.js +45 -0
@@ 0,0 1,45 @@
/* globals i18nHydrate, defaultOptions */

function storageLocalSet() {
  console.log('storageLocalSet OK');
}

function storageLocalSetError(error) {
  console.error('storageLocalSetError', error);
}

function storageLocalGetError(error) {
  console.error('storageLocalGetError', error);
}

window.addEventListener('DOMContentLoaded', () => {
  i18nHydrate();

  document.querySelectorAll('select').forEach((element) => {
    browser.storage.local.get(element.id).then((result) => {
      if (result && result.hasOwnProperty(element.id)) {
        element.value = result[element.id];
      }
      element.addEventListener('change', (event) => {
        const pref = {};
        pref[event.target.id] = event.target.value;
        console.log(`Setting '${event.target.id}' to new value of: ` + 
          event.target.value);
        browser.storage.local.set(pref).then(storageLocalSet,
          storageLocalSetError);
      });
    }, storageLocalGetError);
  });

});

document.querySelector('button').addEventListener('click', () => {
  document.querySelectorAll('select').forEach((element) => {
    const pref = {};
    element.value = defaultOptions[element.id];
    pref[element.id] = element.value;
    console.log(`Setting '${element.id}' to default value of: ` + 
      element.value);
    browser.storage.local.set(pref).then(storageLocalSet, storageLocalSetError);
  });
});
\ No newline at end of file

A src/js/popup.js => src/js/popup.js +69 -0
@@ 0,0 1,69 @@
/* globals i18n, i18nHydrate, URLSearchParams */

window.addEventListener('DOMContentLoaded', () => {
  const params = new URLSearchParams(new URL(window.location).search);

  const securityTxt = document.querySelector('#securityTxt > textarea');
  const securityTab = document.querySelector('#securityTabLabel');
  const securityInput = document.querySelector('#securityTab');

  const humansTxt = document.querySelector('#humansTxt > textarea');
  const humansTab = document.querySelector('#humansTabLabel');
  const humansInput = document.querySelector('#humansTab');

  const clipboardSecurity = document.querySelector('#securityTxt button');
  const clipboardHumans = document.querySelector('#humansTxt button');
  const msgTimeout = 3000;


  if (params.get('security')) {
    fetch(params.get('security')).then((result) => {
      result.text().then((text) => {
        securityTxt.value = text;
        securityTab.title = params.get('security');
      });
    });
  } else {
    securityTab.style.display = 'none';
  }

  if (params.get('humans')) {
    fetch(params.get('humans')).then((result) => {
      result.text().then((text) => {
        humansTxt.value = text;
        humansTab.title = params.get('humans');
        if (!params.get('security')) {
          securityInput.checked = false;
          humansInput.checked = true;
        }
      });
    });
  } else {
    humansTab.style.display = 'none';
  }

  i18nHydrate();

  clipboardSecurity.addEventListener('click', () => {
    securityTxt.select();
    document.execCommand('copy');
    clipboardSecurity.innerText = i18n('copied_security_to_clipboard');
    clipboardSecurity.disabled = true;
    setTimeout(() => {
      clipboardSecurity.innerText = i18n('copy_security_clipboard');
      clipboardSecurity.disabled = false;
    }, msgTimeout);
  });

  clipboardHumans.addEventListener('click', () => {
    humansTxt.select();
    document.execCommand('copy');
    clipboardHumans.innerText = i18n('copied_humans_to_clipboard');
    clipboardHumans.disabled = true;
    setTimeout(() => {
      clipboardHumans.innerText = i18n('copy_humans_clipboard');
      clipboardHumans.disabled = false;
    }, msgTimeout);
  });

});
\ No newline at end of file

A src/js/release.js => src/js/release.js +5 -0
@@ 0,0 1,5 @@
/* globals i18nHydrate */

window.addEventListener('DOMContentLoaded', () => {
  i18nHydrate();
});
\ No newline at end of file

A src/manifest.chrome.json => src/manifest.chrome.json +31 -0
@@ 0,0 1,31 @@
{
  "_notes_chrome_style": "https://developer.chrome.com/extensions/manifest",
  "page_action": {
    "default_icon": {
      "16": "img/info.inactive.16.png",
      "19": "img/info.inactive.19.png",
      "24": "img/info.inactive.24.png",
      "32": "img/info.inactive.32.png",
      "48": "img/info.inactive.48.png",
      "96": "img/info.inactive.96.png"
    },
    "chrome_style": true
  },
  
  "_notes_background": "https://github.com/mozilla/webextension-polyfill",
  "background": {
    "scripts": [
      "js/browser-polyfill.js",
      "js/global.js",
      "js/background.js"
    ]
  },
  
  "options_ui": {
    "page": "options.html",
    "chrome_style": true,
    "open_in_tab": false
  },
  
  "offline_enabled": true
}
\ No newline at end of file

A src/manifest.edge.json => src/manifest.edge.json +31 -0
@@ 0,0 1,31 @@
{
  "_notes_chrome_style": "https://developer.chrome.com/extensions/manifest",
  "page_action": {
    "default_icon": {
      "16": "img/info.inactive.16.png",
      "19": "img/info.inactive.19.png",
      "24": "img/info.inactive.24.png",
      "32": "img/info.inactive.32.png",
      "48": "img/info.inactive.48.png",
      "96": "img/info.inactive.96.png"
    },
    "chrome_style": true
  },
  
  "_notes_background": "https://github.com/mozilla/webextension-polyfill",
  "background": {
    "scripts": [
      "js/browser-polyfill.js",
      "js/global.js",
      "js/background.js"
    ]
  },
  
  "options_ui": {
    "page": "options.html",
    "chrome_style": true,
    "open_in_tab": false
  },
  
  "offline_enabled": true
}
\ No newline at end of file

A src/manifest.firefox.json => src/manifest.firefox.json +25 -0
@@ 0,0 1,25 @@

{
  "_notes_incognito": "Split mode not supported on Firefox. https://bugzilla.mozilla.org/show_bug.cgi?id=1380812",
  "incognito": "spanning",

  "_notes_background": "Only persistent pages are supported in Firefox.",
  "background": {
    "scripts": [
      "js/global.js",
      "js/background.js"
    ],
    "persistent": true
  },

  "options_ui": {
    "page": "options.html",
    "browser_style": true
  },

  "_notes_page_action": "https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Browser_styles",
  "page_action": {
    "default_icon": "img/info.svg",
    "browser_style": true
  }
}
\ No newline at end of file

A src/manifest.json => src/manifest.json +31 -0
@@ 0,0 1,31 @@
{

  "_notes_": "keys starting with '_notes_' will be removed by grunt",
  "_notes_package.json": "where keys overlap, they are taken from package.json",
  "_notes_browsers": "browser specific keys and overrides are taken from: manifest.<BROWSER>.json",

  "manifest_version": 2,
  "description": "__MSG_extension_description__",
  "default_locale": "en",
  "incognito": "split",
  "icons": {
    "16": "img/info.16.png",
    "48": "img/info.48.png",
    "96": "img/info.96.png",
    "128": "img/info.128.png"
  },
  "permissions": [
    "http://*/.well-known/security.txt",
    "http://*/security.txt",
    "http://*/humans.txt",
    "https://*/.well-known/security.txt",
    "https://*/security.txt",
    "https://*/humans.txt",
    "tabs",
    "storage"
  ],
  "page_action": {},
  "background": {
    "persistent": false
  }
}
\ No newline at end of file

A src/manifest.opera.json => src/manifest.opera.json +31 -0
@@ 0,0 1,31 @@
{
  "_notes_page_action": "Opera doesn't suffer from the hide/show pageAction bug in Chrome/Edge",
  "page_action": {
    "default_icon": {
      "16": "img/info.16.png",
      "19": "img/info.19.png",
      "24": "img/info.24.png",
      "32": "img/info.32.png",
      "48": "img/info.48.png",
      "96": "img/info.96.png"
    },
    "chrome_style": true
  },
  
  "_notes_background": "https://github.com/mozilla/webextension-polyfill",
  "background": {
    "scripts": [
      "js/browser-polyfill.js",
      "js/global.js",
      "js/background.js"
    ]
  },
  
  "_notes_options_page": "`open_in_tab: false` is broken on Opera. https://forums.opera.com/topic/36311/bug-options-button-in-extensions-page-does-not-work-opera-64",
  "options_ui": {
    "page": "options.html",
    "open_in_tab": true
  },
  
  "offline_enabled": true
}
\ No newline at end of file

A src/options.html => src/options.html +25 -0
@@ 0,0 1,25 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="options_title"></title>
    <link rel="stylesheet" href="css/options.css"/>
  </head>
  <body>
    <form>
      <div>
        <label for="check_humanstxt" data-i18n></label>
        <select id="check_humanstxt" class="browser-style" data-i18n>
          <option value="ON"></option>
          <option value="OFF"></option>
        </select>
      </div>
      <div>
        <button type="button" id="reset_default" data-i18n class="browser-style"></button>
      </div>
    </form>
    <script src="js/browser-polyfill.js"></script>
    <script src="js/global.js"></script>
    <script src="js/options.js"></script>
  </body>
</html>
\ No newline at end of file

A src/popup.html => src/popup.html +26 -0
@@ 0,0 1,26 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="css/popup.css"/>
  </head>
  <body>
    <div class="tabs">
      <input type="radio" id="securityTab" name="tabs" checked>
      <label id="securityTabLabel" for="securityTab">security.txt</label>
      <input type="radio" id="humansTab" name="tabs">
      <label id="humansTabLabel" for="humansTab">humans.txt</label>
      <div id="securityTxt">
        <button type="button" data-i18n="copy_security_clipboard"></button>
        <textarea spellcheck="false"></textarea>
      </div>
      <div id="humansTxt">
        <button type="button" data-i18n="copy_humans_clipboard"></button>
        <textarea spellcheck="false"></textarea>
      </div>
    </div>
    <script src="js/browser-polyfill.js"></script>
    <script src="js/global.js"></script>
    <script src="js/popup.js"></script>
  </body>
</html>
\ No newline at end of file

A src/release.html => src/release.html +26 -0
@@ 0,0 1,26 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title data-i18n="release_title"></title>
    <link rel="stylesheet" href="css/awsm.css"/>
  </head>
  <body>
    <header>
      <h1 data-i18n="release_title"></h1>
    </header>
    <main>
      <article>
        <section>
          <p>...</p>
        </section>
      </article>
    </main>
    <footer>
      <p>&copy; <span class="current-year"></span> <a href="https://www.harmless.systems">Harmless Systems</a></p>
    </footer>
    <script src="js/browser-polyfill.js"></script>
    <script src="js/global.js"></script>
    <script src="js/release.js"></script>
  </body>
</html>
\ No newline at end of file

A yarn.lock => yarn.lock +2381 -0
@@ 0,0 1,2381 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@types/minimatch@^3.0.3":
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
  integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==

abbrev@1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==

ansi-regex@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=

ansi-regex@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
  integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=

ansi-styles@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=

ansi-styles@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
  dependencies:
    color-convert "^1.9.0"

aproba@^1.0.3:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
  integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==

archiver-utils@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
  integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=
  dependencies:
    glob "^7.0.0"
    graceful-fs "^4.1.0"
    lazystream "^1.0.0"
    lodash "^4.8.0"
    normalize-path "^2.0.0"
    readable-stream "^2.0.0"

archiver@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22"
  integrity sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=
  dependencies:
    archiver-utils "^1.3.0"
    async "^2.0.0"
    buffer-crc32 "^0.2.1"
    glob "^7.0.0"
    lodash "^4.8.0"
    readable-stream "^2.0.0"
    tar-stream "^1.5.0"
    walkdir "^0.0.11"
    zip-stream "^1.1.0"

are-we-there-yet@~1.1.2:
  version "1.1.5"
  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
  integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
  dependencies:
    delegates "^1.0.0"
    readable-stream "^2.0.6"

argparse@^1.0.7:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
  dependencies:
    sprintf-js "~1.0.2"

arr-diff@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=

arr-flatten@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==

arr-union@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=

array-differ@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
  integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==

array-each@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
  integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=

array-find-index@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
  integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=

array-slice@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
  integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==

array-union@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==

array-unique@^0.3.2:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=

arrify@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
  integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==

assign-symbols@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=

async@^2.0.0, async@^2.6.1:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
  dependencies:
    lodash "^4.17.14"

async@~1.5.2:
  version "1.5.2"
  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
  integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=

atob@^2.1.2:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==

balanced-match@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=

base64-js@^1.0.2:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==

base@^0.11.1:
  version "0.11.2"
  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
  dependencies:
    cache-base "^1.0.1"
    class-utils "^0.3.5"
    component-emitter "^1.2.1"
    define-property "^1.0.0"
    isobject "^3.0.1"
    mixin-deep "^1.2.0"
    pascalcase "^0.1.1"

bl@^1.0.0:
  version "1.2.2"
  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
  integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
  dependencies:
    readable-stream "^2.3.5"
    safe-buffer "^5.1.1"

bl@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88"
  integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==
  dependencies:
    readable-stream "^3.0.1"

brace-expansion@^1.1.7:
  version "1.1.11"
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
  dependencies:
    balanced-match "^1.0.0"
    concat-map "0.0.1"

braces@^2.3.1:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
  dependencies:
    arr-flatten "^1.1.0"
    array-unique "^0.3.2"
    extend-shallow "^2.0.1"
    fill-range "^4.0.0"
    isobject "^3.0.1"
    repeat-element "^1.1.2"
    snapdragon "^0.8.1"
    snapdragon-node "^2.0.1"
    split-string "^3.0.2"
    to-regex "^3.0.1"

buffer-alloc-unsafe@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
  integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==

buffer-alloc@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
  integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
  dependencies:
    buffer-alloc-unsafe "^1.1.0"
    buffer-fill "^1.0.0"

buffer-crc32@^0.2.1:
  version "0.2.13"
  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
  integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=

buffer-fill@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
  integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=

buffer@^5.1.0:
  version "5.4.3"
  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115"
  integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==
  dependencies:
    base64-js "^1.0.2"
    ieee754 "^1.1.4"

cache-base@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
  dependencies:
    collection-visit "^1.0.0"
    component-emitter "^1.2.1"
    get-value "^2.0.6"
    has-value "^1.0.0"
    isobject "^3.0.1"
    set-value "^2.0.0"
    to-object-path "^0.3.0"
    union-value "^1.0.0"
    unset-value "^1.0.0"

camelcase-keys@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
  integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
  dependencies:
    camelcase "^2.0.0"
    map-obj "^1.0.0"

camelcase@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
  integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=

chalk@^1.1.1:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
  dependencies:
    ansi-styles "^2.2.1"
    escape-string-regexp "^1.0.2"
    has-ansi "^2.0.0"
    strip-ansi "^3.0.0"
    supports-color "^2.0.0"

chalk@^2.4.2, chalk@~2.4.1:
  version "2.4.2"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
  dependencies:
    ansi-styles "^3.2.1"
    escape-string-regexp "^1.0.5"
    supports-color "^5.3.0"

chownr@^1.1.1:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
  integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==

class-utils@^0.3.5:
  version "0.3.6"
  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
  dependencies:
    arr-union "^3.1.0"
    define-property "^0.2.5"
    isobject "^3.0.0"
    static-extend "^0.1.1"

cli@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
  integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=
  dependencies:
    exit "0.1.2"
    glob "^7.1.1"

code-point-at@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
  integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=

coffeescript@~1.10.0:
  version "1.10.0"
  resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e"
  integrity sha1-56qDAZF+9iGzXYo580jc3R234z4=

collection-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
  dependencies:
    map-visit "^1.0.0"
    object-visit "^1.0.0"

color-convert@^1.9.0:
  version "1.9.3"
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
  dependencies:
    color-name "1.1.3"

color-name@1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=

colors@~1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
  integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=

component-emitter@^1.2.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==

compress-commons@^1.2.0:
  version "1.2.2"
  resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
  integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=
  dependencies:
    buffer-crc32 "^0.2.1"
    crc32-stream "^2.0.0"
    normalize-path "^2.0.0"
    readable-stream "^2.0.0"

concat-map@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=

console-browserify@1.1.x:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
  integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
  dependencies:
    date-now "^0.1.4"

console-control-strings@^1.0.0, console-control-strings@~1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
  integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=

copy-descriptor@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=

core-util-is@~1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=

crc32-stream@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
  integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ=
  dependencies:
    crc "^3.4.4"
    readable-stream "^2.0.0"

crc@^3.4.4:
  version "3.8.0"
  resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
  integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
  dependencies:
    buffer "^5.1.0"

currently-unhandled@^0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
  integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
  dependencies:
    array-find-index "^1.0.1"

date-now@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
  integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=

dateformat@~1.0.12:
  version "1.0.12"
  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
  integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
  dependencies:
    get-stdin "^4.0.1"
    meow "^3.3.0"

debug@^2.2.0, debug@^2.3.3:
  version "2.6.9"
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
  dependencies:
    ms "2.0.0"

decamelize@^1.1.2:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=

decode-uri-component@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=

decompress-response@^4.2.0:
  version "4.2.1"
  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
  integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
  dependencies:
    mimic-response "^2.0.0"

deep-extend@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
  integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==

define-property@^0.2.5:
  version "0.2.5"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
  dependencies:
    is-descriptor "^0.1.0"

define-property@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
  dependencies:
    is-descriptor "^1.0.0"

define-property@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
  dependencies:
    is-descriptor "^1.0.2"
    isobject "^3.0.1"

delegates@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=

detect-file@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=

detect-libc@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=

dom-serializer@0:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
  dependencies:
    domelementtype "^2.0.1"
    entities "^2.0.0"

domelementtype@1:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==

domelementtype@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
  integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==

domhandler@2.3:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
  integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg=
  dependencies:
    domelementtype "1"

domutils@1.5:
  version "1.5.1"
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
  integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
  dependencies:
    dom-serializer "0"
    domelementtype "1"

end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
  version "1.4.4"
  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
  dependencies:
    once "^1.4.0"

entities@1.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
  integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=

entities@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
  integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==

error-ex@^1.2.0:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
  dependencies:
    is-arrayish "^0.2.1"

escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=

esprima@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==

eventemitter2@~0.4.13:
  version "0.4.14"
  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
  integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=

exit@0.1.2, exit@0.1.x, exit@~0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=

expand-brackets@^2.1.4:
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
  dependencies:
    debug "^2.3.3"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    posix-character-classes "^0.1.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

expand-template@^2.0.3:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
  integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==

expand-tilde@^2.0.0, expand-tilde@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
  dependencies:
    homedir-polyfill "^1.0.1"

extend-shallow@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
  dependencies:
    is-extendable "^0.1.0"

extend-shallow@^3.0.0, extend-shallow@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
  dependencies:
    assign-symbols "^1.0.0"
    is-extendable "^1.0.1"

extend@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==

extglob@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
  dependencies:
    array-unique "^0.3.2"
    define-property "^1.0.0"
    expand-brackets "^2.1.4"
    extend-shallow "^2.0.1"
    fragment-cache "^0.2.1"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

file-sync-cmp@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"
  integrity sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=

fill-range@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
  dependencies:
    extend-shallow "^2.0.1"
    is-number "^3.0.0"
    repeat-string "^1.6.1"
    to-regex-range "^2.1.0"

find-up@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
  dependencies:
    path-exists "^2.0.0"
    pinkie-promise "^2.0.0"

find-up@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
  dependencies:
    locate-path "^3.0.0"

findup-sync@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
  integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
  dependencies:
    detect-file "^1.0.0"
    is-glob "^3.1.0"
    micromatch "^3.0.4"
    resolve-dir "^1.0.1"

findup-sync@~0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
  integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=
  dependencies:
    glob "~5.0.0"

fined@^1.0.1:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
  integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
  dependencies:
    expand-tilde "^2.0.2"
    is-plain-object "^2.0.3"
    object.defaults "^1.1.0"
    object.pick "^1.2.0"
    parse-filepath "^1.0.1"

flagged-respawn@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
  integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==

for-in@^1.0.1, for-in@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=

for-own@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
  dependencies:
    for-in "^1.0.1"

fragment-cache@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
  dependencies:
    map-cache "^0.2.2"

fs-constants@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==

fs.realpath@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=

gauge@~2.7.3:
  version "2.7.4"
  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
  integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
  dependencies:
    aproba "^1.0.3"
    console-control-strings "^1.0.0"
    has-unicode "^2.0.0"
    object-assign "^4.1.0"
    signal-exit "^3.0.0"
    string-width "^1.0.1"
    strip-ansi "^3.0.1"
    wide-align "^1.1.0"

get-stdin@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
  integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=

get-value@^2.0.3, get-value@^2.0.6:
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=

getobject@~0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
  integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=

github-from-package@0.0.0:
  version "0.0.0"
  resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
  integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=

glob@^7.0.0, glob@^7.1.1, glob@^7.1.3:
  version "7.1.6"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.4"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@~5.0.0:
  version "5.0.15"
  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
  integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
  dependencies:
    inflight "^1.0.4"
    inherits "2"
    minimatch "2 || 3"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

glob@~7.0.0:
  version "7.0.6"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
  integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.2"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

global-modules@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
  dependencies:
    global-prefix "^1.0.1"
    is-windows "^1.0.1"
    resolve-dir "^1.0.0"

global-prefix@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
  dependencies:
    expand-tilde "^2.0.2"
    homedir-polyfill "^1.0.1"
    ini "^1.3.4"
    is-windows "^1.0.1"
    which "^1.2.14"

graceful-fs@^4.1.0, graceful-fs@^4.1.2:
  version "4.2.3"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==

grunt-cli@^1.3.2:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.3.2.tgz#60f12d12c1b5aae94ae3469c6b5fe24e960014e8"
  integrity sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==
  dependencies:
    grunt-known-options "~1.1.0"
    interpret "~1.1.0"
    liftoff "~2.5.0"
    nopt "~4.0.1"
    v8flags "~3.1.1"

grunt-cli@~1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
  integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=
  dependencies:
    findup-sync "~0.3.0"
    grunt-known-options "~1.1.0"
    nopt "~3.0.6"
    resolve "~1.1.0"

grunt-contrib-clean@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz#3be7ca480da4b740aa5e9d863e2f7e8b24f8a68b"
  integrity sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==
  dependencies:
    async "^2.6.1"
    rimraf "^2.6.2"

grunt-contrib-compress@^1.6.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-compress/-/grunt-contrib-compress-1.6.0.tgz#9708885c738a97a12c5f3072dc97dbc31b4121db"
  integrity sha512-wIFuvk+/Ny4E+OgEfJYFZgoH7KcU/nnNFbYasB7gRvrcRyW6vmTp3Pj8a4rFSR3tbFMjrGvTUszdO6fgLajgZQ==
  dependencies:
    archiver "^1.3.0"
    chalk "^1.1.1"
    lodash "^4.7.0"
    pretty-bytes "^4.0.2"
    stream-buffers "^2.1.0"
  optionalDependencies:
    iltorb "^2.4.3"

grunt-contrib-copy@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz#7060c6581e904b8ab0d00f076e0a8f6e3e7c3573"
  integrity sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=
  dependencies:
    chalk "^1.1.1"
    file-sync-cmp "^0.1.0"

grunt-contrib-jshint@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz#3d789807579034299da1b41c4d70e1ba722973ed"
  integrity sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==
  dependencies:
    chalk "^2.4.2"
    hooker "^0.2.3"
    jshint "~2.10.2"

grunt-known-options@~1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
  integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==

grunt-legacy-log-utils@~2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e"
  integrity sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==
  dependencies:
    chalk "~2.4.1"
    lodash "~4.17.10"

grunt-legacy-log@~2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9"
  integrity sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==
  dependencies:
    colors "~1.1.2"
    grunt-legacy-log-utils "~2.0.0"
    hooker "~0.2.3"
    lodash "~4.17.5"

grunt-legacy-util@~1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42"
  integrity sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==
  dependencies:
    async "~1.5.2"
    exit "~0.1.1"
    getobject "~0.1.0"
    hooker "~0.2.3"
    lodash "~4.17.10"
    underscore.string "~3.3.4"
    which "~1.3.0"

grunt-mkdir@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/grunt-mkdir/-/grunt-mkdir-1.0.0.tgz#73e1a26ac24a08596363f4dd954b0d32485e58e9"
  integrity sha1-c+GiasJKCFljY/TdlUsNMkheWOk=

grunt@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38"
  integrity sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==
  dependencies:
    coffeescript "~1.10.0"
    dateformat "~1.0.12"
    eventemitter2 "~0.4.13"
    exit "~0.1.1"
    findup-sync "~0.3.0"
    glob "~7.0.0"
    grunt-cli "~1.2.0"
    grunt-known-options "~1.1.0"
    grunt-legacy-log "~2.0.0"
    grunt-legacy-util "~1.1.1"
    iconv-lite "~0.4.13"
    js-yaml "~3.13.0"
    minimatch "~3.0.2"
    mkdirp "~0.5.1"
    nopt "~3.0.6"
    path-is-absolute "~1.0.0"
    rimraf "~2.6.2"

has-ansi@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
  dependencies:
    ansi-regex "^2.0.0"

has-flag@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=

has-unicode@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
  integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=

has-value@^0.3.1:
  version "0.3.1"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
  dependencies:
    get-value "^2.0.3"
    has-values "^0.1.4"
    isobject "^2.0.0"

has-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
  dependencies:
    get-value "^2.0.6"
    has-values "^1.0.0"
    isobject "^3.0.0"

has-values@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=

has-values@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
  dependencies:
    is-number "^3.0.0"
    kind-of "^4.0.0"

homedir-polyfill@^1.0.1:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
  dependencies:
    parse-passwd "^1.0.0"

hooker@^0.2.3, hooker@~0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
  integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=

hosted-git-info@^2.1.4:
  version "2.8.5"
  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
  integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==

htmlparser2@3.8.x:
  version "3.8.3"
  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
  integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg=
  dependencies:
    domelementtype "1"
    domhandler "2.3"
    domutils "1.5"
    entities "1.0"
    readable-stream "1.1"

iconv-lite@~0.4.13:
  version "0.4.24"
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
  dependencies:
    safer-buffer ">= 2.1.2 < 3"

ieee754@^1.1.4:
  version "1.1.13"
  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==

iltorb@^2.4.3:
  version "2.4.4"
  resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-2.4.4.tgz#7ec303bbbd8c0cd4d44a847eb6c6d8490f9c7433"
  integrity sha512-7Qk6O7TK3rSWVRVRkPehcNTSN+P2i7MsG9pWmw6iVw/W6NcoNj0rFKOuBDM6fbZV6NNGuUW3JBRem6Ozn4KXhg==
  dependencies:
    detect-libc "^1.0.3"
    nan "^2.14.0"
    npmlog "^4.1.2"
    prebuild-install "^5.3.2"
    which-pm-runs "^1.0.0"

indent-string@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
  integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
  dependencies:
    repeating "^2.0.0"

inflight@^1.0.4:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
  dependencies:
    once "^1.3.0"
    wrappy "1"

inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==

ini@^1.3.4, ini@~1.3.0:
  version "1.3.5"
  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==

interpret@~1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
  integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=

is-absolute@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
  dependencies:
    is-relative "^1.0.0"
    is-windows "^1.0.1"

is-accessor-descriptor@^0.1.6:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
  dependencies:
    kind-of "^3.0.2"

is-accessor-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
  dependencies:
    kind-of "^6.0.0"

is-arrayish@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=

is-buffer@^1.1.5:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==

is-data-descriptor@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
  dependencies:
    kind-of "^3.0.2"

is-data-descriptor@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
  dependencies:
    kind-of "^6.0.0"

is-descriptor@^0.1.0:
  version "0.1.6"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
  dependencies:
    is-accessor-descriptor "^0.1.6"
    is-data-descriptor "^0.1.4"
    kind-of "^5.0.0"

is-descriptor@^1.0.0, is-descriptor@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
  dependencies:
    is-accessor-descriptor "^1.0.0"
    is-data-descriptor "^1.0.0"
    kind-of "^6.0.2"

is-extendable@^0.1.0, is-extendable@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=

is-extendable@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
  dependencies:
    is-plain-object "^2.0.4"

is-extglob@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=

is-finite@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
  integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
  dependencies:
    number-is-nan "^1.0.0"

is-fullwidth-code-point@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
  integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
  dependencies:
    number-is-nan "^1.0.0"

is-fullwidth-code-point@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=

is-glob@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
  dependencies:
    is-extglob "^2.1.0"

is-number@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
  dependencies:
    kind-of "^3.0.2"

is-plain-object@^2.0.3, is-plain-object@^2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
  dependencies:
    isobject "^3.0.1"

is-relative@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
  dependencies:
    is-unc-path "^1.0.0"

is-unc-path@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
  dependencies:
    unc-path-regex "^0.1.2"

is-utf8@^0.2.0:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
  integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=

is-windows@^1.0.1, is-windows@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==

isarray@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=

isarray@1.0.0, isarray@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=

isexe@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=

isobject@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
  dependencies:
    isarray "1.0.0"

isobject@^3.0.0, isobject@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=

js-yaml@~3.13.0:
  version "3.13.1"
  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
  dependencies:
    argparse "^1.0.7"
    esprima "^4.0.0"

jshint@~2.10.2:
  version "2.10.3"
  resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.3.tgz#98dc765bf6920b41bc2719f76b8739d6f6e93a9c"
  integrity sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==
  dependencies:
    cli "~1.0.0"
    console-browserify "1.1.x"
    exit "0.1.x"
    htmlparser2 "3.8.x"
    lodash "~4.17.11"
    minimatch "~3.0.2"
    shelljs "0.3.x"
    strip-json-comments "1.0.x"

kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
  dependencies:
    is-buffer "^1.1.5"

kind-of@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==

kind-of@^6.0.0, kind-of@^6.0.2:
  version "6.0.2"
  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
  integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==

lazystream@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
  integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
  dependencies:
    readable-stream "^2.0.5"

liftoff@~2.5.0:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
  integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
  dependencies:
    extend "^3.0.0"
    findup-sync "^2.0.0"
    fined "^1.0.1"
    flagged-respawn "^1.0.0"
    is-plain-object "^2.0.4"
    object.map "^1.0.0"
    rechoir "^0.6.2"
    resolve "^1.1.7"

load-grunt-tasks@^5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz#14894c27a7e34ebbef9937c39cc35c573cd04c1c"
  integrity sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==
  dependencies:
    arrify "^2.0.1"
    multimatch "^4.0.0"
    pkg-up "^3.1.0"
    resolve-pkg "^2.0.0"

load-json-file@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
  integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
  dependencies:
    graceful-fs "^4.1.2"
    parse-json "^2.2.0"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"
    strip-bom "^2.0.0"

locate-path@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
  integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
  dependencies:
    p-locate "^3.0.0"
    path-exists "^3.0.0"

lodash@^4.17.14, lodash@^4.17.15, lodash@^4.7.0, lodash@^4.8.0, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5:
  version "4.17.15"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
  integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==

loud-rejection@^1.0.0:
  version "1.6.0"
  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
  integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
  dependencies:
    currently-unhandled "^0.4.1"
    signal-exit "^3.0.0"

make-iterator@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
  integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
  dependencies:
    kind-of "^6.0.2"

map-cache@^0.2.0, map-cache@^0.2.2:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=

map-obj@^1.0.0, map-obj@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
  integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=

map-visit@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
  dependencies:
    object-visit "^1.0.0"

meow@^3.3.0:
  version "3.7.0"
  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
  integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
  dependencies:
    camelcase-keys "^2.0.0"
    decamelize "^1.1.2"
    loud-rejection "^1.0.0"
    map-obj "^1.0.1"
    minimist "^1.1.3"
    normalize-package-data "^2.3.4"
    object-assign "^4.0.1"
    read-pkg-up "^1.0.1"
    redent "^1.0.0"
    trim-newlines "^1.0.0"

micromatch@^3.0.4:
  version "3.1.10"
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    braces "^2.3.1"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    extglob "^2.0.4"
    fragment-cache "^0.2.1"
    kind-of "^6.0.2"
    nanomatch "^1.2.9"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.2"

mimic-response@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46"
  integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==

"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
  dependencies:
    brace-expansion "^1.1.7"

minimist@0.0.8:
  version "0.0.8"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=

minimist@^1.1.3, minimist@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
  integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=

mixin-deep@^1.2.0:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
  dependencies:
    for-in "^1.0.2"
    is-extendable "^1.0.1"

mkdirp@^0.5.1, mkdirp@~0.5.1:
  version "0.5.1"
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
  dependencies:
    minimist "0.0.8"

ms@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=

multimatch@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
  integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
  dependencies:
    "@types/minimatch" "^3.0.3"
    array-differ "^3.0.0"
    array-union "^2.1.0"
    arrify "^2.0.1"
    minimatch "^3.0.4"

nan@^2.14.0:
  version "2.14.0"
  resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
  integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==

nanomatch@^1.2.9:
  version "1.2.13"
  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
  dependencies:
    arr-diff "^4.0.0"
    array-unique "^0.3.2"
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    fragment-cache "^0.2.1"
    is-windows "^1.0.2"
    kind-of "^6.0.2"
    object.pick "^1.3.0"
    regex-not "^1.0.0"
    snapdragon "^0.8.1"
    to-regex "^3.0.1"

napi-build-utils@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508"
  integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==

node-abi@^2.7.0:
  version "2.13.0"
  resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.13.0.tgz#e2f2ec444d0aca3ea1b3874b6de41d1665828f63"
  integrity sha512-9HrZGFVTR5SOu3PZAnAY2hLO36aW1wmA+FDsVkr85BTST32TLCA1H/AEcatVRAsWLyXS3bqUDYCAjq5/QGuSTA==
  dependencies:
    semver "^5.4.1"

noop-logger@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
  integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=

nopt@~3.0.6:
  version "3.0.6"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
  integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
  dependencies:
    abbrev "1"

nopt@~4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
  integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
  dependencies:
    abbrev "1"
    osenv "^0.1.4"

normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
  dependencies:
    hosted-git-info "^2.1.4"
    resolve "^1.10.0"
    semver "2 || 3 || 4 || 5"
    validate-npm-package-license "^3.0.1"

normalize-path@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
  dependencies:
    remove-trailing-separator "^1.0.1"

npmlog@^4.0.1, npmlog@^4.1.2:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
  integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
  dependencies:
    are-we-there-yet "~1.1.2"
    console-control-strings "~1.1.0"
    gauge "~2.7.3"
    set-blocking "~2.0.0"

number-is-nan@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=

object-assign@^4.0.1, object-assign@^4.1.0:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=

object-copy@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
  dependencies:
    copy-descriptor "^0.1.0"
    define-property "^0.2.5"
    kind-of "^3.0.3"

object-visit@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
  dependencies:
    isobject "^3.0.0"

object.defaults@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
  integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
  dependencies:
    array-each "^1.0.1"
    array-slice "^1.0.0"
    for-own "^1.0.0"
    isobject "^3.0.0"

object.map@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
  integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
  dependencies:
    for-own "^1.0.0"
    make-iterator "^1.0.0"

object.pick@^1.2.0, object.pick@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
  dependencies:
    isobject "^3.0.1"

once@^1.3.0, once@^1.3.1, once@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
  dependencies:
    wrappy "1"

os-homedir@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=

os-tmpdir@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=

osenv@^0.1.4:
  version "0.1.5"
  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
  integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
  dependencies:
    os-homedir "^1.0.0"
    os-tmpdir "^1.0.0"

p-limit@^2.0.0:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
  integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
  dependencies:
    p-try "^2.0.0"

p-locate@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
  integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
  dependencies:
    p-limit "^2.0.0"

p-try@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==

parse-filepath@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
  integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
  dependencies:
    is-absolute "^1.0.0"
    map-cache "^0.2.0"
    path-root "^0.1.1"

parse-json@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
  dependencies:
    error-ex "^1.2.0"

parse-passwd@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=

pascalcase@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=

path-exists@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
  dependencies:
    pinkie-promise "^2.0.0"

path-exists@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=

path-is-absolute@^1.0.0, path-is-absolute@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=

path-parse@^1.0.6:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==

path-root-regex@^0.1.0:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
  integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=

path-root@^0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
  integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
  dependencies:
    path-root-regex "^0.1.0"

path-type@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
  integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
  dependencies:
    graceful-fs "^4.1.2"
    pify "^2.0.0"
    pinkie-promise "^2.0.0"

pify@^2.0.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=

pinkie-promise@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
  dependencies:
    pinkie "^2.0.0"

pinkie@^2.0.0:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=

pkg-up@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
  integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
  dependencies:
    find-up "^3.0.0"

posix-character-classes@^0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=

prebuild-install@^5.3.2:
  version "5.3.3"
  resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e"
  integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==
  dependencies:
    detect-libc "^1.0.3"
    expand-template "^2.0.3"
    github-from-package "0.0.0"
    minimist "^1.2.0"
    mkdirp "^0.5.1"
    napi-build-utils "^1.0.1"
    node-abi "^2.7.0"
    noop-logger "^0.1.1"
    npmlog "^4.0.1"
    pump "^3.0.0"
    rc "^1.2.7"
    simple-get "^3.0.3"
    tar-fs "^2.0.0"
    tunnel-agent "^0.6.0"
    which-pm-runs "^1.0.0"

pretty-bytes@^4.0.2:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
  integrity sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=

process-nextick-args@~2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==

pump@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
  dependencies:
    end-of-stream "^1.1.0"
    once "^1.3.1"

rc@^1.2.7:
  version "1.2.8"
  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
  integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
  dependencies:
    deep-extend "^0.6.0"
    ini "~1.3.0"
    minimist "^1.2.0"
    strip-json-comments "~2.0.1"

read-pkg-up@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
  integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
  dependencies:
    find-up "^1.0.0"
    read-pkg "^1.0.0"

read-pkg@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
  integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
  dependencies:
    load-json-file "^1.0.0"
    normalize-package-data "^2.3.2"
    path-type "^1.0.0"

readable-stream@1.1:
  version "1.1.13"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
  integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "0.0.1"
    string_decoder "~0.10.x"

readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5:
  version "2.3.7"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.3"
    isarray "~1.0.0"
    process-nextick-args "~2.0.0"
    safe-buffer "~5.1.1"
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"

readable-stream@^3.0.1, readable-stream@^3.1.1:
  version "3.4.0"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
  integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
  dependencies:
    inherits "^2.0.3"
    string_decoder "^1.1.1"
    util-deprecate "^1.0.1"

rechoir@^0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
  integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
  dependencies:
    resolve "^1.1.6"

redent@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
  integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
  dependencies:
    indent-string "^2.1.0"
    strip-indent "^1.0.1"

regex-not@^1.0.0, regex-not@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
  dependencies:
    extend-shallow "^3.0.2"
    safe-regex "^1.1.0"

remove-trailing-separator@^1.0.1:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=

repeat-element@^1.1.2:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==

repeat-string@^1.6.1:
  version "1.6.1"
  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=

repeating@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
  integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
  dependencies:
    is-finite "^1.0.0"

resolve-dir@^1.0.0, resolve-dir@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
  dependencies:
    expand-tilde "^2.0.0"
    global-modules "^1.0.0"

resolve-from@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==

resolve-pkg@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41"
  integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==
  dependencies:
    resolve-from "^5.0.0"

resolve-url@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=

resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0:
  version "1.14.1"
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff"
  integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==
  dependencies:
    path-parse "^1.0.6"

resolve@~1.1.0:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=

ret@~0.1.10:
  version "0.1.15"
  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==

rimraf@^2.6.2:
  version "2.7.1"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
  dependencies:
    glob "^7.1.3"

rimraf@~2.6.2:
  version "2.6.3"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
  dependencies:
    glob "^7.1.3"

safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.2.0:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
  integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==

safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==

safe-regex@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
  dependencies:
    ret "~0.1.10"

"safer-buffer@>= 2.1.2 < 3":
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

"semver@2 || 3 || 4 || 5", semver@^5.4.1:
  version "5.7.1"
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==

set-blocking@~2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=

set-value@^2.0.0, set-value@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
  dependencies:
    extend-shallow "^2.0.1"
    is-extendable "^0.1.1"
    is-plain-object "^2.0.3"
    split-string "^3.0.1"

shelljs@0.3.x:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
  integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=

signal-exit@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
  integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=

simple-concat@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
  integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=

simple-get@^3.0.3:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
  integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
  dependencies:
    decompress-response "^4.2.0"
    once "^1.3.1"
    simple-concat "^1.0.0"

snapdragon-node@^2.0.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
  dependencies:
    define-property "^1.0.0"
    isobject "^3.0.0"
    snapdragon-util "^3.0.1"

snapdragon-util@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
  dependencies:
    kind-of "^3.2.0"

snapdragon@^0.8.1:
  version "0.8.2"
  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
  dependencies:
    base "^0.11.1"
    debug "^2.2.0"
    define-property "^0.2.5"
    extend-shallow "^2.0.1"
    map-cache "^0.2.2"
    source-map "^0.5.6"
    source-map-resolve "^0.5.0"
    use "^3.1.0"

source-map-resolve@^0.5.0:
  version "0.5.3"
  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
  dependencies:
    atob "^2.1.2"
    decode-uri-component "^0.2.0"
    resolve-url "^0.2.1"
    source-map-url "^0.4.0"
    urix "^0.1.0"

source-map-url@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=

source-map@^0.5.6:
  version "0.5.7"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=

spdx-correct@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
  integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
  dependencies:
    spdx-expression-parse "^3.0.0"
    spdx-license-ids "^3.0.0"

spdx-exceptions@^2.1.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
  integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==

spdx-expression-parse@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
  integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
  dependencies:
    spdx-exceptions "^2.1.0"
    spdx-license-ids "^3.0.0"

spdx-license-ids@^3.0.0:
  version "3.0.5"
  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==

split-string@^3.0.1, split-string@^3.0.2:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
  dependencies:
    extend-shallow "^3.0.0"

sprintf-js@^1.0.3:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
  integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==

sprintf-js@~1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=

static-extend@^0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
  dependencies:
    define-property "^0.2.5"
    object-copy "^0.1.0"

stream-buffers@^2.1.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
  integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=

string-width@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
  integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
  dependencies:
    code-point-at "^1.0.0"
    is-fullwidth-code-point "^1.0.0"
    strip-ansi "^3.0.0"

"string-width@^1.0.2 || 2":
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
  dependencies:
    is-fullwidth-code-point "^2.0.0"
    strip-ansi "^4.0.0"

string_decoder@^1.1.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
  dependencies:
    safe-buffer "~5.2.0"

string_decoder@~0.10.x:
  version "0.10.31"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=

string_decoder@~1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
  dependencies:
    safe-buffer "~5.1.0"

strip-ansi@^3.0.0, strip-ansi@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
  dependencies:
    ansi-regex "^2.0.0"

strip-ansi@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
  integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
  dependencies:
    ansi-regex "^3.0.0"

strip-bom@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
  integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
  dependencies:
    is-utf8 "^0.2.0"

strip-indent@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
  integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
  dependencies:
    get-stdin "^4.0.1"

strip-json-comments@1.0.x:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
  integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=

strip-json-comments@~2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=

supports-color@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=

supports-color@^5.3.0:
  version "5.5.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
  dependencies:
    has-flag "^3.0.0"

tar-fs@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad"
  integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==
  dependencies:
    chownr "^1.1.1"
    mkdirp "^0.5.1"
    pump "^3.0.0"
    tar-stream "^2.0.0"

tar-stream@^1.5.0:
  version "1.6.2"
  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
  integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
  dependencies:
    bl "^1.0.0"
    buffer-alloc "^1.2.0"
    end-of-stream "^1.0.0"
    fs-constants "^1.0.0"
    readable-stream "^2.3.0"
    to-buffer "^1.1.1"
    xtend "^4.0.0"

tar-stream@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3"
  integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==
  dependencies:
    bl "^3.0.0"
    end-of-stream "^1.4.1"
    fs-constants "^1.0.0"
    inherits "^2.0.3"
    readable-stream "^3.1.1"

to-buffer@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
  integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==

to-object-path@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
  dependencies:
    kind-of "^3.0.2"

to-regex-range@^2.1.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
  dependencies:
    is-number "^3.0.0"
    repeat-string "^1.6.1"

to-regex@^3.0.1, to-regex@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
  dependencies:
    define-property "^2.0.2"
    extend-shallow "^3.0.2"
    regex-not "^1.0.2"
    safe-regex "^1.1.0"

trim-newlines@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
  integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=

tunnel-agent@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
  integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
  dependencies:
    safe-buffer "^5.0.1"

unc-path-regex@^0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=

underscore.string@~3.3.4:
  version "3.3.5"
  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
  integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
  dependencies:
    sprintf-js "^1.0.3"
    util-deprecate "^1.0.2"

union-value@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
  dependencies:
    arr-union "^3.1.0"
    get-value "^2.0.6"
    is-extendable "^0.1.1"
    set-value "^2.0.1"

unset-value@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
  dependencies:
    has-value "^0.3.1"
    isobject "^3.0.0"

urix@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=

use@^3.1.0:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==

util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=

v8flags@~3.1.1:
  version "3.1.3"
  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
  integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
  dependencies:
    homedir-polyfill "^1.0.1"

validate-npm-package-license@^3.0.1:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
  dependencies:
    spdx-correct "^3.0.0"
    spdx-expression-parse "^3.0.0"

walkdir@^0.0.11:
  version "0.0.11"
  resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
  integrity sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=

webextension-polyfill@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.6.0.tgz#1afd925f3274a0d4848083579b9c0b649a5c6763"
  integrity sha512-PlYwiX8e4bNZrEeBFxbFFsLtm0SMPxJliLTGdNCA0Bq2XkWrAn2ejUd+89vZm+8BnfFB1BclJyCz3iKsm2atNg==

which-pm-runs@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
  integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=

which@^1.2.14, which@~1.3.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
  dependencies:
    isexe "^2.0.0"

wide-align@^1.1.0:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
  integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
  dependencies:
    string-width "^1.0.2 || 2"

wrappy@1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=

xtend@^4.0.0:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==

zip-stream@^1.1.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
  integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=
  dependencies:
    archiver-utils "^1.3.0"
    compress-commons "^1.2.0"
    lodash "^4.8.0"
    readable-stream "^2.0.0"