diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c38fa4e005685a861be5fdbe8fcbb03f84a216b0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.idea
+*.iml
diff --git a/javascript/.gitignore b/javascript/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f06235c460c2de3d97efc8371125594b7b761b08
--- /dev/null
+++ b/javascript/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+dist
diff --git a/npm/package/README.md b/javascript/README.md
similarity index 100%
rename from npm/package/README.md
rename to javascript/README.md
diff --git a/npm/package/package.json b/javascript/package.json
similarity index 59%
rename from npm/package/package.json
rename to javascript/package.json
index 149d38c260af89f01bd0008db7fb55073a3bce03..1438a83af4dcfa9ad3a016a0e9a924fd0908c698 100644
--- a/npm/package/package.json
+++ b/javascript/package.json
@@ -2,17 +2,14 @@
   "name": "vereign-client-lib",
   "description": "Vereign 3rd Party Integration Client Library",
   "version": "1.0.0",
+  "scripts": {
+    "build": "webpack"
+  },
   "repository": {
     "type": "git",
     "url": "git@code.vereign.com:code/vcl.git"
   },
   "homepage": "https://code.vereign.com/code/vcl",
-  "main": "index.js",
-  "files": [
-    "index.js"
-  ],
-  "dependencies": {},
-  "devDependencies": {},
   "keywords": [
     "vereign",
     "library",
@@ -24,6 +21,17 @@
     "url": "https://www.vereign.com/"
   },
   "license": "MIT",
-  "testling": {},
-  "scripts": {}
+  "dependencies": {
+    "asn1js": "^2.0.21",
+    "axios": "0.18.0",
+    "libmime": "^4.0.1",
+    "penpal": "^3.0.3",
+    "pkijs": "^2.1.69",
+    "pvutils": "^1.0.16",
+    "qrcode": "^1.3.0"
+  },
+  "devDependencies": {
+    "webpack": "^4.23.1",
+    "webpack-cli": "^3.1.2"
+  }
 }
diff --git a/javascript/src/viamapi-client.js b/javascript/src/viamapi-client.js
new file mode 100644
index 0000000000000000000000000000000000000000..55e9cabad6c32238f5b9681a8a7127ef27faa800
--- /dev/null
+++ b/javascript/src/viamapi-client.js
@@ -0,0 +1,14 @@
+const Penpal = require('penpal').default;
+
+function setupViamAPI(divId, methodsArg) {
+	const connection = Penpal.connectToChild({
+	  // URL of page to load into iframe.
+	  url: '{{urlArg}}',
+	  // Container to which the iframe should be appended.
+	  appendTo: document.getElementById(divId),
+	  // Methods parent is exposing to child
+	  methods: methodsArg
+	});
+
+	return connection.promise
+}
diff --git a/javascript/src/viamapi-iframe.js b/javascript/src/viamapi-iframe.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d5927e090032d60d52de106b93e0f54d0d95b08
--- /dev/null
+++ b/javascript/src/viamapi-iframe.js
@@ -0,0 +1,2503 @@
+const libmime = require('libmime');
+const QRCode = require('qrcode');
+const pkijs = require('pkijs');
+const asn1js = require('asn1js');
+const pvutils = require('pvutils');
+const Penpal = require('penpal').default;
+window.axios = require('axios');
+//*********************************************************************************
+
+const CERTIFIATE_Version_1 = 0;
+const CERTIFIATE_Version_3 = 2;
+
+//these bit fields are reversed, WTF!
+const KEY_USAGE_DigitalSignature	= 0x80;//01;
+const KEY_USAGE_NonRepudiation		= 0x40;//02;
+const KEY_USAGE_KeyEncipherment		= 0x20;//04;
+const KEY_USAGE_DataEncipherment	= 0x10;//08;
+const KEY_USAGE_KeyAgreement		= 0x08;//10;
+const KEY_USAGE_KeyCertSign			= 0x04;//20;
+const KEY_USAGE_CRLSign				= 0x02;//40;
+//const KEY_USAGE_EncipherOnly		= 0x01;//80; // Not used for now. Must be used together with KEY_USAGE_KeyAgreement (maybe should be ORed as a constant directly?)
+//const KEY_USAGE_DecipherOnly		= 0x80;//0100; // If used, modify "KeyUsage" extension array buffer size and appropriate bit operators to accomodate for extra byte
+
+const KEY_USAGE_LeafCertificate		= KEY_USAGE_DigitalSignature | KEY_USAGE_NonRepudiation | KEY_USAGE_KeyEncipherment | KEY_USAGE_DataEncipherment;
+const KEY_USAGE_CertificateAuthority= KEY_USAGE_DigitalSignature | KEY_USAGE_KeyCertSign | KEY_USAGE_CRLSign;
+
+
+const OID_EXT_KEY_USAGE_Any     	= "2.5.29.37.0";
+const OID_ID_PKIX_ServerAuth		= "1.3.6.1.5.5.7.3.1";
+const OID_ID_PKIX_ClientAuth		= "1.3.6.1.5.5.7.3.2";
+const OID_ID_PKIX_CodeSigning		= "1.3.6.1.5.5.7.3.3";
+const OID_ID_PKIX_EmailProtection	= "1.3.6.1.5.5.7.3.4";
+const OID_ID_PKIX_TimeStamping	    = "1.3.6.1.5.5.7.3.8";
+const OID_ID_PKIX_OCSPSigning		= "1.3.6.1.5.5.7.3.9";
+// const OID_EXT_KEY_USAGE_MS...	= "1.3.6.1.4.1.311.10.3.1"; // Microsoft Certificate Trust List signing
+// const OID_EXT_KEY_USAGE_MS...	= "1.3.6.1.4.1.311.10.3.4";  // Microsoft Encrypted File System
+const OID_PKCS7_Data                = "1.2.840.113549.1.7.1";
+const OID_PKCS7_SignedData          = "1.2.840.113549.1.7.2";
+const OID_PKCS7_EnvelopedData       = "1.2.840.113549.1.7.3";
+const OID_PKCS9_EmailAddress        = "1.2.840.113549.1.9.1";
+const OID_PKCS9_ContentType         = "1.2.840.113549.1.9.3";
+const OID_PKCS9_MessageDigest       = "1.2.840.113549.1.9.4";
+const OID_PKCS9_SigningTime         = "1.2.840.113549.1.9.5"
+
+const defaultAlgorithms = {
+  hashAlg: "SHA-256",
+  signAlg: "RSASSA-PKCS1-v1_5",
+  keyLength: 2048
+}
+
+const AES_encryptionVariant_Password  = 2;
+const encryptionAlgorithm = {
+  name: "AES-CBC",
+  length: 128
+};
+
+//*********************************************************************************
+// Returns promise, resolved to keyPair object {publicKey, privateKey}
+//*********************************************************************************
+function generateKeys(algorithms) {
+  //region Get a "crypto" extension
+  const crypto = pkijs.getCrypto();
+  if (typeof crypto === "undefined") {
+    return Promise.reject("No WebCrypto extension found");
+  }
+  //endregion Get a "crypto" extension
+
+  if (!algorithms) {
+    algorithms = defaultAlgorithms;
+  } else {
+    if (!algorithms.hashAlg) {
+      algorithms.hashAlg = defaultAlgorithms.hashAlg;
+    }
+    if (!algorithms.signAlg) {
+      algorithms.signAlg = defaultAlgorithms.signAlg;
+    }
+    if (!algorithms.keyLength) {
+      algorithms.keyLength = defaultAlgorithms.keyLength;
+    }
+  }
+
+  //region Get default algorithm parameters for key generation
+  const algorithm = pkijs.getAlgorithmParameters(algorithms.signAlg, "generatekey");
+  if("hash" in algorithm.algorithm) {
+    algorithm.algorithm.hash.name = algorithms.hashAlg;
+  }
+  algorithm.algorithm.modulusLength = algorithms.keyLength;
+  //endregion
+
+  return crypto.generateKey(algorithm.algorithm, true, algorithm.usages);
+}
+
+//*********************************************************************************
+function createCertificate(certData, issuerData = null)
+{
+
+  if (typeof certData === "undefined") {
+    return Promise.reject("No Certificate data provided");
+  }
+
+  if (typeof certData.subject === "undefined") {
+    return Promise.reject("No Certificate subject data provided");
+  }
+
+
+  //region Get a "crypto" extension
+  const crypto = pkijs.getCrypto();
+
+  if (typeof crypto === "undefined") {
+    return Promise.reject("No WebCrypto extension found");
+  }
+  //endregion Get a "crypto" extension
+
+  //region Initial variables
+  let sequence = Promise.resolve();
+
+  const certificate = new pkijs.Certificate();
+  let publicKey;
+  let privateKey;
+
+  let certificateBuffer;// = new ArrayBuffer(0); // ArrayBuffer with loaded or created CERT
+  let privateKeyBuffer;// = new ArrayBuffer(0);
+  let publicKeyBuffer;// = new ArrayBuffer(0);
+
+  //endregion Initial variables
+
+  if (certData.keyPair) {
+    //region Create a new key pair
+    sequence = sequence.then(() =>
+    {
+      return certData.keyPair;
+    });
+    //endregion Create a new key pair
+
+  } else {
+    //region Create a new key pair
+    sequence = sequence.then(() =>
+    {
+      return generateKeys(certData.algorithms);
+    });
+    //endregion Create a new key pair
+  }
+
+  //region Store new key in an interim variables
+  sequence = sequence.then(keyPair =>
+  {
+    publicKey = keyPair.publicKey;
+    privateKey = keyPair.privateKey;
+  }, error => Promise.reject(`Error during key generation: ${error}`));
+  //endregion Store new key in an interim variables
+
+  //region Exporting public key into "subjectPublicKeyInfo" value of certificate
+  sequence = sequence.then(() =>
+    certificate.subjectPublicKeyInfo.importKey(publicKey)
+  );
+  //endregion Exporting public key into "subjectPublicKeyInfo" value of certificate
+
+  sequence = sequence.then(
+    () => crypto.digest({ name: "SHA-1" }, certificate.subjectPublicKeyInfo.subjectPublicKey.valueBlock.valueHex),
+    error => Promise.reject(`Error during importing public key: ${error}`)
+  );
+
+  //region Fill in cert data
+  sequence = sequence.then(subjKeyIdBuffer =>
+  {
+
+    //region Put a static values
+    certificate.version = CERTIFIATE_Version_3;
+
+    const serialNumberBuffer = new ArrayBuffer(20);
+    const serialNumberView = new Uint8Array(serialNumberBuffer);
+    pkijs.getRandomValues(serialNumberView)
+    // noinspection JSUnresolvedFunction
+    certificate.serialNumber = new asn1js.Integer({ valueHex: serialNumberView });
+    //endregion Put a static values
+
+    //region Subject
+    // For reference http://oidref.com/2.5.4.3
+    if (certData.subject.commonName) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.3", // Common name
+        value: new asn1js.PrintableString({ value: certData.subject.commonName })
+      }));
+    }
+
+    if (certData.subject.country) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.6", // Country name
+        value: new asn1js.PrintableString({ value: certData.subject.country })
+      }));
+    }
+
+    if (certData.subject.locality) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.7", // Locality Name
+        value: new asn1js.PrintableString({ value: certData.subject.locality })
+      }));
+    }
+
+    if (certData.subject.state) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.8", // State or Province name
+        value: new asn1js.PrintableString({ value: certData.subject.state })
+      }));
+    }
+
+    if (certData.subject.organization) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.10", // Organization name
+        value: new asn1js.PrintableString({ value: certData.subject.organization })
+      }));
+    }
+
+    if (certData.subject.organizationUnit) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: "2.5.4.11", // Organization unit name
+        value: new asn1js.PrintableString({ value: certData.subject.organizationUnit })
+      }));
+    }
+
+    if (certData.subject.email) {
+      // noinspection JSUnresolvedFunction
+      certificate.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
+        type: OID_PKCS9_EmailAddress, // Email, deprecated but still widely used
+        value: new asn1js.IA5String({ value: certData.subject.email })
+      }));
+    }
+    //endregion Subject
+
+
+    //region Issuer
+    if (issuerData && issuerData.certificate) {
+      certificate.issuer = issuerData.certificate.subject;
+    } else {
+      certificate.issuer = certificate.subject;
+    }
+    //endregion Issuer
+
+    //region Validity
+    if (!certData.validity) {
+      certData.validity = {}
+    }
+
+    if (certData.validity.notBefore) {
+      certificate.notBefore.value = certData.validity.notBefore; //date
+    } else {
+      const tmp = new Date();
+      certificate.notBefore.value = new Date(tmp.getFullYear(), tmp.getMonth(), tmp.getDate(), 0, 0, 0);
+    }
+
+    if (certData.validity.notAfter) {
+      certificate.notAfter.value = certData.validity.notAfter; //date
+    } else {
+      const tmp = certificate.notBefore.value;
+      const validYears = certData.validity.validYears || 1;
+      certificate.notAfter.value = new Date(tmp.getFullYear() + validYears, tmp.getMonth(), tmp.getDate(), 23, 59, 59);
+    }
+    //endregion Validity
+
+    //region Extensions
+    certificate.extensions = []; // Extensions are not a part of certificate by default, it's an optional array
+
+    //region "BasicConstraints" extension
+    const basicConstr = new pkijs.BasicConstraints({
+      cA: !!certData.isCA,
+      //pathLenConstraint: 0 //TODO add logic for leaf CA
+    });
+
+    certificate.extensions.push(new pkijs.Extension({
+      extnID: "2.5.29.19",
+      critical: true,
+      extnValue: basicConstr.toSchema().toBER(false),
+      parsedValue: basicConstr // Parsed value for well-known extensions
+    }));
+    //endregion "BasicConstraints" extension
+
+    //region "KeyUsage" extension
+    const keyUsageBuffer = new ArrayBuffer(1);
+    const keyUsageBitView = new Uint8Array(keyUsageBuffer);
+
+    keyUsageBitView[0] = !!certData.isCA ? KEY_USAGE_CertificateAuthority : KEY_USAGE_LeafCertificate;
+
+    // noinspection JSUnresolvedFunction
+    const keyUsage = new asn1js.BitString({ valueHex: keyUsageBuffer });
+
+    certificate.extensions.push(new pkijs.Extension({
+      extnID: "2.5.29.15",
+      critical: true,
+      extnValue: keyUsage.toBER(false),
+      parsedValue: keyUsage // Parsed value for well-known extensions
+    }));
+    //endregion "KeyUsage" extension
+
+    //region "ExtKeyUsage" extension
+    if (!certData.isCA && certData.subject.email) {
+      const extKeyUsage = new pkijs.ExtKeyUsage({
+        keyPurposes: [
+          OID_ID_PKIX_EmailProtection
+        ]
+      });
+
+      certificate.extensions.push(new pkijs.Extension({
+        extnID: "2.5.29.37",
+        critical: false,
+        extnValue: extKeyUsage.toSchema().toBER(false),
+        parsedValue: extKeyUsage // Parsed value for well-known extensions
+      }));
+    }
+    //endregion "ExtKeyUsage" extension
+
+    //region "SubjAltName" extension
+    if (certData.subject.email || certData.subject.url) {
+
+      const names = [];
+
+      if (certData.subject.email) {
+        names.push(new pkijs.GeneralName({
+          type: 1, // rfc822Name
+          value: certData.subject.email
+        }));
+      }
+
+      if (certData.subject.url) {
+        names.push(new pkijs.GeneralName({
+          type: 2, // dNSName
+          value: certData.subject.url
+        }));
+      }
+
+      const subjAltNames = new pkijs.GeneralNames({
+        names: names
+      });
+
+      certificate.extensions.push(new pkijs.Extension({
+        extnID: "2.5.29.17",
+        critical: false,
+        extnValue: subjAltNames.toSchema().toBER(false),
+        parsedValue: subjAltNames // Parsed value for well-known extensions
+      }));
+    }
+    //endregion "SubjAltName" extension
+
+
+    //region "SubjectKeyIdentifier" extension
+    const subjKeyId = new asn1js.OctetString({ valueHex: subjKeyIdBuffer });
+
+    certificate.extensions.push(new pkijs.Extension({
+      extnID: "2.5.29.14",
+      critical: false,
+      extnValue: subjKeyId.toBER(false),
+      parsedValue: subjKeyId // Parsed value for well-known extensions
+    }));
+    //endregion "SubjectKeyIdentifier" extension
+
+    /* COULD NOT GET IT WORKING
+        //region "AuthorityKeyIdentifier" extension
+        if (issuerData && issuerData.certificate) {
+
+          let issuerSubjKeyExt = null;
+
+          let extLength = issuerData.certificate.extensions.length;
+          for (var i = 0; i < extLength; i++) {
+            let ext = issuerData.certificate.extensions[i];
+            if (ext.extnID == "2.5.29.14") {
+              issuerSubjKeyExt = ext;
+              break;
+            }
+          }
+
+          if (issuerSubjKeyExt) {
+
+            const asn1 = asn1js.fromBER(issuerSubjKeyExt.extnValue);
+
+            const authKeyIdentifier = new AuthorityKeyIdentifier({
+              keyIdentifier: new asn1js.OctetString({
+                //isHexOnly: true,
+                //valueHex: issuerSubjKeyExt.parsedValue.valueBlock.valueHex
+                value: new asn1js.OctetString({ valueHex: subjKeyIdBuffer })
+              })
+            });
+            // const authKeyIdentifier = new AuthorityKeyIdentifier({
+            // 	//keyIdentifier: new asn1js.OctetString({ valueHex: subjKeyIdBuffer })
+
+            // });
+
+            certificate.extensions.push(new Extension({
+              extnID: "2.5.29.35",
+              critical: false,
+              extnValue: authKeyIdentifier.toSchema().toBER(false),
+              parsedValue: authKeyIdentifier // Parsed value for well-known extensions
+            }));
+          }
+        }
+        //endregion "AuthorityKeyIdentifier" extension
+    */
+    //endregion Extensions
+  });
+  //region Fill in cert data
+
+
+  //region Signing final certificate
+  sequence = sequence.then(() => {
+      let signerKey = (issuerData && issuerData.privateKey) ? issuerData.privateKey : privateKey;
+      //console.log(signerKey)
+      return certificate.sign(signerKey, (certData.algorithms && certData.algorithms.hashAlg) ? certData.algorithms.hashAlg : defaultAlgorithms.hashAlg)
+    },
+    error => Promise.reject(`Error during exporting public key: ${error}`));
+  //endregion
+
+  //region Encode and store certificate
+  sequence = sequence.then(() =>
+  {
+    //console.log(certificate)
+    certificateBuffer = certificate.toSchema(true).toBER(false);
+  }, error => Promise.reject(`Error during signing: ${error}`));
+  //endregion
+
+  //region Exporting public key
+  sequence = sequence.then(() =>
+    crypto.exportKey("spki", publicKey)
+  );
+  //endregion
+
+  //region Store exported public key on Web page
+  sequence = sequence.then(result =>
+  {
+    publicKeyBuffer = result;
+  }, error => Promise.reject(`Error during exporting of public key: ${error}`));
+  //endregion
+
+  //region Exporting private key
+  sequence = sequence.then(() =>
+    crypto.exportKey("pkcs8", privateKey)
+  );
+  //endregion
+
+  //region Store exported key on Web page
+  sequence = sequence.then(result =>
+  {
+    privateKeyBuffer = result;
+  }, error => Promise.reject(`Error during exporting of private key: ${error}`));
+  //endregion
+
+  return sequence.then(() => {
+
+    const result = {
+      certificate: certificate,
+      certificatePEM: encodePEM(certificateBuffer, "CERTIFICATE"),
+      publicKey: publicKey,
+      publicKeyPEM: encodePEM(publicKeyBuffer, "PUBLIC KEY"),
+      privateKey: privateKey,
+      privateKeyPEM: encodePEM(privateKeyBuffer, "PRIVATE KEY")
+    }
+    return result;
+  });
+}
+
+function formatPEM(pemString) {
+  const lineWidth = 64;
+  let resultString = "";
+  let start = 0;
+  let piece = "";
+  while ( (piece = pemString.substring(start, start + lineWidth)).length > 0 ) {
+    start += lineWidth;
+    resultString += piece + '\r\n'
+  }
+  return resultString;
+}
+
+function encodePEM(buffer, label) {
+  const bufferString = String.fromCharCode.apply(null, new Uint8Array(buffer));
+
+  const header = `-----BEGIN ${label}-----\r\n`;
+  const base64formatted = formatPEM(window.btoa(bufferString));
+  const footer = `-----END ${label}-----\r\n`;
+  const resultString = header + base64formatted + footer;
+
+  return resultString;
+}
+
+function decodePEM(pemString) {
+  const pemStripped = pemString.replace(/(-----(BEGIN|END) [a-zA-Z ]*-----|\r|\n)/g, '');
+  const pemDecoded = window.atob(pemStripped);
+  const buffer = pvutils.stringToArrayBuffer(pemDecoded);
+  return buffer;
+}
+
+//*********************************************************************************
+function parseCertificate(certificatePEM) {
+  const certificateBuffer = decodePEM(certificatePEM);
+  const asn1 = asn1js.fromBER(certificateBuffer);
+  const certificate = new pkijs.Certificate({ schema: asn1.result });
+  return certificate;
+}
+
+//*********************************************************************************
+function parsePublicKey(publicKeyPEM) {
+  const publicKeyBuffer = decodePEM(publicKeyPEM);
+  const crypto = pkijs.getCrypto();
+  const publicKeyPromise = crypto.importKey(
+    "spki",
+    publicKeyBuffer,
+    {   //these are the algorithm options
+      name: "RSASSA-PKCS1-v1_5",
+      hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
+    },
+    true,
+    ["verify"]
+  );
+  return publicKeyPromise;
+}
+
+//*********************************************************************************
+function encryptMessage(message, password, label) {
+  const buffer = pvutils.stringToArrayBuffer(message);
+  const secret = pvutils.stringToArrayBuffer(password);
+
+  const enveloped = new pkijs.EnvelopedData();
+  enveloped.addRecipientByPreDefinedData(secret, {}, AES_encryptionVariant_Password);
+  return enveloped.encrypt(encryptionAlgorithm, buffer).
+  then(
+    () => {
+      const content = new pkijs.ContentInfo();
+      content.contentType = OID_PKCS7_EnvelopedData;
+      content.content = enveloped.toSchema();
+      const ber = content.toSchema().toBER(false);
+      return encodePEM(ber, label)
+    },
+    error => Promise.reject(`encryption error: ${error}`)
+  )
+}
+
+//*********************************************************************************
+function decryptMessage(message, password) {
+  const secret = pvutils.stringToArrayBuffer(password);
+  const buffer = decodePEM(message);
+
+  const asn1 = asn1js.fromBER(buffer);
+  const content = new pkijs.ContentInfo({schema: asn1.result});
+  const enveloped = new pkijs.EnvelopedData({schema: content.content});
+  return enveloped.decrypt(0, {preDefinedData: secret}).then(result => {
+    return pvutils.arrayBufferToString(result);
+  }).catch(() => {
+    throw("Wrong pincode")
+  })
+}
+
+//*********************************************************************************
+function parsePrivateKey(privateKeyPEM) {
+  const privateKeyBuffer = decodePEM(privateKeyPEM);
+  const crypto = pkijs.getCrypto();
+  const privateKeyPromise = crypto.importKey(
+    "pkcs8",
+    privateKeyBuffer,
+    {   //these are the algorithm options
+      name: "RSASSA-PKCS1-v1_5",
+      hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
+    },
+    true,
+    ["sign"]
+  );
+  return privateKeyPromise;
+}
+
+
+function createPassportCertificate(commonNameArg) {
+  const certData = {
+    algorithms: {
+      hashAlg: "SHA-256",
+      signAlg: "RSASSA-PKCS1-v1_5",
+      keyLength: 2048
+    },
+    //keyPair: generateKeys(), //optional , if provided must be object or promise that resolves to object {publicKey, prvateKey}. If it is not provided, new ones are generated automatically
+    subject: {
+      commonName: commonNameArg + "-userdevice", //optional for leaf, recommended for CA
+      country: "CH", //optional for leaf, recommended for CA
+      locality: "Zug", //optional for leaf, recommended for CA
+      state: "Zug", //optional for leaf, recommended for CA
+      organization: "Vereign AG", //optional for leaf, recommended for CA
+      organizationUnit:"Business Dep", //optional for leaf, recommended for CA
+      //email: "damyan.mitev@vereign.com", // added to DN and Subject Alternative Name extension. Optional for CA. Mandatory for leaf certificate, used for email protection
+      //url: "www.vereign.com" // optional url, recommended for CA, added to Subject Alternative Name extension
+    },
+    validity: {
+      //notBefore: new Date() // optional, defaults to today at 00:00:00
+      //notAfter: new Date()  // optional, defaults to notBefore + validYears at 23:59:59
+      validYears: 5 //optional, defaults to 1
+    },
+    isCA: true // optional flag denoting if this is CA certificate or leaf certificate, defaults to false
+  }
+
+  return createCertificate(certData, null)
+}
+
+function createOneTimePassportCertificate(commonNameArg, emailArg, privateKeyIssuerArg, certicateIssuerArg) {
+  var certData = null
+  if(emailArg != null && emailArg != "") {
+    certData = {
+      algorithms: {
+        hashAlg: "SHA-256",
+        signAlg: "RSASSA-PKCS1-v1_5",
+        keyLength: 2048
+      },
+      //keyPair: generateKeys(), //optional , if provided must be object or promise that resolves to object {publicKey, prvateKey}. If it is not provided, new ones are generated automatically
+      subject: {
+        commonName: commonNameArg + "-onetime", //optional for leaf, recommended for CA
+        country: "CH", //optional for leaf, recommended for CA
+        locality: "Zug", //optional for leaf, recommended for CA
+        state: "Zug", //optional for leaf, recommended for CA
+        organization: "Vereign AG", //optional for leaf, recommended for CA
+        organizationUnit:"Business Dep", //optional for leaf, recommended for CA
+        email: emailArg, // added to DN and Subject Alternative Name extension. Optional for CA. Mandatory for leaf certificate, used for email protection
+        //url: "www.vereign.com" // optional url, recommended for CA, added to Subject Alternative Name extension
+      },
+      validity: {
+        //notBefore: new Date() // optional, defaults to today at 00:00:00
+        //notAfter: new Date()  // optional, defaults to notBefore + validYears at 23:59:59
+        validYears: 5 //optional, defaults to 1
+      },
+      isCA: false // optional flag denoting if this is CA certificate or leaf certificate, defaults to false
+    }
+  } else {
+    certData = {
+      algorithms: {
+        hashAlg: "SHA-256",
+        signAlg: "RSASSA-PKCS1-v1_5",
+        keyLength: 2048
+      },
+      //keyPair: generateKeys(), //optional , if provided must be object or promise that resolves to object {publicKey, prvateKey}. If it is not provided, new ones are generated automatically
+      subject: {
+        commonName: commonNameArg + "-onetime", //optional for leaf, recommended for CA
+        country: "CH", //optional for leaf, recommended for CA
+        locality: "Zug", //optional for leaf, recommended for CA
+        state: "Zug", //optional for leaf, recommended for CA
+        organization: "Vereign AG", //optional for leaf, recommended for CA
+        organizationUnit:"Business Dep", //optional for leaf, recommended for CA
+        //email: emailArg, // added to DN and Subject Alternative Name extension. Optional for CA. Mandatory for leaf certificate, used for email protection
+        //url: "www.vereign.com" // optional url, recommended for CA, added to Subject Alternative Name extension
+      },
+      validity: {
+        //notBefore: new Date() // optional, defaults to today at 00:00:00
+        //notAfter: new Date()  // optional, defaults to notBefore + validYears at 23:59:59
+        validYears: 5 //optional, defaults to 1
+      },
+      isCA: false // optional flag denoting if this is CA certificate or leaf certificate, defaults to false
+    }
+  }
+
+  return parsePrivateKey(privateKeyIssuerArg).then(privateKeyDecoded => {
+    const issuerData = {
+      certificate: parseCertificate(certicateIssuerArg),// vereignCACertPEM),
+      privateKey: privateKeyDecoded
+    }
+    return createCertificate(certData, issuerData);
+    //console.log(vereignIntermediateKey)
+  });
+}
+
+function download(filename, contentType, text) {
+  var element = document.createElement('a');
+  element.setAttribute('href', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(text));
+  element.setAttribute('download', filename);
+
+  element.style.display = 'none';
+  document.body.appendChild(element);
+
+  element.click();
+
+  document.body.removeChild(element);
+}
+
+function arrayBufferToBase64Formatted(buffer) {
+  const bufferString = String.fromCharCode.apply(null, new Uint8Array(buffer));
+  const base64formatted = formatPEM(window.btoa(bufferString));
+  return base64formatted;
+}
+
+function arrayBufferToBase64(buffer) {
+  const bufferString = String.fromCharCode.apply(null, new Uint8Array(buffer));
+  const base64 = window.btoa(bufferString);
+  return base64;
+}
+
+const newline = /\r\n|\r|\n/g;
+
+function capitalizeFirstLetter(string) {
+  if(string == "id") {
+    return "ID"
+  }
+
+  if(string == "mime") {
+    return "MIME";
+  }
+
+  return string.charAt(0).toUpperCase() + string.slice(1);
+}
+
+function capitalizeHeader(string) {
+  result = ""
+  tokens = string.split("-")
+  for(var i = 0; i < tokens.length; i++) {
+    result += capitalizeFirstLetter(tokens[i])
+    if(i != tokens.length - 1) {
+      result += "-"
+    }
+  }
+
+  return result
+}
+
+function signEmail(mime, signingCert, certificateChain, privateKey) {
+  signingCertObj = parseCertificate(signingCert)
+  certificateChainObj = []
+  certificateChainObj[0] = parseCertificate(signingCert)
+  for(var i = 0; i < certificateChain.length; i++) {
+    certificateChainObj[i + 1] = parseCertificate(certificateChain[i])
+  }
+  //console.log(certificateChainObj)
+
+  return parsePrivateKey(privateKey).then(privateKeyDecoded => {
+
+    return signEmailObjects(mime, signingCertObj, certificateChainObj, privateKeyDecoded);
+    //console.log(vereignIntermediateKey)
+  });
+}
+
+function signEmailObjects(mime, signingCert, certificateChain, privateKey) {
+
+  //region Get a "crypto" extension
+  const crypto = pkijs.getCrypto();
+  if (typeof crypto === "undefined") {
+    return Promise.reject("No WebCrypto extension found");
+  }
+  //endregion Get a "crypto" extension
+
+  let template =
+    `{{headers}}Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="{{boundary}}"
+MIME-Version: 1.0
+
+This is a cryptographically signed message in MIME format.
+
+--{{boundary}}
+{{mime}}
+--{{boundary}}
+Content-Type: application/pkcs7-signature; name="smime.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime.p7s"
+Content-Description: S/MIME Cryptographic Signature
+
+{{signature}}
+--{{boundary}}--
+
+Vereign - Authentic Communication
+`.replace(newline, '\r\n');
+
+  const detachedSignature = true;
+  const addExt = true;
+  const hashAlg = "SHA-256";
+  let cmsSignedSimpl;
+
+  var mimeHeadersTitles = [
+    "Content-Type",
+    "Content-Transfer-Encoding",
+    "Content-ID",
+    "Content-Description",
+    "Content-Disposition",
+    "Content-Language",
+    "Content-Location"
+  ]
+
+  mime = mime.replace(newline, '\r\n');
+
+  let newHeaderLines = ""
+  let headersEnd = mime.indexOf('\r\n\r\n') //the first empty line
+
+  if (headersEnd < 0 && mime.startsWith('\r\n')) {
+
+    mime = mime.substring(2) //should not happen
+
+  } else
+  if (headersEnd >= 0) {
+
+    let mimeHeaders = {}
+    let mimeBody = mime.substring(headersEnd + 4)
+
+    let mimeHeadersStr = mime.substring(0, headersEnd)
+
+    let headers = libmime.decodeHeaders(mimeHeadersStr)
+    for (var i = 0; i < mimeHeadersTitles.length; i++) {
+      let key = mimeHeadersTitles[i].toLowerCase()
+      if(key in headers) {
+        mimeHeaders[key] = headers[key]
+        delete headers[key]
+      }
+    }
+
+    for(let key in headers) {
+      if(!(key === "" || key === "MIME-Version".toLowerCase())) { //we have MIME-Version in the template
+        newHeaderLines += capitalizeHeader(key) + ": " + headers[key] + '\r\n';
+      }
+    }
+
+    let newMimeHeaderLines = ""
+    for(let key in mimeHeaders) {
+      if(!(key === "")) {
+        newMimeHeaderLines += capitalizeHeader(key) + ": " + mimeHeaders[key] + '\r\n';
+      }
+    }
+
+    if (newMimeHeaderLines === "") {
+      newMimeHeaderLines = 'Content-Type: text/plain\r\n' //should not happen
+    }
+
+    mime = newMimeHeaderLines + '\r\n' + mimeBody
+  }
+
+  let dataBuffer = pvutils.stringToArrayBuffer(mime);
+
+  let sequence = Promise.resolve();
+
+  //region Check if user wants us to include signed extensions
+  if(addExt)
+  {
+    //region Create a message digest
+    sequence = sequence.then(
+      () => crypto.digest({ name: hashAlg }, new Uint8Array(dataBuffer))
+    );
+    //endregion
+
+    //region Combine all signed extensions
+    sequence = sequence.then(
+      messageHash =>
+      {
+        const signedAttr = [];
+        /*
+                1.2.840.113549.1.9.1 - e-mailAddress
+                1.2.840.113549.1.9.2 - PKCS-9 unstructuredName
+                1.2.840.113549.1.9.3 - contentType
+                1.2.840.113549.1.9.4 - messageDigest
+                1.2.840.113549.1.9.5 - Signing Time
+                1.2.840.113549.1.9.6 - counterSignature
+        */
+        signedAttr.push(new pkijs.Attribute({
+          type: OID_PKCS9_ContentType, //contentType
+          values: [
+            new asn1js.ObjectIdentifier({ value: OID_PKCS7_Data}) //data
+          ]
+          /*
+                      1.2.840.113549.1.7.1 - data
+                      1.2.840.113549.1.7.2 - signedData
+                      1.2.840.113549.1.7.3 - envelopedData
+                      1.2.840.113549.1.7.4 - signedAndEnvelopedData
+                      1.2.840.113549.1.7.5 - digestedData
+                      1.2.840.113549.1.7.6 - encryptedData
+          */
+        })); // contentType
+
+        signedAttr.push(new pkijs.Attribute({
+          type: OID_PKCS9_SigningTime, //Signing Time
+          values: [
+            new asn1js.UTCTime({ valueDate: new Date() })
+          ]
+        })); // signingTime
+
+        signedAttr.push(new pkijs.Attribute({
+          type: OID_PKCS9_MessageDigest, //messageDigest
+          values: [
+            new asn1js.OctetString({ valueHex: messageHash })
+          ]
+        })); // messageDigest
+
+        return signedAttr;
+      }
+    );
+    //endregion
+  }
+  //endregion
+
+  //region Initialize CMS Signed Data structures and sign it
+  sequence = sequence.then(
+    signedAttr =>
+    {
+      cmsSignedSimpl = new pkijs.SignedData({
+        version: 1,
+        encapContentInfo: new pkijs.EncapsulatedContentInfo({
+          eContentType: OID_PKCS7_Data // "data" content type
+        }),
+        signerInfos: [
+          new pkijs.SignerInfo({
+            version: 1,
+            sid: new pkijs.IssuerAndSerialNumber({
+              issuer: signingCert.issuer,
+              serialNumber: signingCert.serialNumber
+            })
+          })
+        ],
+        certificates: certificateChain //array
+      });
+
+      if(addExt)
+      {
+        cmsSignedSimpl.signerInfos[0].signedAttrs = new pkijs.SignedAndUnsignedAttributes({
+          type: 0,
+          attributes: signedAttr
+        });
+      }
+
+      if(detachedSignature === false)
+      {
+        const contentInfo = new pkijs.EncapsulatedContentInfo({
+          eContent: new asn1js.OctetString({ valueHex: dataBuffer })
+        });
+
+        cmsSignedSimpl.encapContentInfo.eContent = contentInfo.eContent;
+
+        return cmsSignedSimpl.sign(privateKey, 0, hashAlg);
+      }
+
+      return cmsSignedSimpl.sign(privateKey, 0, hashAlg, dataBuffer);
+    }
+  );
+  //endregion
+
+  //region Create final result
+  sequence = sequence.then(
+    (result) =>
+    {
+      const cmsSignedSchema = cmsSignedSimpl.toSchema(true);
+
+      const cmsContentSimp = new pkijs.ContentInfo({
+        contentType: OID_PKCS7_SignedData, //signedData
+        content: cmsSignedSchema
+      });
+
+      const _cmsSignedSchema = cmsContentSimp.toSchema();
+
+      //region Make length of some elements in "indefinite form"
+      _cmsSignedSchema.lenBlock.isIndefiniteForm = true;
+
+      const block1 = _cmsSignedSchema.valueBlock.value[1];
+      block1.lenBlock.isIndefiniteForm = true;
+
+      const block2 = block1.valueBlock.value[0];
+      block2.lenBlock.isIndefiniteForm = true;
+
+      if(detachedSignature === false)
+      {
+        const block3 = block2.valueBlock.value[2];
+        block3.lenBlock.isIndefiniteForm = true;
+        block3.valueBlock.value[1].lenBlock.isIndefiniteForm = true;
+        block3.valueBlock.value[1].valueBlock.value[0].lenBlock.isIndefiniteForm = true;
+      }
+      //endregion
+
+      const cmsSignedBuffer = _cmsSignedSchema.toBER(false);
+      return cmsSignedBuffer;
+    },
+    error => Promise.reject(`Erorr during signing of CMS Signed Data: ${error}`)
+  );
+  //endregion
+
+  sequence = sequence.then(
+    (cmsSignedBuffer) =>
+    {
+      let signature = arrayBufferToBase64Formatted(cmsSignedBuffer);
+      let boundary = makeBoundary()
+
+      template = template.replace(/{{boundary}}/g, boundary)
+      template = template.replace("{{signature}}", signature)
+      template = template.replace("{{headers}}", newHeaderLines)
+      template = template.replace("{{mime}}", mime)
+
+      //template = template.replace(newline, '\r\n')
+      return template
+    }
+  );
+
+  return sequence;
+}
+
+function makeBoundary() {
+  let len = 20 + Math.random() * 20
+  return 'W0RyLiBEYW15YW4gTWl0ZXZd--' + makeid(len)
+}
+
+function makeid(len) {
+  if (typeof len === 'undefined') {
+    len = 10
+  }
+  var text = "";
+  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+  for (var i = 0; i < len; i++)
+    text += possible.charAt(Math.floor(Math.random() * possible.length));
+
+  return text;
+}
+
+function CryptoData() {
+}
+
+CryptoData.prototype.set = function(obj) {
+  for(var member in obj) {
+    this[member] = JSON.parse(JSON.stringify(obj[member]))
+  }
+}
+
+CryptoData.prototype.serialize = function() {
+  return JSON.stringify(this)
+}
+
+CryptoData.prototype.deserialize = function(serialized) {
+  var obj = JSON.parse(serialized)
+  this.set(obj)
+}
+
+CryptoData.prototype.setPublicKey = function(publicKey) {
+  this["publicKey"] = publicKey
+}
+
+CryptoData.prototype.getPublicKey = function() {
+  return this["publicKey"]
+}
+
+CryptoData.prototype.setPrivateKey = function(privateKey) {
+  this["privateKey"] = privateKey
+}
+
+CryptoData.prototype.getPrivateKey = function() {
+  return this["privateKey"]
+}
+
+CryptoData.prototype.setx509Certificate = function(x509Certificate) {
+  this["x509Certificate"] = x509Certificate
+}
+
+CryptoData.prototype.getx509Certificate = function() {
+  return this["x509Certificate"]
+}
+
+CryptoData.prototype.setKeyUUID = function(keyUUID) {
+  this["keyUUID"] = keyUUID
+}
+
+CryptoData.prototype.getKeyUUID = function() {
+  return this["keyUUID"]
+}
+
+CryptoData.prototype.setChain = function(chain) {
+  this["chain"] = chain
+}
+
+CryptoData.prototype.getChain = function() {
+  return this["chain"]
+}
+
+function Identity() {
+}
+
+Identity.prototype.set = function(obj) {
+  for(var member in obj) {
+    this[member] = JSON.parse(JSON.stringify(obj[member]))
+  }
+}
+
+Identity.prototype.serialize = function() {
+  return JSON.stringify(this)
+}
+
+Identity.prototype.deserialize = function(serialized) {
+  var obj = JSON.parse(serialized)
+  this.set(obj)
+}
+
+Identity.prototype.setAuthentication = function(cryptoData) {
+  this["authentication"] = cryptoData
+}
+
+Identity.prototype.getAuthentication = function() {
+  return this["authentication"]
+}
+
+Identity.prototype.setPinCode = function(pinCode) {
+  this["pinCode"] = pinCode
+}
+
+Identity.prototype.getPinCode = function() {
+  return this["pinCode"]
+}
+
+Identity.prototype.setPassport = function(passportUUID, cryptoData) {
+  if(this["passports"] === undefined || this["passports"] === null) {
+    this["passports"] = {}
+  }
+
+  this["passports"][passportUUID] = cryptoData
+}
+
+Identity.prototype.getPassport = function(passportUUID) {
+  if(this["passports"] === undefined || this["passports"] === null) {
+    this["passports"] = {}
+  }
+
+  return this["passports"][passportUUID]
+}
+
+var identityColors = ["#994392", "#cb0767", "#e51d31", "#ec671b", "#fab610"]
+
+function getNextColor() {
+  var colorIndex = localStorage.getItem("colorIndex");
+  if (colorIndex == null || colorIndex == "") {
+    colorIndex = 0
+  }
+
+  var color = identityColors[colorIndex]
+
+  colorIndex++;
+
+  colorIndex = colorIndex % identityColors.length
+
+  localStorage.setItem("colorIndex", colorIndex)
+
+  return color
+}
+
+function setKeyForUUID(uuid, key) {
+  var storedIdentityForUuid = localStorage.getItem("keyperuuid/" + uuid)
+  if(storedIdentityForUuid != key && storedIdentityForUuid != null && storedIdentityForUuid != "") {
+    destroyIdentityFromLocalStorage(storedIdentityForUuid)
+  }
+
+  localStorage.setItem("keyperuuid/" + uuid, key)
+}
+
+function getColorForIdentity(key) {
+  var storedColor = localStorage.getItem("colors/" + key)
+
+  if(storedColor == null || storedColor == "") {
+    storedColor = getNextColor()
+    console.log("Setting new color: " + storedColor)
+    localStorage.setItem("colors/" + key, storedColor)
+  }
+
+  return storedColor
+}
+
+function setIdentityInLocalStorage(identityToStore, extendKey = true) {
+  //console.log(getStack())
+  var pinCode = identityToStore.pinCode;
+  const serializedIdentity = JSON.stringify(identityToStore);
+  const key = identityToStore.authentication.publicKey;
+
+  if(pinCode == null || pinCode == "") {
+    pinCode = getPincode(key)
+  }
+
+  if(pinCode == null || pinCode == "") {
+    console.log("Can not set identity")
+    return null;
+  }
+
+  return encryptMessage(serializedIdentity, pinCode, "identity").then((encryptedIdentity) => {
+    var success = true
+    if(extendKey === true) {
+      success = extendPinCodeTtl(key, pinCode)
+    }
+    if (success == true) {
+      localStorage.setItem(key, encryptedIdentity);
+      let serializedIdentitiesList = localStorage.getItem("identities");
+      let identities = JSON.parse(serializedIdentitiesList);
+      identities[key] = true;
+
+      localStorage.setItem("identities", JSON.stringify(identities))
+    } else {
+      console.log("Can not extend pincode ttl")
+    }
+  });
+}
+
+function getProfileData(identity) {
+  return new Penpal.Promise(executeResultUpper => {
+    executeRestfulFunction("private", viamApi,
+      viamApi.identityGetIdentityProfileData).then(executeResult => {
+      if(executeResult.code == "200") {
+        console.log("In promise")
+        console.log(executeResult)
+        var listItem = {};
+
+        console.log(identity)
+        listItem.identityColor = getColorForIdentity(identity.authentication.publicKey)
+        listItem.initials = executeResult.data.initials
+
+        if(listItem.initials === null || listItem.initials === "") {
+          listItem.initials = "JD";
+        }
+        console.log("Item")
+        console.log(listItem)
+        localStorage.setItem("profiles/" + identity.authentication.publicKey, JSON.stringify(listItem))
+        executeResultUpper(listItem)
+      } else {
+        executeResultUpper({})
+      }
+    });
+  });
+}
+
+function getIdentityFromLocalStorage(key, pinCode, extendTtl = true) {
+  const encryptedIdentity = localStorage.getItem(key);
+  if (encryptedIdentity == null) {
+    console.log("No such identity for public key")
+    return Promise.resolve(null)
+  }
+  return decryptMessage(encryptedIdentity, pinCode).then((serializedIdentity) => {
+    var parsedIdentity = JSON.parse(serializedIdentity);
+    parsedIdentity["pinCode"] = ""
+    //console.log(parsedIdentity)
+    if(extendTtl === true) {
+      var success = extendPinCodeTtl(key, pinCode)
+      if (success == true) {
+        return parsedIdentity
+      } else {
+        console.log("Can not extend pincode ttl")
+        return null
+      }
+    } else {
+      return parsedIdentity
+    }
+  });
+
+}
+
+function listIdentitiesFromLocalStorage() {
+  var serializedIdentitiesList = localStorage.getItem("identities")
+  var identities = JSON.parse(serializedIdentitiesList)
+  var identitiesResult = {}
+
+  for(var key in identities) {
+    var profile = JSON.parse(JSON.stringify(localStorage.getItem("profiles/" + key)))
+    console.log("Getting profile")
+    console.log(profile)
+    if(profile != null && profile != "") {
+      console.log("Setting profile for key: " + key)
+      //console.log(profile)
+      identitiesResult[key] = JSON.parse(profile)
+      //console.log(identitiesResult)
+    } else {
+      console.log("Setting empty key for profile: " + key)
+      identitiesResult[key] = {}
+      //console.log(identitiesResult)
+    }
+  }
+
+  console.log("In list identities from local storage")
+  console.log(identitiesResult)
+  return identitiesResult
+}
+
+function getStack() {
+  try {
+    throw new Error();
+  } catch(e) {
+    return e.stack;
+  }
+}
+
+function extendPinCodeTtl(key, pinCode) {
+  //console.log("Extending pincode ttl")
+  //console.log(getStack())
+  //console.log("Extending pincode ttl for key: " + key)
+  //console.log(pinCode)
+  if(pinCode == null || pinCode == "") {
+    var now = new Date();
+    var nowMillis = now.getTime();
+    var ttl = window.sessionStorage.getItem("pincodettls/" + key);
+    if (ttl == null || ttl == "" || nowMillis >= parseInt(ttl)) {
+      clearPinCodeTtl(key)
+      return false
+    } else {
+      var ttl = now.getTime() + 10 * 60 * 1000;
+      window.sessionStorage.setItem("pincodettls/" + key, ttl);
+    }
+  } else {
+    var now = new Date();
+    var ttl = now.getTime() + 10 * 60 * 1000;
+    window.sessionStorage.setItem("pincodettls/" + key, ttl);
+    window.sessionStorage.setItem("pincodes/" + key, pinCode);
+  }
+
+  return true;
+}
+
+function clearPinCodeTtl(key) {
+  //console.log("Clearing ttl for key: " + key)
+  window.sessionStorage.removeItem("pincodettls/" + key)
+  window.sessionStorage.removeItem("pincodes/" + key)
+}
+
+function getPincode(key) {
+  var now = new Date();
+  var nowMillis = now.getTime();
+  var ttl = window.sessionStorage.getItem("pincodettls/" + key);
+  if (ttl == null || ttl == "") {
+    return null
+  } else {
+    if(nowMillis >= parseInt(ttl)) {
+      clearPinCodeTtl(key)
+      return null
+    } else {
+      return window.sessionStorage.getItem("pincodes/" + key);
+    }
+  }
+}
+
+function createEvent(actionId, type, payloads) {
+  return {
+    "actionID": actionId,
+    "type": type,
+    "stamp": new Date().getTime(),
+    "payloads" : payloads
+  }
+}
+
+function destroyIdentityFromLocalStorage(key) {
+  localStorage.removeItem(key)
+  localStorage.removeItem("profiles/" + key)
+  localStorage.removeItem("colors/" + key)
+
+  var serializedIdentitiesList = localStorage.getItem("identities")
+
+  var identities = JSON.parse(serializedIdentitiesList)
+
+  identities[key] = null
+
+  delete identities[key]
+
+  localStorage.setItem("identities", JSON.stringify(identities))
+}
+
+window.loadedIdentities = {}
+window.viamApi = new ViamAPI();
+window.viamAnonymousApi = new ViamAPI();
+window.currentlyAuthenticatedIdentity = null
+window.currentlyLoadedIdentity = null
+window.lastTimeGetProfile = 0
+
+function executeRestfulFunction(type, that, fn, ...args) {
+  if(type == "private") {
+    return new Penpal.Promise(executeResult => {
+      fn.apply(that, args).then((response) => {
+        if (response.data.code == "400" && response.data.status == "Bad session") {
+          console.log("Trying to login again")
+          if(currentlyAuthenticatedIdentity != "" && currentlyAuthenticatedIdentity != null) {
+            viamApi.identityLogin("previousaddeddevice").then((response1) => {
+              if (response1.data.code == "200") {
+                //console.log(response.data.data)
+                var uuid = response1.data.data["Uuid"]
+                var token = response1.data.data["Session"]
+                //console.log(uuid + " " + token)
+                viamApi.setSessionData(uuid, token)
+                localStorage.setItem("uuid", uuid)
+                localStorage.setItem("token", token)
+                localStorage.setItem("authenticatedIdentity", currentlyAuthenticatedIdentity.authentication.publicKey)
+                currentlyAuthenticatedIdentity = loadedIdentities[currentlyAuthenticatedIdentity.authentication.publicKey]
+                setKeyForUUID(uuid, currentlyAuthenticatedIdentity.authentication.publicKey)
+                lastTimeGetProfile = 0;
+                fn.apply(null, args).then((response2) => {
+                  executeResult(response2.data)
+                });
+              } else {
+                executeResult(response1.data)
+              }
+            });
+          } else {
+            if(currentlyLoadedIdentity != "" && currentlyLoadedIdentity != null) {
+              viamApi.identityLogin("previousaddeddevice").then((response1) => {
+                if (response1.data.code == "200") {
+                  //console.log(response.data.data)
+                  var uuid = response1.data.data["Uuid"]
+                  var token = response1.data.data["Session"]
+                  //console.log(uuid + " " + token)
+                  viamApi.setSessionData(uuid, token)
+                  localStorage.setItem("uuid", uuid)
+                  localStorage.setItem("token", token)
+                  localStorage.setItem("authenticatedIdentity", currentlyLoadedIdentity.authentication.publicKey)
+                  currentlyAuthenticatedIdentity = loadedIdentities[currentlyLoadedIdentity.authentication.publicKey]
+                  setKeyForUUID(uuid, currentlyLoadedIdentity.authentication.publicKey)
+                  lastTimeGetProfile = 0;
+                  fn.apply(null, args).then((response2) => {
+                    executeResult(response2.data)
+                  });
+                } else {
+                  executeResult(response1.data)
+                }
+              });
+            } else {
+              executeResult(response.data)
+            }
+          }
+        } else {
+          executeResult(response.data)
+        }
+      });
+    });
+  } else {
+    return new Penpal.Promise(executeResult => {
+      fn.apply(that, args).then((response) => {
+        executeResult(response.data)
+      });
+    });
+  }
+}
+
+function loadIdentityInternal(identityKey, pinCode) {
+  return new Penpal.Promise(result => {
+    console.log("Loading identity with pincode: " + pinCode)
+    getIdentityFromLocalStorage(identityKey, pinCode).then((loadedIdentity) => {
+      if (loadedIdentity == null) {
+        result({
+          "data": "",
+          "code": "400",
+          "status": "Can not load identity"
+        })
+      }
+      var copiedIdentity = JSON.parse(JSON.stringify(loadedIdentity))
+      loadedIdentities[identityKey] = loadedIdentity
+
+      if (identityKey === localStorage.getItem("authenticatedIdentity")) {
+        currentlyAuthenticatedIdentity = copiedIdentity
+        viamApi.setIdentity(identityKey)
+        var uuid = localStorage.getItem("uuid")
+        var token = localStorage.getItem("token")
+        //console.log("Loading " + uuid + " " + token)
+        viamApi.setSessionData(uuid, token)
+      }
+
+      //console.log("Set loaded identity in load identity")
+      currentlyLoadedIdentity = copiedIdentity
+      viamAnonymousApi.setIdentity(currentlyLoadedIdentity.authentication.publicKey)
+
+      copiedIdentity.pinCode = ""
+      copiedIdentity.authentication.privateKey = ""
+
+      result({
+        "data": copiedIdentity,
+        "code": "200",
+        "status": "Identity loaded"
+      })
+    }).catch((e) => {
+      result({
+        "data": "",
+        "code": "400",
+        "status": "Can not load entity:" + e
+      })
+    })
+  });
+}
+
+function changeIdentityPinCodeInternal(key, oldPinCode, newPinCode) {
+
+  return new Penpal.Promise(result => {
+    getIdentityFromLocalStorage(key, oldPinCode, false).then((identity) => {
+
+      identity.pinCode = newPinCode;
+
+      console.log("Storing identity with pincode: " + identity.pinCode)
+      setIdentityInLocalStorage(identity).then(() => {
+      }).catch((e) => {
+        result({
+          "data": "",
+          "code": "400",
+          "status": "Cannot store identity " + e
+        });
+      });
+    });
+  });
+}
+
+function getCertificateForPassport(passportUUID, internal) {
+
+  return new Penpal.Promise(certificateResult => {
+    if (currentlyAuthenticatedIdentity === null) {
+      return {"data" : "",
+        "code" : "400",
+        "status" : "Identity not authenticated"
+      }
+    }
+
+    var passportIdentity = new Identity()
+    passportIdentity.set(currentlyAuthenticatedIdentity)
+    //console.log("Getting: " + passportUUID)
+    //console.log(identity)
+    var passport = passportIdentity.getPassport(passportUUID)
+    if(passport === undefined || passport === null) {
+      createPassportCertificate(passportUUID).then(function(keys){
+        var cryptoData = new CryptoData()
+        //console.log(keys)
+        cryptoData.setPublicKey(keys["publicKeyPEM"])
+        cryptoData.setPrivateKey(keys["privateKeyPEM"])
+        var certificate = keys["certificatePEM"]
+        //download("passportCertificateBeforeSigning.crt", "text/plain", certificate)
+        //console.log(certificate)
+        //cryptoData.setx509Certificate(keys["certificate"])
+        executeRestfulFunction("private", viamApi, viamApi.signSignCertificate, btoa(certificate), passportUUID).then(executeResult => {
+          if(executeResult.code == "200") {
+            var signedCertificate = atob(executeResult.data["SignedCertificate"])
+            //download("passportCertificateAfterSigning.crt", "text/plain", signedCertificate)
+            var keyUUID = executeResult.data["CertificateUUID"]
+            var encodedChain = executeResult.data["Chain"]
+            //download("rootCertificate.crt", "text/plain", atob(encodedChain[0]))
+
+            var chain = []
+
+            for(var i = 0; i < encodedChain.length; i++) {
+              chain.push(atob(encodedChain[i]))
+            }
+
+            //console.log("Chain from server")
+            //console.log(chain)
+            //console.log(signedCertificate)
+            //console.log(certificate)
+            //console.log(keyUUID)
+            cryptoData.setx509Certificate(signedCertificate)
+            cryptoData.setKeyUUID(keyUUID)
+            cryptoData.setChain(chain)
+
+            passportIdentity.setPassport(passportUUID, cryptoData)
+
+            getProfileData(passportIdentity).then(executeResult1 => {
+              console.log("Profile updated in set identity")
+              setIdentityInLocalStorage(passportIdentity).then(() => {
+                currentlyAuthenticatedIdentity = passportIdentity
+                lastTimeGetProfile = 0;
+                //console.log("Set loaded identity in passport");
+                currentlyLoadedIdentity = passportIdentity
+                var copyOfCryptoData = JSON.parse(JSON.stringify(cryptoData))
+
+                if (internal === false) {
+                  copyOfCryptoData["privateKey"] = ""
+                }
+
+                certificateResult({
+                  "data": copyOfCryptoData,
+                  "code": "200",
+                  "status": "Certificate got"
+                });
+              }).catch((e) => {
+                certificateResult({
+                  "data": "",
+                  "code": "400",
+                  "status": "Can not store certificate " + e
+                });
+              });
+            });
+          } else {
+            certificateResult(executeResult)
+          }
+        });
+      });
+    } else {
+      //console.log(passport)
+      var copyOfCryptoData = JSON.parse(JSON.stringify(passport))
+
+      if(internal === false) {
+        copyOfCryptoData["privateKey"] = ""
+      }
+
+      certificateResult({"data" : copyOfCryptoData,
+        "code" : "200",
+        "status" : "Certificate got"
+      });
+    }
+  });
+}
+
+const connection = Penpal.connectToParent({
+  // Methods child is exposing to parent
+  methods: {
+    createIdentity(pinCode) {
+      return new Penpal.Promise(result => {
+        createPassportCertificate(makeid()).then(function(keys){
+          var newIdentity = new Identity()
+          var cryptoData = new CryptoData()
+          cryptoData.setPublicKey(keys["publicKeyPEM"])
+          cryptoData.setPrivateKey(keys["privateKeyPEM"])
+          cryptoData.setx509Certificate(keys["certificatePEM"])
+          newIdentity.setAuthentication(cryptoData)
+          newIdentity.setPinCode(pinCode)
+
+          //console.log("Set loaded identity in createIdentity")
+          currentlyLoadedIdentity = newIdentity
+          loadedIdentities[newIdentity.authentication.publicKey] = newIdentity
+          extendPinCodeTtl(newIdentity.authentication.publicKey, pinCode)
+
+
+          viamAnonymousApi.setIdentity(newIdentity.authentication.publicKey)
+
+          result({"data" : newIdentity,
+            "code" : "200",
+            "status" : "Identity created"
+          })
+        });
+      })
+    },
+    listIdentities() {
+      return new Penpal.Promise(result => {
+        var identities = listIdentitiesFromLocalStorage()
+        console.log("Before return of identities")
+        console.log(identities)
+        result({"data" : identities,
+          "code" : "200",
+          "status" : "Identities listed"
+        })
+      });
+    },
+    loadIdentity(identityKey, pinCode) {
+      return loadIdentityInternal(identityKey, pinCode)
+    },
+    changeIdentityPinCode(key, oldPinCode, newPinCode) {
+      return changeIdentityPinCodeInternal(key, oldPinCode, newPinCode)
+    },
+    getIdentityProfile(identityKey) {
+      return new Penpal.Promise(result => {
+        serializedProfile = localStorage.getItem("profiles/" + identityKey)
+        if(serializedProfile == null || serializedProfile == "") {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Profile is empty"
+          });
+        } else {
+          result({"data" : JSON.parse(serializedProfile),
+            "code" : "200",
+            "status" : "Identities cleared"
+          })
+        }
+      });
+    },
+    clearIdentities() {
+      return new Penpal.Promise(result => {
+        var identitiesTemp = listIdentitiesFromLocalStorage()
+        //console.log(identitiesTemp.length)
+        for(var i in identitiesTemp) {
+          destroyIdentityFromLocalStorage(i)
+        }
+        result({"data" : "",
+          "code" : "200",
+          "status" : "Identities cleared"
+        })
+      });
+    },
+    register(registerIdentity, email, name, surname, family, phoneNumber) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity(registerIdentity.authentication.publicKey)
+
+        executeRestfulFunction("public", viamApi, viamApi.identityRegister, email, name,surname, family, phoneNumber).then(executeResult => {
+          console.log("Profile updated in set identity")
+
+          let sequence = Promise.resolve()
+          if (executeResult.code === "200") {
+            sequence = sequence.then(() => {
+                setIdentityInLocalStorage(registerIdentity)
+              }
+            )
+          }
+          sequence.then(() => {
+            result(executeResult);
+          }).catch((e) => {
+            result({
+              "data": "",
+              "code": "400",
+              "status": "Can not store identity: " + e
+            })
+          })
+        });
+      });
+    },
+    resendConfirmationCode(identity, identificatorArg) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity(identity.authentication.publicKey)
+
+        executeRestfulFunction("public", viamApi, viamApi.identityResendConfirmationCode,identificatorArg).then(executeResult => {
+          result(executeResult);
+        });
+      });
+    },
+    login(loginIdentity, mode, code, actionID) {
+      return new Penpal.Promise(result => {
+        if (loadedIdentities[loginIdentity.authentication.publicKey] === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          })
+        }
+
+        //console.log("After loaded check")
+
+        viamApi.setIdentity(loginIdentity.authentication.publicKey)
+
+        executeRestfulFunction("public", viamApi, viamApi.identityLogin, mode, code, actionID).then(executeResult => {
+          // console.log(executeResult)
+          //console.log(mode)
+          switch(mode) {
+            case "sms" : {
+              if (executeResult.code === "200") {
+                //console.log("In if")
+                var uuid = executeResult.data["Uuid"]
+                var token = executeResult.data["Session"]
+                viamApi.setSessionData(uuid, token)
+                localStorage.setItem("uuid", uuid)
+                localStorage.setItem("token", token)
+                localStorage.setItem("authenticatedIdentity",
+                  loginIdentity.authentication.publicKey)
+                setKeyForUUID(uuid, loginIdentity.authentication.publicKey)
+                currentlyAuthenticatedIdentity = loadedIdentities[loginIdentity.authentication.publicKey]
+                lastTimeGetProfile = 0;
+                delete executeResult.data["Uuid"]
+                delete executeResult.data["Session"]
+                getProfileData(loginIdentity).then(executeResult1 => {
+                  result(executeResult);
+                });
+              } else {
+                //console.log("In else")
+                result(executeResult);
+              }
+
+              break;
+            }
+
+            case "previousaddeddevice" : {
+              if (executeResult.code === "200") {
+                //console.log(response.data.data)
+                var uuid = executeResult.data["Uuid"]
+                var token = executeResult.data["Session"]
+                //console.log(uuid + " " + token)
+                viamApi.setSessionData(uuid, token)
+                localStorage.setItem("uuid", uuid)
+                localStorage.setItem("token", token)
+                localStorage.setItem("authenticatedIdentity",
+                  loginIdentity.authentication.publicKey)
+                setKeyForUUID(uuid, loginIdentity.authentication.publicKey)
+                currentlyAuthenticatedIdentity = loadedIdentities[loginIdentity.authentication.publicKey]
+                lastTimeGetProfile = 0;
+                delete executeResult.data["Uuid"]
+                delete executeResult.data["Session"]
+                getProfileData(loginIdentity).then(executeResult1 => {
+                  result(executeResult);
+                });
+              } else {
+                result(executeResult);
+              }
+
+              break;
+            }
+
+            case "newdevice" : {
+              if (executeResult.code === "200") {
+                //console.log(executeResult)
+                var actionID = executeResult.data["ActionID"]
+                var QrCode = executeResult.data["QrCode"]
+                //console.log(uuid + " " + token)
+                QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+                  executeResult.data["image"] = url
+                  //console.log(executeResult)
+                  result(executeResult);
+                })
+              } else {
+                //console.log(executeResult)
+                result(executeResult);
+              }
+              break;
+            }
+
+            default : {
+              result(executeResult);
+              break;
+            }
+          }
+        });
+      });
+    },
+    identityAddNewDevice() {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+
+        if (authenticationPublicKey === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        executeRestfulFunction("private", viamApi, viamApi.identityAddNewDevice).then(executeResult => {
+          if (executeResult.code == "200") {
+            //console.log(response.data.data)
+            var actionID = executeResult.data["ActionID"]
+            var QrCode = executeResult.data["QrCode"]
+            //console.log(uuid + " " + token)
+            QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+              executeResult.data["image"] = url
+              result(executeResult);
+            })
+          } else {
+            result(executeResult);
+          }
+        });
+      });
+    },
+    identityDestroyKeysForDevice(authenticationPublicKeyArg) {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        executeRestfulFunction("private", viamApi, viamApi.identityDestroyKeysForDevice, btoa(authenticationPublicKeyArg)).then(executeResult => {
+          result(executeResult);
+        });
+      });
+    },
+    logout() {
+      authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+      if (authenticationPublicKey === null) {
+        return {"data" : "",
+          "code" : "400",
+          "status" : "Identity not loaded"
+        }
+      }
+      if (loadedIdentities[authenticationPublicKey] === null) {
+        return {"data" : "",
+          "code" : "400",
+          "status" : "Identity not loaded"
+        }
+      }
+
+      return new Penpal.Promise(result => {
+        executeRestfulFunction("private", viamApi, viamApi.identityLogout).then(executeResult => {
+          viamApi.setIdentity("")
+          viamApi.setSessionData("", "")
+          clearPinCodeTtl(authenticationPublicKey)
+
+          authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+          localStorage.removeItem("uuid")
+          localStorage.removeItem("token")
+          localStorage.removeItem("authenticatedIdentity")
+          delete loadedIdentities[authenticationPublicKey]
+          //console.log("Set loaded identity in logout")
+          currentlyLoadedIdentity = null
+          currentlyAuthenticatedIdentity = null
+          lastTimeGetProfile = 0;
+
+          result(executeResult);
+        });
+      });
+    },
+    identityRestoreAccess(restoreAccessIdentity, identificator) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity(restoreAccessIdentity.authentication.publicKey)
+
+        executeRestfulFunction("public", viamApi, viamApi.identityRestoreAccess, identificator).then(executeResult => {
+          if (executeResult.code === "200") {
+            setIdentityInLocalStorage(restoreAccessIdentity)
+            result(executeResult);
+          } else {
+            result(executeResult);
+          }
+        });
+      });
+    },
+    getCurrentlyLoggedInUUID() {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        if(localStorage.getItem("uuid") === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Not logged in UUID"
+          })
+        }
+        result({"data" : localStorage.getItem("uuid"),
+          "code" : "200",
+          "status" : "UUID loaded"
+        })
+      });
+    },
+    getCertificateByPassport(passportUUID) {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        getCertificateForPassport(passportUUID, false).then(certificateResult => {
+          //console.log(certificateResult)
+          result(certificateResult)
+        })
+      });
+    },
+    getOneTimeCertificateByPassport(passportUUID, emailArg) {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not loaded"
+          }
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        getCertificateForPassport(passportUUID, true).then(certificateResult => {
+          //console.log(certificateResult)
+          if(certificateResult.code == "200") {
+            var passportCertificate = certificateResult.data["x509Certificate"]
+            var passportPrivateKey = certificateResult.data["privateKey"]
+            var passportChain = certificateResult.data["chain"]
+
+            createOneTimePassportCertificate(makeid() + "-" + passportUUID, emailArg, passportPrivateKey, passportCertificate).then(function(keys){
+              var publicKeyOneTime = keys["publicKeyPEM"]
+              var privateKeyOneTime = keys["privateKeyPEM"]
+              var certificateOneTime = keys["certificatePEM"]
+              passportChain.push(passportCertificate)
+
+              var oneTimeCryptoData = new CryptoData();
+              oneTimeCryptoData.setx509Certificate(certificateOneTime)
+              oneTimeCryptoData.setPrivateKey(privateKeyOneTime)
+              oneTimeCryptoData.setPublicKey(publicKeyOneTime)
+              oneTimeCryptoData.setChain(passportChain)
+
+              result({"data" : oneTimeCryptoData,
+                "code" : "200",
+                "status" : "One time certificate generated"
+              })
+              // Prints PEM formatted signed certificate
+              // -----BEGIN CERTIFICATE-----MIID....7Hyg==-----END CERTIFICATE-----
+
+            });
+          } else {
+            result({"data" : "",
+              "code" : "400",
+              "status" : "Can not generate one time certificate"
+            })
+          }
+        })
+      });
+    },
+    signEmail(passportUUID, emailArg, emailMessage) {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          }
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          return {"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          }
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        getCertificateForPassport(passportUUID, true).then(certificateResult => {
+          console.log("Certificate for passport")
+          console.log(certificateResult)
+          if(certificateResult.code == "200") {
+            var passportCertificate = certificateResult.data["x509Certificate"]
+            var passportPrivateKey = certificateResult.data["privateKey"]
+            var passportChain = certificateResult.data["chain"]
+
+            createOneTimePassportCertificate(makeid() + "-" + passportUUID, emailArg, passportPrivateKey, passportCertificate).then(function(keys){
+              var publicKeyOneTime = keys["publicKeyPEM"]
+              var privateKeyOneTime = keys["privateKeyPEM"]
+              var certificateOneTime = keys["certificatePEM"]
+              //download("certificateOneTime.crt", "text/plain", certificateOneTime)
+
+              passportChain.push(passportCertificate)
+
+              //console.log("Before sign email")
+              //console.log(certificateOneTime)
+              //console.log(passportChain)
+              //console.log(privateKeyOneTime)
+
+              executeRestfulFunction("private", viamApi, viamApi.passportGetEmailWithHeaderByPassport,
+                passportUUID, window.btoa(emailMessage)).then(executeResult2 => {
+                var emailWithHeader = window.atob(executeResult2.data)
+                //console.log(emailWithHeader)
+                //download("withheader.eml", "message/rfc822", emailWithHeader)
+                var signedEmailPromise = signEmail(emailWithHeader,
+                  certificateOneTime,
+                  passportChain,
+                  privateKeyOneTime)
+
+                signedEmailPromise.then(signedEmail => {
+                  executeRestfulFunction("private", viamApi, viamApi.signResignEmail,
+                    passportUUID, window.btoa(signedEmail)).then(executeResult => {
+                    result({"data" : window.atob(executeResult.data),
+                      "code" : "200",
+                      "status" : "Email signed"
+                    })
+                  });
+                  /*result({"data" : signedEmail,
+                      "code" : "200",
+                      "status" : "Email signed"
+                  })*/
+                });
+              });
+              // Prints PEM formatted signed certificate
+              // -----BEGIN CERTIFICATE-----MIID....7Hyg==-----END CERTIFICATE-----
+
+            });
+          } else {
+            result({"data" : "",
+              "code" : "400",
+              "status" : "Can not sign email"
+            })
+          }
+        })
+      });
+    },
+    hasSession() {
+      return new Penpal.Promise(result => {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+        if (authenticationPublicKey === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          });
+        }
+        if (loadedIdentities[authenticationPublicKey] === null) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          });
+        }
+
+        var success = extendPinCodeTtl(authenticationPublicKey)
+
+        if(success == false) {
+          result({"data" : "",
+            "code" : "400",
+            "status" : "Identity not authenticated"
+          })
+        }
+
+        executeRestfulFunction("private", viamApi, viamApi.identityHasSession).then(executeResult => {
+          result(executeResult);
+        });
+      });
+    },
+    marketingSignUpIdentificator(identificator, reference) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity("marketingapppublickey")
+
+        executeRestfulFunction("public", viamApi, viamApi.marketingSignUpIdentificator, identificator, reference).then(executeResult => {
+          viamApi.setIdentity("")
+          viamApi.setSessionData("", "")
+          result(executeResult);
+        });
+      });
+    },
+    marketingGetIdentificatorProfile(identificator, pincode) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity("marketingapppublickey")
+
+        executeRestfulFunction("public", viamApi, viamApi.marketingGetIdentificatorProfile, identificator, pincode).then(executeResult => {
+          viamApi.setIdentity("")
+          viamApi.setSessionData("", "")
+          result(executeResult);
+        });
+      });
+    },
+    marketingЕxecuteEventForIdentificator(identificator, pincode, event) {
+      return new Penpal.Promise(result => {
+        viamApi.setIdentity("marketingapppublickey")
+
+        executeRestfulFunction("public", viamApi, viamApi.marketingExecuteEventForIdentificator, identificator, pincode, event).then(executeResult => {
+          viamApi.setIdentity("")
+          viamApi.setSessionData("", "")
+          result(executeResult);
+        });
+      });
+    },
+    getCurrentlyAuthenticatedIdentity() {
+      return new Penpal.Promise(result => {
+        result({"data" : currentlyAuthenticatedIdentity,
+          "code" : "200",
+          "status" : "Currently authenticated identity"
+        })
+      });
+    },
+    //{{methods}}
+  }
+});
+
+connection.promise.then(parent => {
+  var identities = localStorage.getItem("identities")
+
+  console.log("Library loaded at: " + new Date().toISOString())
+
+  if (identities === "" || identities === null) {
+    //console.log("Setting up empty version")
+    localStorage.setItem("identities", JSON.stringify({}))
+  }
+
+  if (localStorage.getItem("uuid") === null || localStorage.getItem("token") === null
+    || localStorage.getItem("authenticatedIdentity") === null) {
+    localStorage.removeItem("uuid")
+    localStorage.removeItem("token")
+    localStorage.removeItem("authenticatedIdentity")
+  } else {
+    authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+    var pinCode = getPincode(authenticationPublicKey)
+
+    if(pinCode == "" || pinCode == null) {
+      loadIdentityInternal(authenticationPublicKey, "00000000").then(result => {
+        if(result.code != "200") {
+          console.log(result)
+          //var event = createEvent("CanNotLoadIdentity", "ErrorDuringLoadingIdentity", [authenticationPublicKey])
+          //parent.onEvent(event)
+          var event = createEvent("CanNotGetPincodeForAuthenticatedIdentity", "IdentityNotLoaded", [authenticationPublicKey])
+          parent.onEvent(event)
+        }
+      });
+      //var event = createEvent("CanNotGetPincodeForAuthenticatedIdentity", "IdentityNotLoaded", [authenticationPublicKey])
+      //parent.onEvent(event)
+    } else {
+      loadIdentityInternal(authenticationPublicKey, pinCode).then(result => {
+        if(result.code != "200") {
+          var event = createEvent("CanNotLoadIdentity", "ErrorDuringLoadingIdentity", [authenticationPublicKey])
+          parent.onEvent(event)
+        }
+      });
+    }
+  }
+
+  var anynomousDeviceKeyEventsProcessing = false
+  var maxDeviceKeyAnonymousEventTime = 0
+
+  var eventsDeviceEventsProcessing = false
+  var maxDeviceKeyEventTime = 0
+
+  var eventsEntityEventsProcessing = false
+  var maxEntityEventTime = 0
+
+  var identityLoadedEvent = false
+  var identityAuthenticatedEvent = false
+
+  setInterval(function() {
+    if(currentlyAuthenticatedIdentity != null) {
+      var pinCode = getPincode(currentlyAuthenticatedIdentity.authentication.publicKey)
+      if(pinCode != null && pinCode != "") {
+        getIdentityFromLocalStorage(currentlyAuthenticatedIdentity.authentication.publicKey,
+          pinCode, false).then((gotIdentity) => {
+          currentlyAuthenticatedIdentity = gotIdentity
+          //console.log("Set loaded identity in pincode check interval")
+          currentlyLoadedIdentity = gotIdentity
+          if(identityAuthenticatedEvent === false && gotIdentity != null) {
+            var event = createEvent("IdentityAuthenticated", "Authenticated", [gotIdentity.authentication.publicKey])
+            parent.onEvent(event)
+            identityAuthenticatedEvent = true
+          }
+        })
+      } else {
+        authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+
+        if(authenticationPublicKey != null && authenticationPublicKey != "") {
+          /*var event = createEvent("CanNotLoadPincodeForAuthenticatedIdentity", "IdentityNotLoaded", [currentlyAuthenticatedIdentity.authentication.publicKey])
+          parent.onEvent(event)
+          clearPinCodeTtl(authenticationPublicKey)
+          currentlyAuthenticatedIdentity = null*/
+          loadIdentityInternal(authenticationPublicKey, "00000000").then(result => {
+            if(result.code != "200") {
+              console.log(result)
+              var event = createEvent("CanNotGetPincodeForAuthenticatedIdentity", "IdentityNotLoaded", [authenticationPublicKey])
+              parent.onEvent(event)
+              clearPinCodeTtl(authenticationPublicKey)
+              currentlyAuthenticatedIdentity = null
+            }
+          });
+        }
+
+        identityAuthenticatedEvent = false
+        //console.log("Set loaded identity in cycle for not authenticated value")
+        currentlyLoadedIdentity = null
+      }
+    }
+
+    if(currentlyLoadedIdentity != null) {
+      var pinCode = getPincode(currentlyLoadedIdentity.authentication.publicKey)
+      if(pinCode == "" || pinCode == null) {
+        if(identityLoadedEvent === false) {
+          /*var event = createEvent("CanNotLoadPincodeForLoadedIdentity", "IdentityNotLoaded", [currentlyLoadedIdentity.authentication.publicKey])
+          parent.onEvent(event)
+          identityLoadedEvent = true*/
+          loadIdentityInternal(currentlyLoadedIdentity.authentication.publicKey, "00000000").then(result => {
+            if(result.code != "200") {
+              var event = createEvent("CanNotLoadPincodeForLoadedIdentity", "IdentityNotLoaded", [currentlyLoadedIdentity.authentication.publicKey])
+              parent.onEvent(event)
+              identityLoadedEvent = true
+            }
+          });
+        }
+      } else {
+        identityLoadedEvent = false
+      }
+    }
+
+
+    if (currentlyAuthenticatedIdentity != null) {
+      var now = new Date().getTime()
+      if(now - lastTimeGetProfile > 30000) {
+        var identityToStore = currentlyAuthenticatedIdentity
+        getProfileData(identityToStore).then(executeResult => {
+          console.log("Profile updated in cycle")
+          console.log(executeResult)
+        });
+        lastTimeGetProfile = now
+      }
+    }
+  }, 50)
+
+  setInterval(function() {
+
+    if (currentlyLoadedIdentity != null && anynomousDeviceKeyEventsProcessing == false) {
+      anynomousDeviceKeyEventsProcessing = true
+      executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, "devicekey").then(executeResult => {
+        if(executeResult.code == "200") {
+          var eventsLen = executeResult.data.length
+          changedMaxDeviceKeyAnonymousEventTime = false
+          for(var i = 0; i < eventsLen; i++) {
+            var event = executeResult.data[i]
+            //console.log("Received event anynomous: " + event)
+            switch(event.type) {
+              case "Authenticated" : {
+                console.log("Sending authenticated event")
+                var uuid = event.payloads[0]
+                var token = event.payloads[1]
+                viamApi.setSessionData(uuid, token)
+                localStorage.setItem("uuid", uuid)
+                localStorage.setItem("token", token)
+                localStorage.setItem("authenticatedIdentity",
+                  currentlyLoadedIdentity.authentication.publicKey)
+                setKeyForUUID(uuid, currentlyLoadedIdentity.authentication.publicKey)
+
+                currentlyAuthenticatedIdentity = currentlyLoadedIdentity
+                lastTimeGetProfile = 0;
+
+                var identityToStore = currentlyAuthenticatedIdentity
+                event.payloads = []
+                console.log(identityToStore)
+                setIdentityInLocalStorage(identityToStore).then(() => {
+                  console.log(identityToStore)
+                  getProfileData(identityToStore).then(executeResult2 => {
+                    console.log("Profile updated in setInterval function")
+                    console.log(executeResult2)
+                    parent.onEvent(event)
+                  });
+                });
+                break;
+              }
+
+              case "QRCodeUpdated" : {
+                var actionID = event["actionID"]
+                var QrCode = event["payloads"][1]
+
+                var eventCopy = JSON.parse(JSON.stringify(event))
+
+                QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+                  eventCopy["payloads"].push(url)
+                  parent.onEvent(eventCopy)
+                })
+                break
+              }
+
+              case "KeyDeleted" : {
+                authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
+                clearPinCodeTtl(authenticationPublicKey)
+                localStorage.removeItem("uuid")
+                localStorage.removeItem("token")
+                localStorage.removeItem("authenticatedIdentity")
+                delete loadedIdentities[authenticationPublicKey]
+                //console.log("Set loaded identity in key deleted")
+                currentlyLoadedIdentity = null
+                currentlyAuthenticatedIdentity = null
+                lastTimeGetProfile = 0;
+
+                destroyIdentityFromLocalStorage(authenticationPublicKey)
+                break
+              }
+
+              default : {
+                parent.onEvent(event)
+              }
+            }
+            changedMaxDeviceKeyAnonymousEventTime = true
+            maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp)
+          }
+
+          if(changedMaxDeviceKeyAnonymousEventTime) {
+            //console.log("Updating max time anonymous device with " + maxDeviceKeyAnonymousEventTime )
+            executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession,
+              "devicekey", maxDeviceKeyAnonymousEventTime.toString()).then(executeResult1 => {
+              anynomousDeviceKeyEventsProcessing = false
+            })
+          } else {
+            anynomousDeviceKeyEventsProcessing = false
+          }
+        } else {
+          anynomousDeviceKeyEventsProcessing = false
+          //console.log("Error during query anynomous device")
+        }
+      });
+    }
+
+    /*if(currentlyAuthenticatedIdentity === null) {
+        console.log("Currently authenticated identity is null")
+    }*/
+
+    if (currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing == false) {
+      eventsDeviceEventsProcessing = true
+      executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "devicekey").then(executeResult => {
+        if(executeResult.code == "200") {
+          var eventsLen = executeResult.data.length
+          changedMaxDeviceKeyEventTime = false
+          for(var i = 0; i < eventsLen; i++) {
+            var event = executeResult.data[i]
+            //console.log("Received event device key: " + event)
+            if(event.type == "QRCodeUpdated") {
+              var actionID = event["actionID"]
+              var QrCode = event["payloads"][1]
+
+              var eventCopy = JSON.parse(JSON.stringify(event))
+
+              QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+                eventCopy["payloads"].push(url)
+                parent.onEvent(eventCopy)
+              })
+            } else {
+              parent.onEvent(event)
+            }
+            maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp)
+          }
+          if(changedMaxDeviceKeyEventTime) {
+            //console.log("Updating max time authenticated device")
+            executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "devicekey",
+              maxDeviceKeyEventTime.toString()).then(executeResult1 => {
+              eventsDeviceEventsProcessing = false
+            })
+          } else {
+            eventsDeviceEventsProcessing = false
+          }
+        } else {
+          //console.log("Error during query device")
+          eventsDeviceEventsProcessing = false
+        }
+      });
+    }
+
+    if (currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing == false) {
+      eventsEntityEventsProcessing = true
+      executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "entity").then(executeResult => {
+        if(executeResult.code == "200") {
+          var eventsLen = executeResult.data.length
+          changedMaxEntityEventTime = false
+          for(var i = 0; i < eventsLen; i++) {
+            event = executeResult.data[i]
+            if(event.type == "QRCodeUpdated") {
+              var actionID = event["actionID"]
+              var QrCode = event["payloads"][1]
+
+              var eventCopy = JSON.parse(JSON.stringify(event))
+
+              QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
+                eventCopy["payloads"].push(url)
+                parent.onEvent(eventCopy)
+              })
+
+              continue
+            }
+
+            //console.log("Received event entity: " + event)
+            parent.onEvent(event)
+            changedMaxEntityEventTime = true
+            //console.log(maxEntityEventTime + " " + event.stamp)
+            maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp)
+          }
+          if(changedMaxEntityEventTime) {
+            //console.log("Updating max time entity" + maxEntityEventTime)
+            executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "entity",
+              maxEntityEventTime.toString()).then(executeResult1 => {
+              eventsEntityEventsProcessing = false
+            })
+          } else {
+            eventsEntityEventsProcessing = false
+          }
+        } else {
+          //console.log("Error during query entity")
+          eventsEntityEventsProcessing = false
+        }
+      });
+    }
+  }, 1000);
+});
diff --git a/javascript/src/wopiapi-iframe.js b/javascript/src/wopiapi-iframe.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e1de4d6841878f531debc4f3db6ce13989ac76b
--- /dev/null
+++ b/javascript/src/wopiapi-iframe.js
@@ -0,0 +1,16 @@
+function WopiAPI() {}
+
+WopiAPI.prototype.getPassports = function(publicKey, uuid, token, fileID) {
+  const requestConfig = {
+    headers: {
+      'publicKey': publicKey,
+      'uuid': uuid,
+      'token': token,
+      'fileID': fileID
+    }
+  };
+
+  return axios.post('{{host}}:{{port}}/getPassports', {}, requestConfig);
+};
+
+wopiAPI = new WopiAPI();
diff --git a/javascript/webpack.config.js b/javascript/webpack.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..b93e164c25cf7bc3ee51b40070766f17282e879f
--- /dev/null
+++ b/javascript/webpack.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+  mode: 'production',
+  entry: {
+    'viamapi-client': './src/viamapi-client.js',
+    'viamapi-iframe': './src/viamapi-iframe.js',
+    'wopiapi-iframe': './src/wopiapi-iframe.js'
+  }
+};
diff --git a/javascript/yarn.lock b/javascript/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..5e10242d364440c7a19e87504c584ad8eb00df16
--- /dev/null
+++ b/javascript/yarn.lock
@@ -0,0 +1,2703 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@webassemblyjs/ast@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a"
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.7.10"
+    "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
+    "@webassemblyjs/wast-parser" "1.7.10"
+
+"@webassemblyjs/floating-point-hex-parser@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9"
+
+"@webassemblyjs/helper-api-error@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198"
+
+"@webassemblyjs/helper-buffer@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b"
+
+"@webassemblyjs/helper-code-frame@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz#0ab7e22fad0241a173178c73976fc0edf50832ce"
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.7.10"
+
+"@webassemblyjs/helper-fsm@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64"
+
+"@webassemblyjs/helper-module-context@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755"
+
+"@webassemblyjs/helper-wasm-bytecode@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0"
+
+"@webassemblyjs/helper-wasm-section@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz#c0ea3703c615d7bc3e3507c3b7991c8767b2f20e"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-buffer" "1.7.10"
+    "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
+    "@webassemblyjs/wasm-gen" "1.7.10"
+
+"@webassemblyjs/ieee754@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz#62c1728b7ef0f66ef8221e2966a0afd75db430df"
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.10.tgz#167e0bb4b06d7701585772a73fba9f4df85439f6"
+  dependencies:
+    "@xtuc/long" "4.2.1"
+
+"@webassemblyjs/utf8@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a"
+
+"@webassemblyjs/wasm-edit@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz#83fe3140f5a58f5a30b914702be9f0e59a399092"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-buffer" "1.7.10"
+    "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
+    "@webassemblyjs/helper-wasm-section" "1.7.10"
+    "@webassemblyjs/wasm-gen" "1.7.10"
+    "@webassemblyjs/wasm-opt" "1.7.10"
+    "@webassemblyjs/wasm-parser" "1.7.10"
+    "@webassemblyjs/wast-printer" "1.7.10"
+
+"@webassemblyjs/wasm-gen@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz#4de003806ae29c97ab3707782469b53299570174"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
+    "@webassemblyjs/ieee754" "1.7.10"
+    "@webassemblyjs/leb128" "1.7.10"
+    "@webassemblyjs/utf8" "1.7.10"
+
+"@webassemblyjs/wasm-opt@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz#d151e31611934a556c82789fdeec41a814993c2a"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-buffer" "1.7.10"
+    "@webassemblyjs/wasm-gen" "1.7.10"
+    "@webassemblyjs/wasm-parser" "1.7.10"
+
+"@webassemblyjs/wasm-parser@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz#0367be7bf8f09e3e6abc95f8e483b9206487ec65"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-api-error" "1.7.10"
+    "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
+    "@webassemblyjs/ieee754" "1.7.10"
+    "@webassemblyjs/leb128" "1.7.10"
+    "@webassemblyjs/utf8" "1.7.10"
+
+"@webassemblyjs/wast-parser@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz#058f598b52f730b23fc874d4775b6286b6247264"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/floating-point-hex-parser" "1.7.10"
+    "@webassemblyjs/helper-api-error" "1.7.10"
+    "@webassemblyjs/helper-code-frame" "1.7.10"
+    "@webassemblyjs/helper-fsm" "1.7.10"
+    "@xtuc/long" "4.2.1"
+
+"@webassemblyjs/wast-printer@1.7.10":
+  version "1.7.10"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz#d817909d2450ae96c66b7607624d98a33b84223b"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/wast-parser" "1.7.10"
+    "@xtuc/long" "4.2.1"
+
+"@xtuc/ieee754@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+
+"@xtuc/long@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.6.2:
+  version "5.7.3"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+
+ajv-keywords@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+  version "6.5.4"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59"
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+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"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1js@^2.0.21, asn1js@latest:
+  version "2.0.21"
+  resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.0.21.tgz#a9ce6a02727c1a9249f26b94afd23b957a1015f0"
+  dependencies:
+    pvutils latest
+
+assert@^1.1.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+atob@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+
+axios@0.18.0:
+  version "0.18.0"
+  resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
+  dependencies:
+    follow-redirects "^1.3.0"
+    is-buffer "^1.1.5"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  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"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
+
+bluebird@^3.5.1:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  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"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.2.0"
+  resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytestreamjs@latest:
+  version "1.0.22"
+  resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-1.0.22.tgz#7fbcc7c84989feb79c5046d27af0fab7a446fa1b"
+
+cacache@^10.0.4:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  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@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+can-promise@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/can-promise/-/can-promise-0.0.1.tgz#7a7597ad801fb14c8b22341dfec314b6bd6ad8d3"
+  dependencies:
+    window-or-global "^1.0.1"
+
+chalk@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chokidar@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    lodash.debounce "^4.0.8"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.5"
+  optionalDependencies:
+    fsevents "^1.2.2"
+
+chownr@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+
+chrome-trace-event@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+  dependencies:
+    tslib "^1.9.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+cliui@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+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"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  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"
+  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"
+
+commander@~2.13.0:
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  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"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+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"
+
+create-ecdh@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.2.0"
+  resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    md5.js "^1.3.4"
+    ripemd160 "^2.0.1"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.7"
+  resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@=3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+decamelize@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decamelize@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
+  dependencies:
+    xregexp "4.0.0"
+
+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"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  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"
+  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"
+  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"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dijkstrajs@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+elliptic@^6.0.0:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+enhanced-resolve@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+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"
+
+eslint-scope@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+execa@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  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"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  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"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  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"
+
+fast-deep-equal@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^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"
+  dependencies:
+    locate-path "^3.0.0"
+
+flush-write-stream@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+follow-redirects@^1.3.0:
+  version "1.5.9"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6"
+  dependencies:
+    debug "=3.1.0"
+
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-minipass@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+  dependencies:
+    minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+  dependencies:
+    nan "^2.9.2"
+    node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  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-caller-file@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+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"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.2:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+  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"
+
+global-modules-path@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  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"
+  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"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@0.4.23:
+  version "0.4.23"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.4.4:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+  dependencies:
+    minimatch "^3.0.4"
+
+import-local@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+  dependencies:
+    pkg-dir "^3.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+interpret@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+invert-kv@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+
+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"
+  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"
+  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"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+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"
+  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"
+  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"
+  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"
+  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"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+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"
+  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"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, 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"
+  dependencies:
+    isobject "^3.0.1"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  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"
+
+json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0:
+  version "0.5.1"
+  resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+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"
+  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"
+  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"
+
+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"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+lcid@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+  dependencies:
+    invert-kv "^2.0.0"
+
+libbase64@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.0.3.tgz#de3023234abeefeb9d49378804c8a94404f5c98c"
+
+libmime@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/libmime/-/libmime-4.0.1.tgz#dc71a19bfa6a97f8249d7205251d862d6fc599fb"
+  dependencies:
+    iconv-lite "0.4.23"
+    libbase64 "1.0.3"
+    libqp "1.1.0"
+
+libqp@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979"
+
+loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.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"
+  dependencies:
+    p-locate "^3.0.0"
+    path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lru-cache@^4.0.1, lru-cache@^4.1.1:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+make-dir@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  dependencies:
+    pify "^3.0.0"
+
+map-age-cleaner@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74"
+  dependencies:
+    p-defer "^1.0.0"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+mem@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf"
+  dependencies:
+    map-age-cleaner "^0.1.1"
+    mimic-fn "^1.0.0"
+    p-is-promise "^1.1.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  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"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+  version "2.3.5"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
+  dependencies:
+    safe-buffer "^5.1.2"
+    yallist "^3.0.0"
+
+minizlib@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
+  dependencies:
+    minipass "^2.2.1"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+  version "2.11.1"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  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"
+
+needle@^2.2.1:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
+  dependencies:
+    debug "^2.1.2"
+    iconv-lite "^0.4.4"
+    sax "^1.2.4"
+
+neo-async@^2.5.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+  dependencies:
+    detect-libc "^1.0.2"
+    mkdirp "^0.5.1"
+    needle "^2.2.1"
+    nopt "^4.0.1"
+    npm-packlist "^1.1.6"
+    npmlog "^4.0.2"
+    rc "^1.2.7"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^4"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
+
+npm-packlist@^1.1.6:
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
+  dependencies:
+    ignore-walk "^3.0.1"
+    npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  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"
+
+object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  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"
+  dependencies:
+    isobject "^3.0.0"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  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"
+  dependencies:
+    wrappy "1"
+
+os-browserify@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-locale@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620"
+  dependencies:
+    execa "^0.10.0"
+    lcid "^2.0.0"
+    mem "^4.0.0"
+
+os-tmpdir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-defer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-limit@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
+  dependencies:
+    p-try "^2.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+  dependencies:
+    p-limit "^2.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+p-try@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parse-asn1@^5.0.0:
+  version "5.1.1"
+  resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+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"
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.17"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+penpal@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/penpal/-/penpal-3.0.3.tgz#6cdbd99d8c5dadb73be16d9fe6807826b0d9a715"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+pkg-dir@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+  dependencies:
+    find-up "^3.0.0"
+
+pkijs@^2.1.69:
+  version "2.1.69"
+  resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-2.1.69.tgz#3892e9596f1429b2cde05209ffe971387277f6b6"
+  dependencies:
+    asn1js latest
+    bytestreamjs latest
+    pvutils latest
+
+pngjs@^3.3.0:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
+
+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"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+    safe-buffer "^5.1.2"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+pvutils@^1.0.16, pvutils@latest:
+  version "1.0.16"
+  resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.16.tgz#b85984388e4d2770686712a2246202d11750d083"
+
+qrcode@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.3.0.tgz#a30dfe636225893501ea03af9ca10634ff1473a5"
+  dependencies:
+    can-promise "^0.0.1"
+    dijkstrajs "^1.0.1"
+    isarray "^2.0.1"
+    pngjs "^3.3.0"
+    yargs "^8.0.2"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+  version "2.3.6"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  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"
+
+readdirp@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+  dependencies:
+    graceful-fs "^4.1.11"
+    micromatch "^3.1.10"
+    readable-stream "^2.0.2"
+
+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"
+  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"
+
+repeat-element@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+
+repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, 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"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  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"
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.4, schema-utils@^0.4.5:
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+
+serialize-javascript@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.11"
+  resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  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"
+  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"
+  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-list-map@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+
+source-map-resolve@^0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  dependencies:
+    atob "^2.1.1"
+    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"
+
+source-map@^0.5.6:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
+  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"
+
+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"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f"
+
+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"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+ssri@^5.2.4:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+  dependencies:
+    safe-buffer "^5.1.1"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  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", string-width@^2.0.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  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"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+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"
+
+supports-color@^5.3.0, supports-color@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  dependencies:
+    has-flag "^3.0.0"
+
+tapable@^1.0.0, tapable@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c"
+
+tar@^4:
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
+  dependencies:
+    chownr "^1.0.1"
+    fs-minipass "^1.2.5"
+    minipass "^2.3.3"
+    minizlib "^1.1.0"
+    mkdirp "^0.5.0"
+    safe-buffer "^5.1.2"
+    yallist "^3.0.2"
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+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"
+  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"
+  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"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+tslib@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.4:
+  version "3.3.9"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  dependencies:
+    commander "~2.13.0"
+    source-map "~0.6.1"
+
+uglifyjs-webpack-plugin@^1.2.4:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
+  dependencies:
+    cacache "^10.0.4"
+    find-cache-dir "^1.0.0"
+    schema-utils "^0.4.5"
+    serialize-javascript "^1.4.0"
+    source-map "^0.6.1"
+    uglify-es "^3.3.4"
+    webpack-sources "^1.1.0"
+    worker-farm "^1.5.2"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.0.5:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  dependencies:
+    punycode "^2.1.0"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+util@^0.10.3:
+  version "0.10.4"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  dependencies:
+    inherits "2.0.3"
+
+v8-compile-cache@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c"
+
+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"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vm-browserify@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+watchpack@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+webpack-cli@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746"
+  dependencies:
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    enhanced-resolve "^4.1.0"
+    global-modules-path "^2.3.0"
+    import-local "^2.0.0"
+    interpret "^1.1.0"
+    loader-utils "^1.1.0"
+    supports-color "^5.5.0"
+    v8-compile-cache "^2.0.2"
+    yargs "^12.0.2"
+
+webpack-sources@^1.1.0, webpack-sources@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@^4.23.1:
+  version "4.23.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.23.1.tgz#db7467b116771ae020c58bdfe2a0822785bb8239"
+  dependencies:
+    "@webassemblyjs/ast" "1.7.10"
+    "@webassemblyjs/helper-module-context" "1.7.10"
+    "@webassemblyjs/wasm-edit" "1.7.10"
+    "@webassemblyjs/wasm-parser" "1.7.10"
+    acorn "^5.6.2"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^1.0.0"
+    enhanced-resolve "^4.1.0"
+    eslint-scope "^4.0.0"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.4"
+    tapable "^1.1.0"
+    uglifyjs-webpack-plugin "^1.2.4"
+    watchpack "^1.5.0"
+    webpack-sources "^1.3.0"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  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"
+  dependencies:
+    string-width "^1.0.2 || 2"
+
+window-or-global@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de"
+
+worker-farm@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+  dependencies:
+    errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xregexp@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^12.0.2:
+  version "12.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^2.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^1.0.1"
+    os-locale "^3.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1 || ^4.0.0"
+    yargs-parser "^10.1.0"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
diff --git a/npm/package/index.js b/npm/package/index.js
deleted file mode 100644
index 1b7d995cd43bfaec6b1cfac6f133f27c7823f916..0000000000000000000000000000000000000000
--- a/npm/package/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-!function(e,n){var r={};!function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=e.ERR_CONNECTION_DESTROYED="ConnectionDestroyed",r=e.ERR_CONNECTION_TIMEOUT="ConnectionTimeout",t=e.ERR_NOT_IN_IFRAME="NotInIframe",o={"http:":"80","https:":"443"},a=/^(https?:)?\/\/([^\/:]+)(:(\d+))?/,i={ERR_CONNECTION_DESTROYED:n,ERR_CONNECTION_TIMEOUT:r,ERR_NOT_IN_IFRAME:t,Promise:function(){try{return window?window.Promise:null}catch(e){return null}}(),debug:!1},d=function(){var e=0;return function(){return++e}}(),c=function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];if(i.debug){var t;(t=console).log.apply(t,["[Penpal]"].concat(n))}},u=function(e){var n=document.location,r=a.exec(e),t=void 0,i=void 0,d=void 0;return r?(t=r[1]?r[1]:n.protocol,i=r[2],d=r[4]):(t=n.protocol,i=n.hostname,d=n.port),t+"//"+i+(d&&d!==o[t]?":"+d:"")},s=function(e){var n=[];return e(function(){n.forEach(function(e){e()})}),{then:function(e){n.push(e)}}},l=function(e){return{name:e.name,message:e.message,stack:e.stack}},m=function(e){var n=new Error;return Object.keys(e).forEach(function(r){return n[r]=e[r]}),n},f=function(e,r,t,o){var a=r.localName,u=r.local,s=r.remote,l=r.remoteOrigin,f=!1;c(a+": Connecting call sender");var v=function(e){return function(){for(var r=arguments.length,t=Array(r),o=0;o<r;o++)t[o]=arguments[o];if(c(a+": Sending "+e+"() call"),f){var v=new Error("Unable to send "+e+"() call due to destroyed connection");throw v.code=n,v}return new i.Promise(function(n,r){var o=d(),i=function t(i){if(i.source===s&&i.origin===l&&"reply"===i.data.penpal&&i.data.id===o){c(a+": Received "+e+"() reply"),u.removeEventListener("message",t);var d=i.data.returnValue;i.data.returnValueIsError&&(d=m(d)),("fulfilled"===i.data.resolution?n:r)(d)}};u.addEventListener("message",i),s.postMessage({penpal:"call",id:o,methodName:e,args:t},l)})}};o.then(function(){f=!0}),t.reduce(function(e,n){return e[n]=v(n),e},e)},v=function(e,n,r){var t=e.localName,o=e.local,a=e.remote,d=e.remoteOrigin,u=!1;c(t+": Connecting call receiver");var s=function(e){if(e.source===a&&e.origin===d&&"call"===e.data.penpal){var r=e.data,o=r.methodName,s=r.args,m=r.id;if(c(t+": Received "+o+"() call"),o in n){var f=function(e){return function(n){if(c(t+": Sending "+o+"() reply"),u)return void c(t+": Unable to send "+o+"() reply due to destroyed connection");var r={penpal:"reply",id:m,resolution:e,returnValue:n};"rejected"===e&&n instanceof Error&&(r.returnValue=l(n),r.returnValueIsError=!0);try{a.postMessage(r,d)}catch(e){throw"DataCloneError"===e.name&&a.postMessage({penpal:"reply",id:m,resolution:"rejected",returnValue:l(e),returnValueIsError:!0},d),e}}};new i.Promise(function(e){return e(n[o].apply(n,s))}).then(f("fulfilled"),f("rejected"))}}};o.addEventListener("message",s),r.then(function(){u=!0,o.removeEventListener("message",s)})};i.connectToChild=function(e){var t=e.url,o=e.appendTo,a=e.methods,d=void 0===a?{}:a,l=e.timeout,m=void 0,p=new s(function(e){m=e}),h=window,g=document.createElement("iframe");(o||document.body).appendChild(g),p.then(function(){g.parentNode&&g.parentNode.removeChild(g)});var E=g.contentWindow||g.contentDocument.parentWindow,w=u(t);return{promise:new i.Promise(function(e,o){var a=void 0;void 0!==l&&(a=setTimeout(function(){var e=new Error("Connection to child timed out after "+l+"ms");e.code=r,o(e),m()},l));var i={},u=void 0,y=void 0,N=function(n){if(n.source===E&&n.origin===w&&"handshake"===n.data.penpal){c("Parent: Received handshake, sending reply"),n.source.postMessage({penpal:"handshake-reply",methodNames:Object.keys(d)},n.origin);var r={localName:"Parent",local:h,remote:E,remoteOrigin:n.origin};y&&y();var t=new s(function(e){p.then(e),y=e});v(r,d,t),u&&u.forEach(function(e){delete i[e]}),u=n.data.methodNames,f(i,r,u,p),clearTimeout(a),e(i)}};h.addEventListener("message",N),p.then(function(){h.removeEventListener("message",N);var e=new Error("Connection destroyed");e.code=n,o(e)}),c("Parent: Loading iframe"),g.src=t}),iframe:g,destroy:m}},i.connectToParent=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=e.parentOrigin,a=void 0===o?"*":o,d=e.methods,u=void 0===d?{}:d,l=e.timeout;if(window===window.top){var m=new Error("connectToParent() must be called within an iframe");throw m.code=t,m}var p=void 0,h=new s(function(e){p=e}),g=window,E=g.parent;return{promise:new i.Promise(function(e,t){var o=void 0;void 0!==l&&(o=setTimeout(function(){var e=new Error("Connection to parent timed out after "+l+"ms");e.code=r,t(e),p()},l));var i=function n(r){if(("*"===a||a===r.origin)&&r.source===E&&"handshake-reply"===r.data.penpal){c("Child: Received handshake reply"),g.removeEventListener("message",n);var t={localName:"Child",local:g,remote:E,remoteOrigin:r.origin},i={};v(t,u,h),f(i,t,r.data.methodNames,h),clearTimeout(o),e(i)}};g.addEventListener("message",i),h.then(function(){g.removeEventListener("message",i);var e=new Error("Connection destroyed");e.code=n,t(e)}),c("Child: Sending handshake"),E.postMessage({penpal:"handshake",methodNames:Object.keys(u)},a)}),destroy:p}},e.default=i}(r),"function"==typeof define&&define.amd?define("Penpal",r.default):e.Penpal=r.default}(this);
-
-function setupViamAPI(divId, methodsArg, envUrl) {
-	const connection = Penpal.connectToChild({
-	  // URL of page to load into iframe.
-	  url: envUrl,
-	  // Container to which the iframe should be appended.
-	  appendTo: document.getElementById(divId),
-	  // Methods parent is exposing to child
-	  methods: methodsArg
-	});
-
-	return connection.promise
-}	
\ No newline at end of file