Browse Source

Fix bone transform

Alan Colon 6 years ago
parent
commit
4f7ef6a166
10 changed files with 302 additions and 43 deletions
  1. 0 0
      README.md
  2. 1 1
      lib/http-proxy/index.js
  3. 26 13
      lib/http-proxy/passes/web-outgoing.js
  4. 4 0
      package.json
  5. 28 1
      server/main.js
  6. 9 0
      src/custom.less
  7. 15 5
      src/index.js
  8. 29 15
      src/stl-exporter.js
  9. 8 0
      webpack.config.js
  10. 182 8
      yarn.lock

+ 0 - 0
README.md


+ 1 - 1
lib/http-proxy/index.js

@@ -28,7 +28,7 @@ httpProxy.Server = ProxyServer;
 function createRightProxy(type) {
 
   return function(options) {
-    console.log('options', options)
+    //console.log('options', options)
     return function(req, res /*, [head], [opts] */) {
       var passes = (type === 'ws') ? this.wsPasses : this.webPasses,
           args = [].slice.call(arguments),

+ 26 - 13
lib/http-proxy/passes/web-outgoing.js

@@ -108,21 +108,34 @@ module.exports = { // <--
 
     // message.rawHeaders is added in: v0.11.6
     // https://nodejs.org/api/http.html#http_message_rawheaders
-    if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {
-      rawHeaderKeyMap = {};
-      for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) {
-        var key = proxyRes.rawHeaders[i];
-        rawHeaderKeyMap[key.toLowerCase()] = key;
+    // if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {
+    //   rawHeaderKeyMap = {};
+    //   for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) {
+    //     var key = proxyRes.rawHeaders[i];
+    //     rawHeaderKeyMap[key.toLowerCase()] = key;
+    //   }
+    // }
+
+    // Object.keys(proxyRes.headers).forEach(function(key) {
+    //   var header = proxyRes.headers[key];
+    //   if (preserveHeaderKeyCase && rawHeaderKeyMap) {
+    //     key = rawHeaderKeyMap[key] || key;
+    //   }
+    //   setHeader(key, header);
+    // });
+    for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) {
+      const key = proxyRes.rawHeaders[i]
+      let value = proxyRes.rawHeaders[i + 1]
+      if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
+        value = common.rewriteCookieProperty(value, rewriteCookieDomainConfig, 'domain');
       }
-    }
-
-    Object.keys(proxyRes.headers).forEach(function(key) {
-      var header = proxyRes.headers[key];
-      if (preserveHeaderKeyCase && rawHeaderKeyMap) {
-        key = rawHeaderKeyMap[key] || key;
+      if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
+        value = common.rewriteCookieProperty(value, rewriteCookiePathConfig, 'path');
       }
-      setHeader(key, header);
-    });
+      if (key.toLowerCase().includes('cookie'))
+      console.log(key, value)
+      res.setHeader(key, value)
+    }
   },
 
   /**

+ 4 - 0
package.json

@@ -13,8 +13,12 @@
   "author": "",
   "license": "ISC",
   "devDependencies": {
+    "css-loader": "^3.4.2",
+    "less": "^3.10.3",
+    "less-loader": "^5.0.0",
     "nodemon": "^1.18.4",
     "npm-run-all": "^4.1.5",
+    "style-loader": "^1.1.3",
     "webpack": "^4.21.0",
     "webpack-cli": "^3.1.2"
   },

+ 28 - 1
server/main.js

@@ -1,6 +1,7 @@
 const express = require('express')
 const httpProxy = require('../lib/http-proxy')
 const request = require('request')
+const common = require('../lib/http-proxy/common')
 
 const app = express()
 const assetsProxy = httpProxy.createProxyServer({
@@ -11,22 +12,48 @@ const assetsProxy = httpProxy.createProxyServer({
   autoRewrite: true,
   protocolRewrite: 'http',
   selfHandleResponse: false,
+  cookieDomainRewrite: true,
+  preserveHeaderKeyCase: true,
   mapHeaders(headers) {
+    headers.host = 'www.heroforge.com'
     if (headers.referer) {
       const url = new URL(headers.referer)
       url.hostname = 'www.heroforge.com'
       url.protocol = 'https'
       url.port = 443
       headers.referer = url.toString()
+      headers.origin = 'https://www.heroforge.com'
     }
     return headers
   }
 })
 
+assetsProxy.on('error', (err, req, res, url) => {
+  console.warn(err.message, req.url)
+  res.redirect(req.url)
+})
 app.use(/^\/$/, (req, res) => {
-  request('https://www.heroforge.com', (err, response, body) => {
+  request('https://www.heroforge.com', (err, proxyRes, body) => {
     if (err) res.status(500).send(err)
     else {
+      for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) {
+        var rewriteCookieDomainConfig = ['*'],
+        rewriteCookiePathConfig = ['*']
+        const key = proxyRes.rawHeaders[i]
+        let value = proxyRes.rawHeaders[i + 1]
+        if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
+          value = common.rewriteCookieProperty(value, rewriteCookieDomainConfig, 'domain');
+        }
+        if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
+          value = common.rewriteCookieProperty(value, rewriteCookiePathConfig, 'path');
+        }
+        if (key.toLowerCase() === 'set-cookie') {
+          const [k, v] = value.split(';')[0].split('=')
+          res.cookie(k,v)
+        } else {
+          res.setHeader(key, value)
+        }
+      }
       let html = body
       .replace(/<script[^>]+googletagmanager.*<\/script>/g, '<!-- google tag manager -->')
       .replace(/<img[^>]+facebook.*>/g, '<!-- facebook -->')

+ 9 - 0
src/custom.less

@@ -0,0 +1,9 @@
+.content-side .headerMenu-container,
+.tab-Material,
+.tab-Extras,
+.editorFooter-info,
+.social,
+.gift-tos,
+.corner-kickstarter {
+  display: none;
+}

+ 15 - 5
src/index.js

@@ -1,3 +1,5 @@
+require('./custom.less')
+
 const tree = require('./tree')
 const walk = require('./walk')
 require('./ui')
@@ -86,14 +88,22 @@ const waitFor = fn => new Promise((resolve, reject) => {
 
 
 setInterval(() => {
-  const link = document.querySelector('.link.voucher')
-  if (link) {
+  const links = Array.from(document.querySelectorAll('.shop-button'))
+  links.forEach(link => {
     const a = document.createElement('a')
-    a.className = 'link voucher'
+    a.className = 'shop-button clickable'
     a.innerText = 'Export STL'
-    a.onclick = () => saveStl(CK.character.name)
+    a.onclick = ev => {
+      saveStl(CK.character.name || document.querySelector('.headerMenu-trigger-label').innerText.split('*').join('').trim())
+      ev.preventDefault()
+      setTimeout(() => document.querySelector('.tab-Pose').click())
+    }
     link.replaceWith(a)
-  }
+  })
+  // const kick = Array.from(document.querySelectorAll('.corner-kickstarter'))
+  // kick.forEach(kick => {
+  //   kick.remove()
+  // })
 }, 1000)
 
 // // Your code here...

+ 29 - 15
src/stl-exporter.js

@@ -22,12 +22,12 @@ THREE.STLExporter.prototype = {
 	constructor: THREE.STLExporter,
 
 	parse: ( function () {
-
+		console.log('parse main')
 		var vector = new THREE.Vector3();
 		var normalMatrixWorld = new THREE.Matrix3();
 
 		return function parse( scene, options ) {
-
+			console.log('parse inner')
 			if ( options === undefined ) options = {};
 
 			var binary = options.binary !== undefined ? options.binary : false;
@@ -38,19 +38,19 @@ THREE.STLExporter.prototype = {
 			var triangles = 0;
 
 			scene.traverse( function ( object ) {
-
+				console.log('traverse', object)
 				if ( object.isMesh ) {
-
+					console.log('isMesh true')
 					var geometry = object.geometry;
 
 					if ( geometry.isBufferGeometry ) {
-
+						console.log('isBufferGeometry true')
 						geometry = new THREE.Geometry().fromBufferGeometry( geometry );
 
 					}
 
 					if ( geometry.isGeometry ) {
-
+						console.log('isGeometry true')
 						triangles += geometry.faces.length;
 
 						objects.push( {
@@ -68,7 +68,7 @@ THREE.STLExporter.prototype = {
 			} );
 
 			if ( binary ) {
-
+				console.log('isBinary true')
 				var offset = 80; // skip header
 				var bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;
 				var arrayBuffer = new ArrayBuffer( bufferLength );
@@ -101,7 +101,15 @@ THREE.STLExporter.prototype = {
 
 							vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
 
-              if(
+							console.log(
+								'Am I doing skeleton?',
+								typeof object.obj.geometry.attributes.skinIndex !== 'undefined',
+                typeof object.obj.geometry.attributes.skinWeight !== 'undefined',
+								typeof object.obj.skeleton,
+								typeof object.obj.geometry.attributes.skinIndex !== 'undefined' &&
+                typeof object.obj.geometry.attributes.skinWeight !== 'undefined' &&
+								typeof object.obj.skeleton !== 'undefined'							)
+					    if(
                 typeof object.obj.geometry.attributes.skinIndex !== 'undefined' &&
                 typeof object.obj.geometry.attributes.skinWeight !== 'undefined' &&
                 typeof object.obj.skeleton !== 'undefined'
@@ -124,7 +132,7 @@ THREE.STLExporter.prototype = {
 				return output;
 
 			} else {
-
+				console.log('isBinary false')
 				var output = '';
 
 				output += 'solid exported\n';
@@ -154,16 +162,22 @@ THREE.STLExporter.prototype = {
 						for ( var k = 0; k < 3; k ++ ) {
 
 							vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
-
+              // if(
+              //   typeof object.obj.geometry.attributes.skinIndex !== 'undefined' &&
+              //   typeof object.obj.geometry.attributes.skinWeight !== 'undefined' &&
+              //   typeof object.obj.skeleton !== 'undefined'
+              // ){
+              //   vector = this.boneTransform( object.obj , vertices[ indices[ k ] ] , indices[ k ] );
+              // }
               if(
-                typeof object.obj.geometry.attributes.skinIndex !== 'undefined' &&
-                typeof object.obj.geometry.attributes.skinWeight !== 'undefined' &&
+                typeof object.obj.geometry.attributes.skinIndex0 !== 'undefined' &&
+                typeof object.obj.geometry.attributes.skinWeight0 !== 'undefined' &&
                 typeof object.obj.skeleton !== 'undefined'
               ){
                 vector = this.boneTransform( object.obj , vertices[ indices[ k ] ] , indices[ k ] );
               }
 
-							output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
+							output += '\t\t\tvertex ' + vector.x * 10 + ' ' + -vector.z * 10 + ' ' + vector.y * 10 + '\n';
 
 						}
 
@@ -193,8 +207,8 @@ THREE.STLExporter.prototype = {
 			if ( object.geometry.isBufferGeometry ) {
 
 				var index4 = index * 4;
-				skinIndices.fromArray( object.geometry.attributes.skinIndex.array, index4 );
-				skinWeights.fromArray( object.geometry.attributes.skinWeight.array, index4 );
+				skinIndices.fromArray( object.geometry.attributes.skinIndex0.array, index4 );
+				skinWeights.fromArray( object.geometry.attributes.skinWeight0.array, index4 );
 
 			} else if ( object.geometry.isGeometry ) {
 

+ 8 - 0
webpack.config.js

@@ -6,5 +6,13 @@ module.exports = {
   output: {
     filename: 'main.js',
     path: path.resolve(__dirname, 'dist')
+  },
+  module: {
+    rules: [
+      {
+        test: /\.less$/i,
+        use: ['style-loader', 'css-loader', 'less-loader' ]
+      }
+    ]
   }
 };

+ 182 - 8
yarn.lock

@@ -181,7 +181,7 @@ ajv-errors@^1.0.0:
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
   integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
 
-ajv-keywords@^3.1.0:
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
   integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
@@ -196,6 +196,16 @@ ajv@^6.1.0, ajv@^6.5.5:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
+ajv@^6.10.2:
+  version "6.11.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9"
+  integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
 ansi-align@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
@@ -286,6 +296,11 @@ array-unique@^0.3.2:
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
   integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
 
+asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+  integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
 asn1.js@^4.0.0:
   version "4.10.1"
   resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
@@ -586,7 +601,7 @@ camelcase@^4.0.0:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
   integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
 
-camelcase@^5.0.0:
+camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
@@ -601,7 +616,7 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
-chalk@2.4.2, chalk@^2.0.1, chalk@^2.4.1:
+chalk@2.4.2, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -678,6 +693,11 @@ cliui@^5.0.0:
     strip-ansi "^5.2.0"
     wrap-ansi "^5.1.0"
 
+clone@^2.1.1, clone@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
 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"
@@ -903,6 +923,29 @@ crypto-random-string@^1.0.0:
   resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
   integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
 
+css-loader@^3.4.2:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202"
+  integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==
+  dependencies:
+    camelcase "^5.3.1"
+    cssesc "^3.0.0"
+    icss-utils "^4.1.1"
+    loader-utils "^1.2.3"
+    normalize-path "^3.0.0"
+    postcss "^7.0.23"
+    postcss-modules-extract-imports "^2.0.0"
+    postcss-modules-local-by-default "^3.0.2"
+    postcss-modules-scope "^2.1.1"
+    postcss-modules-values "^3.0.0"
+    postcss-value-parser "^4.0.2"
+    schema-utils "^2.6.0"
+
+cssesc@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
 cyclist@~0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
@@ -1119,7 +1162,7 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0:
     memory-fs "^0.4.0"
     tapable "^1.0.0"
 
-errno@^0.1.3, errno@~0.1.7:
+errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
   integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
@@ -1338,6 +1381,11 @@ fast-deep-equal@^2.0.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
   integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
 
+fast-deep-equal@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
+  integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
+
 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"
@@ -1793,6 +1841,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+  integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+  dependencies:
+    postcss "^7.0.14"
+
 ieee754@^1.1.4:
   version "1.1.13"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@@ -1815,6 +1870,11 @@ ignore-walk@^3.0.1:
   dependencies:
     minimatch "^3.0.4"
 
+image-size@~0.5.0:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
+
 import-lazy@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -1833,6 +1893,11 @@ imurmurhash@^0.1.4:
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -2194,6 +2259,31 @@ lcid@^2.0.0:
   dependencies:
     invert-kv "^2.0.0"
 
+less-loader@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466"
+  integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==
+  dependencies:
+    clone "^2.1.1"
+    loader-utils "^1.1.0"
+    pify "^4.0.1"
+
+less@^3.10.3:
+  version "3.10.3"
+  resolved "https://registry.yarnpkg.com/less/-/less-3.10.3.tgz#417a0975d5eeecc52cff4bcfa3c09d35781e6792"
+  integrity sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==
+  dependencies:
+    clone "^2.1.2"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    mime "^1.4.1"
+    mkdirp "^0.5.0"
+    promise "^7.1.1"
+    request "^2.83.0"
+    source-map "~0.6.0"
+
 load-json-file@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@@ -2370,7 +2460,7 @@ mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
   dependencies:
     mime-db "1.40.0"
 
-mime@1.6.0, mime@^1.6.0:
+mime@1.6.0, mime@^1.4.1, mime@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -2968,6 +3058,62 @@ posix-character-classes@^0.1.0:
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
   integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
 
+postcss-modules-extract-imports@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+  integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+  dependencies:
+    postcss "^7.0.5"
+
+postcss-modules-local-by-default@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
+  integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==
+  dependencies:
+    icss-utils "^4.1.1"
+    postcss "^7.0.16"
+    postcss-selector-parser "^6.0.2"
+    postcss-value-parser "^4.0.0"
+
+postcss-modules-scope@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba"
+  integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==
+  dependencies:
+    postcss "^7.0.6"
+    postcss-selector-parser "^6.0.0"
+
+postcss-modules-values@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+  integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+  dependencies:
+    icss-utils "^4.0.0"
+    postcss "^7.0.6"
+
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
+  integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+  dependencies:
+    cssesc "^3.0.0"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9"
+  integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==
+
+postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.26"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587"
+  integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
 prepend-http@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@@ -2988,6 +3134,13 @@ promise-inflight@^1.0.1:
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
   integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
 
+promise@^7.1.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+  dependencies:
+    asap "~2.0.3"
+
 proxy-addr@~2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
@@ -3202,7 +3355,7 @@ repeat-string@^1.6.1:
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
   integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
 
-request@^2.88.0:
+request@^2.83.0, request@^2.88.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
   integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@@ -3338,6 +3491,14 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
+schema-utils@^2.6.0, schema-utils@^2.6.4:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53"
+  integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==
+  dependencies:
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+
 semver-diff@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -3508,7 +3669,7 @@ source-map@^0.5.6:
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -3698,7 +3859,15 @@ strip-json-comments@~2.0.1:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
 
-supports-color@6.1.0:
+style-loader@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200"
+  integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==
+  dependencies:
+    loader-utils "^1.2.3"
+    schema-utils "^2.6.4"
+
+supports-color@6.1.0, supports-color@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
   integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
@@ -3891,6 +4060,11 @@ union@~0.4.3:
   dependencies:
     qs "~2.3.3"
 
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+  integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
 unique-filename@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"