[
  {
    "path": ".gitignore",
    "content": "__pycache__\n*.pyc\nsrc/ui/style.css\nbuilt/*\nnode_modules/\n*.log\ndist/*\nsrc/model/test.py\nprod/*\n.vscode/\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright 2020 Jesse Michel, Stefan Grosser, Zachary Holbrook, and Rikhav Shah\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software \r\nand associated documentation files (the \"Software\"), to deal in the Software without restriction, \r\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, \r\nsublicense, and/or sell copies of the Software, and to permit persons to whom the Software is \r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or \r\nsubstantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING \r\nBUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, \r\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# ENNUI\r\nENNUI is an Elegant Neural Network User Interface that allows users to:\r\n- Build neural network architectures with a drag and drop interface.\r\n- Train those networks on the browser.\r\n- Visualize the training process.\r\n- Export to Python.\r\n\r\nThanks to Gil Strang, it's hosted at [https://math.mit.edu/ENNUI/](https://math.mit.edu/ENNUI/)\r\n\r\n<img src=\"resources/ennui-resnet-train.png\" width=\"600px\"/>\r\n\r\n# Installation\r\nAfter cloning the repo, to install dependencies, run:\r\n`npm install`\r\n\r\nTo Build the app, run:\r\n`npm run build`\r\n\r\nFor Continuous Build and Integration, run:\r\n`npm run watch`\r\n\r\nTo use chrome with localhost and the CIFAR-10 Dataset, make sure to close\r\nall chrome windows and run the following command to launch chrome:\r\n'path/to/chrome.exe --allow-file-access-from-files'\r\n\r\n# Code Structure\r\nENNUI is frontend-only. The implementation is structed in two parts:\r\n- `ENNUI/src/ui` is home to the traditional frontend components such as the styling, the button logic, and the draggable components (e.g. the layers and activations).\r\n- `ENNUI/src/model` is the \"backend\" implementation supporting core functionality such as building neural networks, doing the code generation, and saving the state in the browser. \r\n"
  },
  {
    "path": "build_prod.sh",
    "content": "# Build\nnpm run build\n\n# Create the folder if it doesn't exist\nfolder=\"prod\"\nif [ ! -d \"$folder\" ]; then\n  mkdir $folder\nfi\n\n# Copy index.html\ncp ./index.html $folder\n# Fix the paths to style.css and bundle.js \nsed -i 's/src\\/ui\\///' $folder/index.html\nsed -i 's/dist\\///' $folder/index.html\n\n# Copy style.css\nuglifycss ./src/ui/style.css > $folder/style.css\n\n# Copy favicon\ncp ./favicon.ico $folder\n\n# Uglify and copy bundle.js\nuglifyjs --compress --mangle --wrap -- dist/bundle.js > $folder/bundle.js\n\ncp -R ./dist/ $folder/\n"
  },
  {
    "path": "index.html",
    "content": "<meta charset=\"utf-8\"/>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"description\" content=\"Welcome to ENNUI - An elegant neural network user interface which allows you to easily design, train, and visualize neural networks.\">\n\t<title>ENNUI ~ Elegant Neural Network User Interface ~</title>\n\n\t<!-- MathJax cdn to render latex -->\n\t<script type=\"text/javascript\" async\n\t\tsrc=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML\">\n  \t</script>\n\n\t<!-- JSON-LD markup generated by Google Structured Data Markup Helper. -->\n\t<script type=\"application/ld+json\">\n\t{\n\t  \"@context\" : \"http://schema.org\",\n\t  \"@type\" : \"SoftwareApplication\",\n\t  \"name\" : \"ENNUI ~ an elegant neural network user interface ~\",\n\t  \"author\" : [ {\n\t\t\"@type\" : \"Person\",\n\t\t\"name\" : \"Jesse Michel\"\n\t  }, {\n\t\t\"@type\" : \"Person\",\n\t\t\"name\" : \"Zack Holbrook\"\n\t  }, {\n\t\t\"@type\" : \"Person\",\n\t\t\"name\" : \"Stefan Grosser\"\n\t  }, {\n\t\t\"@type\" : \"Person\",\n\t\t\"name\" : \"Hendrik Strobelt\"\n\t  }, {\n\t\t\"@type\" : \"Person\",\n\t\t\"name\" : \"Rikhav Shah\"\n\t  } ]\n\t}\n\t</script>\n\n\t<!-- Global site tag (gtag.js) - Google Analytics -->\n\t<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-133726432-1\"></script>\n\n\t<script>\n\t\twindow.dataLayer = window.dataLayer || [];\n\t\tfunction gtag(){dataLayer.push(arguments);}\n\t\tgtag('js', new Date());\n\t\tgtag('config', 'UA-133726432-1');\n\t</script>\n\n\t<link rel=\"icon\" type=\"image/x-icon\" sizes=\"16x16\" href=\"favicon.ico\">\n\t<link rel='stylesheet' href='src/ui/style.css'>\n\t<script src='dist/bundle.js'></script>\n</head>\n\n<body>\n\n<h1 style=\"display:none\">ENNUI ~ Elegant Neural Network User Interface ~</h1>\n<p style=\"display:none\">ENNUI helps people learn about deep learning by building, training, and visualizing deep neural networks on the browser. It has an easy to use drag-and-drop interface. When you're ready to start coding you can export the network to produce code in Python or Julia! </p>\n\n\n<h6 style=\"display:none\">About ENNUI</h6>\n<p style=\"display:none\">\n\tENNUI provides several tools for all stages of deep learning development. The canvas gives space to design neural network architectures with a drag-and-drop interface. This design is easily sharable with friends and coworkers by exporting to a link. <br/>\n\tNot only can you design neural networks, you can train them on several datasets: MNIST, CIFAR-10, and more! During training, you can track your network loss and accuracies in the Progress tab, as well as view of confusion matrix. <br/>\n\tOnce training is complete, ENNUI provides a suite of neural network visualization tools to better understand your architecture. <br/>\n\tENNUI is constantly updated with new features, so be sure to keep following!\n</p>\n<div id = 'main'>\n\n\t<!-- The leftmost strip to select tabs -->\n\t<div id = 'tabselector'>\n\t\t<div id = 'blanktab' class='top_neighbor_tab-selected'> </div>\n\t\t<div title = 'Network' class = 'tab-selected option tab-option' id = 'network' data-optionValue = 'network'>\n\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16zm0-11.47L17.74 9 12 13.47 6.26 9 12 4.53z\"/></svg>\n\t\t</div>\n\t\t<div title = 'Progress' class = 'option tab-option bottom_neighbor_tab-selected' id = 'progress' data-optionValue = 'progress'>\n\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M13.5 13.48l-4-4L2 16.99l1.5 1.5 6-6.01 4 4L22 6.92l-1.41-1.41z\"/></svg>\n\t\t</div>\n\t\t<div title = 'Visualization' class = 'option tab-option' id = 'visualization' data-optionValue = 'visualization'>\n\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0z\"/><path d=\"M11 9h2v2h-2V9zm-2 2h2v2H9v-2zm4 0h2v2h-2v-2zm2-2h2v2h-2V9zM7 9h2v2H7V9zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z\"/></svg>\n\t\t</div>\n\t\t<div id = 'middleblanktab' > </div>\n\n\t\t<div title = 'Education' class = 'option tab-option' id = 'education' data-optionValue = 'education'>\n\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M12 3L1 9l4 2.18v6L12 21l7-3.82v-6l2-1.09V17h2V9L12 3zm6.82 6L12 12.72 5.18 9 12 5.28 18.82 9zM17 15.99l-5 2.73-5-2.73v-3.72L12 15l5-2.73v3.72z\"/></svg>\n\t\t</div>\n\t\t<div id = 'bottomblanktab' > </div>\n\t</div>\n\n\t<!-- The left panel (menu) -->\n\t<div id = 'menu'>\n\t\t<div id = 'networkMenu'>\n\t\t\t<div id = 'layers' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tLayers\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'dense'> Dense </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'conv2D'> Convolution </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'maxPooling2D'> Max Pooling </div>\n\n\n\t\t\t\t<div class = 'option-dropdown'>\n\t\t\t\t\t<div style=\"float:left\">More</div>\n\t\t\t\t\t<div style=\"float:right\">〉</div>\n\t\t\t\t\t<div class='dropdown-content left'>\n\t\t\t\t\t\t<div title = 'Modify batches of data during training to make them more similar, resulting in faster convergence and better results.'\n\t\t\t\t\t\t\t class = 'option select-option' data-optionValue = 'batchnorm'> Batch Normalization</div>\n\t\t\t\t\t\t<div title = 'Ignore a different random portion of the weights each batch for better generalization and faster training.'\n\t\t\t\t\t\t\t class = 'option select-option' data-optionValue = 'dropout'> Dropout</div>\n\t\t\t\t\t\t<div title = 'Flatten a list of 2D images into a 1D feature vector.'\n\t\t\t\t\t\t\t class = 'option select-option' data-optionValue = 'flatten'> Flatten</div>\n\t\t\t\t\t\t<div title = 'Concatenate two or more inputs that are all 1D or all 2D.'\n\t\t\t\t\t\t\t class = 'option select-option' data-optionValue = 'concatenate'> Concatenate</div>\n\t\t\t\t\t\t<div title = 'Add two or more inputs together.'\n\t\t\t\t\t\t\t class = 'option select-option last-dropdown' data-optionValue = 'add'> Add</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id = 'activations' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tActivations\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'relu'> ReLU </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'sigmoid'> Sigmoid </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'tanh'> Tanh </div>\n\t\t\t</div>\n\t\t\t<div id = 'templates' class = 'bottomCategory'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tTemplates\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'blank'> Blank </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'default'> Default </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = 'resnet'> ResNet </div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'progressMenu' style=\"display: none\">\n\t\t\t<div id = 'optimizers' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tOptimizers\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = \"defaultOptimizer\" class = 'option select-option selected' id = 'sgd' data-optionValue = 'sgd'> SGD </div>\n\t\t\t\t<div id = 'rmsprop' class = 'option select-option' data-optionValue = 'rmsprop'> RMSprop </div>\n\t\t\t\t<div id = 'adagrad' class = 'option select-option' data-optionValue = 'adagrad'> Adagrad </div>\n\t\t\t\t<div id = 'adam' class = 'option select-option' data-optionValue = 'adam'> Adam </div>\n\t\t\t</div>\n\t\t\t<div id = 'losses' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tLosses\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'defaultLoss' class = 'option select-option selected' data-optionValue = 'categoricalCrossentropy'>CrossEntropy</div>\n\t\t\t\t<div id = 'hinge' class = 'option select-option' data-optionValue = 'hinge'> Hinge </div>\n\t\t\t\t<div id = 'meanSquaredError' class = 'option select-option' data-optionValue = 'meanSquaredError'> MSE </div>\n\t\t\t\t<div id = 'meanAbsoluteError' class = 'option select-option' data-optionValue = 'meanAbsoluteError'> MAE </div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'visualizationMenu' style=\"display: none\">\n\t\t\t<div id = 'classes' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tClasses\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class = 'option select-option selected' data-optionValue = 'all'> All </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '0'> 0 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '1'> 1 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '2'> 2 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '3'> 3 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '4'> 4 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '5'> 5 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '6'> 6 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '7'> 7 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '8'> 8 </div>\n\t\t\t\t<div class = 'option select-option' data-optionValue = '9'> 9 </div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'educationMenu' style=\"display: none\">\n\t\t\t<div id = 'educationLayers' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tArticles\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Overview'> Overview </div>\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Overfitting'> Overfitting</div>\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'ResNets'> ResNets </div>\n\t\t\t</div>\n\n\t\t\t<div id = 'educationStory' class = 'category'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tLayers\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Concatenate'> Concatenate</div>\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Convolution'> Convolution </div>\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Dropout'> Dropout</div>\n\t\t\t\t<div class = 'option select-option education-option' data-optionValue = 'Flatten'> Flatten</div>\n\n\t\t\t</div>\n\n\t\t</div>\n\n\t</div>\n\n\t<!-- The middle canvas -->\n\t<div id = 'middle'>\n\n\t\t<div id = 'networkTab'>\n\t\t\t<svg id = 'svg'> </svg>\n\t\t</div>\n\n\t\t<div id = 'progressTab' style=\"display: none\">\n\n\t\t\t<div id=\"loss-canvas\"></div>\n\n\t\t\t<div id=\"accuracy-canvas\"></div>\n\n\t\t\t<div id=\"confusion-matrix-canvas\"></div>\n\t\t</div>\n\n\t\t<div id = 'visualizationTab' style=\"display: none\">\n\t\t\t<div id='visulaization'></div>\n\t\t\t<div id='images'></div>\n\t\t</div>\n\n\t\t<div id = 'informationOverlay'>\n\t\t\t<div id='information'>Welcome to ENNUI\n\t\t\t\t<div id=\"informationBody\">~ an elegant neural network user interface ~</div>\n\t\t\t\t<div class=\"informationRow\">\n\t\t\t\t\t<div class=\"informationColumn\">\n\t\t\t\t\t\tStart Building <br></br>\n\t\t\t\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"30%\" max-height=\"30%\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16zm0-11.47L17.74 9 12 13.47 6.26 9 12 4.53z\"/></svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"informationBlankColumn\"></div>\n\t\t\t\t\t<div id=\"informationEducation\" class=\"informationColumn\">\n\t\t\t\t\t\tExplore Deep Learning <br></br>\n\t\t\t\t\t\t<svg class = 'icon' xmlns=\"http://www.w3.org/2000/svg\" width=\"30%\" max-height=\"30%\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M12 3L1 9l4 2.18v6L12 21l7-3.82v-6l2-1.09V17h2V9L12 3zm6.82 6L12 12.72 5.18 9 12 5.28 18.82 9zM17 15.99l-5 2.73-5-2.73v-3.72L12 15l5-2.73v3.72z\"/></svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'acknowledgements'>\n\t\t\t\t\tDeveloped by (<a class=\"overlayLinks\" href=\"mailto:ennui-devs@mit.edu\">ennui-devs@mit.edu</a>) <br>\n\t\t\t\t\tJesse Michel, Zack Holbrook, Stefan Grosser, Rikhav Shah <br>\n\t\t\t\t\twith advising from <a class=\"overlayLinks\" href=\"http://hendrik.strobelt.com/\" target=\"_blank\">Hendrik Strobelt</a> and <a class=\"overlayLinks\" href=\"http://www-math.mit.edu/~gs/\" target=\"_blank\">Gilbert Strang</a>.<br>\n\t\t\t\t\tFirst prototyped at <a class=\"overlayLinks\" href=\"https://devpost.com/software/ennui\" target=\"_blank\">HackMIT</a>.\n\t\t\t\t\tOpen-sourced on <a class=\"overlayLinks\" href=\"https://github.com/martinjm97/ENNUI\" target=\"_blank\">GitHub</a>.\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'educationTab' style=\"display: none\">\n\t\t\t<div id=\"educationOverview\">\n\t\t\t\t<div class=\"educationTitle\" style=\"padding-top: 0px\"> Learn About Deep Neural Networks </div>\n\t\t\t\t<div class=\"educationSection\"> Introduction to ENNUI </div>\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\tIf you are new to ENNUI, a good place to start is to watch\n\t\t\t\t\tthe quick tutorial below:\n\t\t\t\t</div>\n\t\t\t\t<!--<iframe class=\"educationVideo\" src=\"https://www.youtube.com/embed/m0YnwAtPbb8\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe> -->\n\n\t\t\t\t<div style=\"text-align: center; font-size: 25px;\"><a href=\"https://www.youtube.com/watch?v=m0YnwAtPbb8\" target=\"blank\">ENNUI Tutorial</a></div>\n\t\t\t\t<div class=\"educationSection\"> Foundations of Deep Learning </div>\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\tIf you are new to machine learning, the lecture video below is an excellent introduction.\n\t\t\t\t\tThis lecture is from the 18.065 class from Spring of 2019. If you want to learn more check out the <a href=\"http://math.mit.edu/~gs/learningfromdata/\">learning from data textbook</a>.\n\t\t\t\t</div>\n\t\t\t\t<div style=\"text-align: center; font-size: 25px;\"><a href=\"https://video.odl.mit.edu/videos/9101a72a7d994d53800d1398fd885b88/embed/?start=339\" target=\"blank\">Gilbert Strang: Deep Learning</a></div>\n\t\t\t\t<!-- <iframe class=\"educationVideo\" src=\"https://video.odl.mit.edu/videos/9101a72a7d994d53800d1398fd885b88/embed/?start=339\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe> -->\n\t\t\t</div>\n\n\t\t\t<div id=\"educationConvolution\">\n\t\t\t\t<div class=\"educationTitle\"> Convolutional Nets </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Gilbert Strang</i></div>\n\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\t<p>The words <strong>weight sharing</strong> give the key idea of CNNs. The weight matrix <span class=\"math inline\">\\(A\\)</span> that connects one layer to the next layer has only a small number of independent entries. So optimizing those weights is much faster than for a fully-connected (dense) architecture.</p>\n\t\t\t\t\t<p>In a one-dimensional problem, suppose the inputs (layer zero) are given by a vector <span class=\"math inline\">\\(v = (v_1,...,v_n)\\)</span>. A convolution will multiply <span class=\"math inline\">\\(v\\)</span> by a weight matrix <span class=\"math inline\">\\(A\\)</span> with constant diagonals. Then the same set of weights (say 3 weights) is repeated all along the layer :</p>\n\t\t\t\t\t<p><span class=\"math display\">\\[A=\n\t\t\t\t\t\\begin{bmatrix}\n\t\t\t\t\t\ta_{-1} &amp; a_0 &amp; a_1 &amp;  &amp;  \\\\\n\t\t\t\t\t\t&amp; a_{-1} &amp; a_0 &amp; a_1 &amp;  \\\\\n\t\t\t\t\t\t&amp; &amp; a_{-1} &amp; a_0 &amp; a_1 \\\\\n\t\t\t\t\t\\end{bmatrix}\\]</span> This <span class=\"math inline\">\\(A\\)</span> has <span class=\"math inline\">\\(n = 5\\)</span> inputs and <span class=\"math inline\">\\(m = 3\\)</span> outputs. A is <strong>shift-invariant</strong>: a convolution = filter = Toeplitz matrix. Convolutions are especially important for images with many pixels. The <span class=\"math inline\">\\(3\\)</span> independent weights <span class=\"math inline\">\\(a_{-1}, a_0, a_1\\)</span> might change to <span class=\"math inline\">\\(3 \\times 3=9\\)</span> weights in 2D. Those 9 numbers are <span class=\"math inline\">\\(a_{ij}\\)</span> for <span class=\"math inline\">\\(i = -1,0,1\\)</span> and <span class=\"math inline\">\\(j = -1,0,1\\)</span>. An input with its 8 neighbors (in a <span class=\"math inline\">\\(3 \\times 3\\)</span> square) is multiplied by <span class=\"math inline\">\\(a_{00}\\)</span> and its <span class=\"math inline\">\\(8\\)</span> neighbors–that sum of 9 terms gives one output in <span class=\"math inline\">\\(Av\\)</span>. As usual, a bias vector <span class=\"math inline\">\\(b\\)</span> is added and each component of <span class=\"math inline\">\\(Av + b\\)</span> is activated (or not) by a function like ReLU : the new layer contains <span class=\"math inline\">\\(\\textrm{ReLU}(Av + b)\\)</span>.</p>\n\t\t\t\t\t<p>This 2D matrix <span class=\"math inline\">\\(A\\)</span> is not so easy to display. You should see that a <span class=\"math inline\">\\(3 \\times 3\\)</span> square around an input vector <span class=\"math inline\">\\(v\\)</span> of size <span class=\"math inline\">\\(n \\times n\\)</span> will produce an output <span class=\"math inline\">\\(Av\\)</span> of size <span class=\"math inline\">\\((n - 2) \\times (n - 2)\\)</span>, in the same way that 5 inputs gave 3 outputs in 1D. Notice that we only had <span class=\"math inline\">\\(3 \\times 3 = 9\\)</span> (or maybe <span class=\"math inline\">\\(5 \\times 5 = 25\\)</span>) independent weights in 2D, because the convolution not only <strong>shares weights</strong> but it is <strong>local</strong>.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"educationResNets\">\n\t\t\t\t<div class=\"educationTitle\"> Residual Networks (ResNets) </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Zack Holbrook</i> and <i>Jesse Michel</i></div>\n\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\t<p>In 2015, a research team at Microsoft won the <a href=\"http://www.image-net.org/challenges/LSVRC/\">ImageNet Large Scale Visual Recognition Challenge</a> with record performance using a ResNet. Since 2015, variants of ResNets have dominated the competition, exceeding human performance in the given task. They have become a popular choice of architecture for a broad variety of image recognition tasks and are relatively easy to implement and train.</p>\n\t\t\t\t\t<div class=\"educationSection\">ResNet Architecture</div>\n\t\t\t\t\t<p>ResNets are a type of convolutional neural network (CNN) that have <strong>identity shortcuts</strong>, which are paths through the network that skip layers, thereby creating shortcuts through the network. We provide a typical example of a ResNet below:\n\n\t\t\t\t\t\t<img class=\"educationImage\" src=\"dist/resnet.png\" alt=\"Resnet image\" width=\"50%\">\n\n\t\t\t\t\t\t<div class=\"modelLink\">\n\t\t\t\t\t\t\t<a class=\"modelLink\" target=\"_newtab\" href=\"http://math.mit.edu/ennui/#%7B%22graph%22:%5B%7B%22layer_name%22:%22Input%22,%22children_ids%22:%5B5,9%5D,%22parent_ids%22:%5B%5D,%22params%22:%7B%22dataset%22:%22mnist%22%7D,%22id%22:0,%22xPosition%22:100,%22yPosition%22:377%7D,%7B%22layer_name%22:%22Conv2D%22,%22children_ids%22:%5B6%5D,%22parent_ids%22:%5B0%5D,%22params%22:%7B%22filters%22:16,%22kernelSize%22:%5B3,3%5D,%22strides%22:%5B1,1%5D,%22activation%22:%22relu%22%7D,%22id%22:5,%22xPosition%22:169,%22yPosition%22:280%7D,%7B%22layer_name%22:%22Add%22,%22children_ids%22:%5B7,10%5D,%22parent_ids%22:%5B0,6%5D,%22params%22:%7B%22activation%22:%22relu%22%7D,%22id%22:9,%22xPosition%22:276,%22yPosition%22:411%7D,%7B%22layer_name%22:%22Conv2D%22,%22children_ids%22:%5B9%5D,%22parent_ids%22:%5B5%5D,%22params%22:%7B%22filters%22:16,%22kernelSize%22:%5B3,3%5D,%22strides%22:%5B1,1%5D%7D,%22id%22:6,%22xPosition%22:294,%22yPosition%22:280%7D,%7B%22layer_name%22:%22Conv2D%22,%22children_ids%22:%5B8%5D,%22parent_ids%22:%5B9%5D,%22params%22:%7B%22filters%22:16,%22kernelSize%22:%5B3,3%5D,%22strides%22:%5B1,1%5D,%22activation%22:%22relu%22%7D,%22id%22:7,%22xPosition%22:414,%22yPosition%22:280%7D,%7B%22layer_name%22:%22Add%22,%22children_ids%22:%5B11%5D,%22parent_ids%22:%5B9,8%5D,%22params%22:%7B%22activation%22:%22relu%22%7D,%22id%22:10,%22xPosition%22:521,%22yPosition%22:412%7D,%7B%22layer_name%22:%22Conv2D%22,%22children_ids%22:%5B10%5D,%22parent_ids%22:%5B7%5D,%22params%22:%7B%22filters%22:16,%22kernelSize%22:%5B3,3%5D,%22strides%22:%5B1,1%5D%7D,%22id%22:8,%22xPosition%22:541,%22yPosition%22:280%7D,%7B%22layer_name%22:%22Flatten%22,%22children_ids%22:%5B12%5D,%22parent_ids%22:%5B10%5D,%22params%22:%7B%7D,%22id%22:11,%22xPosition%22:708,%22yPosition%22:463%7D,%7B%22layer_name%22:%22Dense%22,%22children_ids%22:%5B13%5D,%22parent_ids%22:%5B11%5D,%22params%22:%7B%22units%22:32,%22activation%22:%22relu%22%7D,%22id%22:12,%22xPosition%22:702,%22yPosition%22:434%7D,%7B%22layer_name%22:%22Dropout%22,%22children_ids%22:%5B1%5D,%22parent_ids%22:%5B12%5D,%22params%22:%7B%22rate%22:0.5%7D,%22id%22:13,%22xPosition%22:778,%22yPosition%22:365%7D,%7B%22layer_name%22:%22Output%22,%22children_ids%22:%5B%5D,%22parent_ids%22:%5B13%5D,%22params%22:%7B%7D,%22id%22:1,%22xPosition%22:900,%22yPosition%22:377%7D%5D,%22hyperparameters%22:%7B%22learningRate%22:0.01,%22batchSize%22:64,%22optimizer_id%22:%22defaultOptimizer%22,%22epochs%22:6,%22loss_id%22:%22defaultLoss%22%7D%7D\">\n\t\t\t\t\t\t\t\tModel Link\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\tIdentity shortcuts mean that the learned parameters are residuals. Mathematically, if <span class=\"math inline\">\\(R(x)\\)</span> is a sequence of convolutional layers with ReLUs, known as a <strong>residual block</strong>, for example, let <span class=\"math display\">\\[R(x) = \\textrm{Conv}(\\textrm{ReLU}(\\textrm{Conv}(x))).\\]</span> Then the output of the residual block will be <span class=\"math inline\">\\(R(x) + x\\)</span>, where <span class=\"math inline\">\\(x\\)</span> is the identity pass-through. If the neural network is trying to approximate some function <span class=\"math inline\">\\(F(x)\\)</span>, then a perfect residual block <span class=\"math inline\">\\(R^*(x)\\)</span> will be such that <span class=\"math inline\">\\(R^*(x) = F(x) - x\\)</span>, which is exactly a residual after subtracting the input image.</p>\n\t\t\t\t\t<div class=\"educationSection\">Advantages of ResNets</div>\n\t\t\t\t\t<p>The amazing property of ResNets is its ability to scale well, leading to deeper neural networks that still train well. As networks get larger, a number of problems arise.</p>\n\t\t\t\t\t<p>Large networks tend to train slowly, but the <strong>weight sharing</strong> of CNNs mean that each residual block has relatively few parameters to train. Large networks also tend to have the problem of the <strong>vanishing gradient</strong> – where weight updates from gradient descent diminish to the point where the network does not improve even with more training time. The identity shortcuts in ResNets give a path for the gradients to flow, avoiding the problem of the vanishing gradient.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"educationFlatten\">\n\t\t\t\t<div class=\"educationTitle\"> Flatten Layers </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Zack Holbrook</i> and <i>Jesse Michel</i></div>\n\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\t<p>The flatten layer takes in a multidimensional input and produces a single dimensional output. For example, the CIFAR dataset is a collection of images which is 3-dimensional since it is a collection of 2-dimensional images that are 32x32 pixels and has 3 color channels (Red, Green, Blue). A Flatten layer could take data from this dataset as an input, and would produce a 1 dimensional vector of size 32*32*3 = 3072.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"educationConcatenate\">\n\t\t\t\t<div class=\"educationTitle\"> Concatenate Layers </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Zack Holbrook</i> and <i>Jesse Michel</i></div>\n\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\t<p>A concatenate layer takes two or more layers and concatenates the outputs into a single output by stacking the inputs. For example, it would concatenate two vectors of size 10 into a vector of size 20 by stacking one on top of the other.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"educationDropout\">\n\t\t\t\t<div class=\"educationTitle\"> Dropout Layers </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Stefan Grosser</i> and <i>Jesse Michel</i></div>\n\n\t\t\t\t<div class=\"educationContent\">\n\t\t\t\t\t<p>Dropout layers ignore a random fraction of the incoming units during training time. For example, if the rate is 0.1, then on each forward pass the dropout layer will randomly select 10% of the weights and assign them to 0. Adding a dropout layer with a rate of 0 will make no change to the network, while a rate of 1 will have the dropout layer output 0.</p>\n\n\t\t\t\t\t<p>Dropout is commonly used to prevent <strong>overfitting</strong> (for more information, see our write-up on the topic). One may think of dropout as having the network learn a collection of weak classifiers that during testing come together to create a more powerful classifier. For those who are familiar with this terminology, it is boosting using an ensemble model. It also has the convenient property of speeding up training since fewer weights are required in each forward pass.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"educationOverfitting\">\n\t\t\t\t<div class=\"educationTitle\"> Overfitting </div>\n\t\t\t\t<div class=\"educationAuthor\">by <i>Stefan Grosser</i> and <i>Jesse Michel</i></div>\n\t\t\t\t<div class=\"educationContent\">\n\n\t\t\t\t\t<p>A neural network sometimes learns too well. It identifies trends specific only to the training data and thus fails to <strong>generalize</strong>. This problem of fitting the training data too closely is called <strong>overfitting</strong>. The following figure shows the decision boundary – the curve that determines the prediction of the classifier – in the cases of underfitting, fitting well (normal), and overfitting.</p>\n\n\t\t\t\t\t<img class=\"educationImage\" src=\"dist/overfitti_ng.png\" alt=\"Possible decision boundaries \" />\n\t\t\t\t\t<div class=\"modelLink\">\n\t\t\t\t\t\t\t<a class=\"modelLink\" target=\"_newtab\" href=\"http://mlwiki.org/index.php/Overfitting\">\n\t\t\t\t\t\t\t\tSource: ML Wiki\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p>When a classifier overfits, it performs far better on the training data than on the test data. Therefore, the training accuracy will be much higher than the validation accuracy and the training loss will be much lower than the validation loss. We have provided an example of this below. </p>\n\n\t\t\t\t\t<img class=\"educationImage\" style=\"float: left; max-width: 50%;\" src=\"dist/loss_overfit.png\" title=\"fig:\" alt=\"Visualization of overfitting during training\" />\n\n\n\t\t\t\t\t<img class=\"educationImage\" style=\"float: right; max-width: 50%;\" src=\"dist/accuracy_overfit.png\" title=\"fig:\" alt=\"Visualization of overfitting during training\" />\n\n\t\t\t\t\t<div style=\"margin-top:10px;\">\n\t\t\t\t\t\t<!-- TODO: padding above -->\n\t\t\t\t\t\tThe architecture used for this example is shown below.\n\t\t\t\t\t</div>\n\n\n\t\t\t\t\t<div class=\"figure\">\n\n\t\t\t\t\t\t<img class=\"educationImage\" style=\"max-width: 50%;\" src=\"dist/overfitting_network.png\" alt=\"Network architecture\" >\n\n\n\t\t\t\t\t\t<div class=\"modelLink\">\n\t\t\t\t\t\t\t\t<a class=\"modelLink\" target=\"_newtab\" href=\"https://math.mit.edu/ennui/#%7B%22graph%22:%5B%7B%22layer_name%22:%22Input%22,%22children_ids%22:%5B2%5D,%22parent_ids%22:%5B%5D,%22params%22:%7B%22dataset%22:%22cifar%22%7D,%22id%22:0,%22xPosition%22:100,%22yPosition%22:399%7D,%7B%22layer_name%22:%22Conv2D%22,%22children_ids%22:%5B3%5D,%22parent_ids%22:%5B0%5D,%22params%22:%7B%22filters%22:16,%22kernelSize%22:%5B3,3%5D,%22strides%22:%5B1,1%5D,%22kernelRegularizer%22:%22none%22,%22regScale%22:0.1,%22activation%22:%22relu%22%7D,%22id%22:2,%22xPosition%22:261,%22yPosition%22:453%7D,%7B%22layer_name%22:%22Flatten%22,%22children_ids%22:%5B1%5D,%22parent_ids%22:%5B2%5D,%22params%22:%7B%7D,%22id%22:3,%22xPosition%22:585,%22yPosition%22:484%7D,%7B%22layer_name%22:%22Output%22,%22children_ids%22:%5B%5D,%22parent_ids%22:%5B3%5D,%22params%22:%7B%7D,%22id%22:1,%22xPosition%22:900,%22yPosition%22:399%7D%5D,%22hyperparameters%22:%7B%22learningRate%22:0.1,%22batchSize%22:64,%22optimizer_id%22:%22defaultOptimizer%22,%22epochs%22:15,%22loss_id%22:%22defaultLoss%22%7D%7D\">\n\t\t\t\t\t\t\t\t\tModel Link\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<br/><br/>\n\t\t\t\t\t<p>Overfitting exemplifies why cross validation is so important; without a validation set, we would not be able to identify that the model will fail to generalize.</p>\n\t\t\t\t\t<p>So, how can we combat overfitting and make sure that a model finds generalizable traits?</p>\n\t\t\t\t\t<div class=\"educationSection\">Regularization</div>\n\t\t\t\t\t<p>One way to prevent overfitting is regularization, which takes the form of adding in a new term that guides the model towards a simpler solution. Recall that in classification problems we begin with pairs of inputs and their classifications <span class=\"math display\">\\[(x_1, y_1), (x_2, y_2), \\dots, (x_n, y_n).\\]</span> From this, we want to find a function <span class=\"math inline\">\\(f\\)</span> that will accurately predict the classes of new samples of data. So if our original problem was <span class=\"math display\">\\[\\min_f \\sum_{i=1}^{n} C(f(x_i), y_i),\\]</span> where <span class=\"math inline\">\\(C\\)</span> calculates the cost of predicting <span class=\"math inline\">\\(f(x_i)\\)</span> when the true value is <span class=\"math inline\">\\(y_i\\)</span>, then the regularized loss will be <span class=\"math display\">\\[\\min_f \\sum_{i=1}^{n} C(f(x_i), y_i) + \\lambda R(f),\\]</span> where <span class=\"math inline\">\\(R(f)\\)</span> is the regularization term that is defined to be larger when <span class=\"math inline\">\\(f\\)</span> is more complex and <span class=\"math inline\"> \\(\\lambda>0\\) </span> is a tunable parameter controlling the amount of regularization. There are various definitions of how complex a layer is, but in our case we will say that a layer with a lower <span class=\"math inline\">\\(L2\\)</span>-norm is less complex. Formally, we define <span class=\"math inline\">\\(L2\\)</span>-norm for a matrix <span class=\"math inline\">\\(A\\)</span> as <span class=\"math display\">\\[\\text{norm}(A) = \\sqrt{\\sum_i \\sum_j a_{ij}^2}.\\]</span> For example, given matrix <span class=\"math display\">\\[A =\n\t\t\t\t\t\\begin{bmatrix}\n\t\t\t\t\t1 &amp; 2 \\\\\n\t\t\t\t\t0 &amp; -2\n\t\t\t\t\t\\end{bmatrix},\\]</span> the L2-norm is <span class=\"math display\">\\[||A||_2 = \\sqrt{1^2 + 2^2 + 0^2 + (-2)^2} = 3.\\]</span></p>\n\t\t\t\t\t<p>There are several reasons why penalizing an increased <span class=\"math inline\">\\(L2\\)</span>-norm is a reasonable action. If we assume that a classifier is going to overfit, then adding in the penalty <span class=\"math inline\">\\(\\lambda R(f)\\)</span> will guide the decision boundary away from that state. This can be seen as adding “wiggle room&quot; to the classifier. Moreover, this penalty of a high <span class=\"math inline\">\\(L2\\)</span>-norm is a way to encourage discarding useless information. The penalty term drives layer weights to be smaller, and the closer a layer weight gets to zero, the smaller its impact is as a feature.</p>\n\t\t\t\t\t<p>This notion of complexity leads to <span class=\"math inline\">\\(L1\\)</span>- and <span class=\"math inline\">\\(L2\\)</span>-norms becoming forms of regularization. In the case of <span class=\"math inline\">\\(L2\\)</span>-regularization, we can add <span class=\"math inline\">\\(\\lambda ||W||_2\\)</span> to our loss function for a given layer <span class=\"math inline\">\\(W.\\)</span> There are other ways to regularize, but for now let us take a look at a different approach. </p>\n\t\t\t\t\t<!-- TODO: Maybe explain L1-regularization in the future -->\n\t\t\t\t\t<div class=\"educationSection\">Dropout</div>\n\t\t\t\t\t<p>Another way to fight overfitting is a technique known as dropout. Dropout layers ignore a random fraction of the input units during training time (see our explanation on dropout layers for more information). There are two intuitions for why dropout helps prevent overfitting. Dropout can be seen a type of ensemble learning -- taking a collection of weak (underfit) classifiers and combing their classifications in some way, e.g., taking the majority class. For each batch, a new section of the network is trained as a weak classifier. During validation, the whole network is used, effectively combining all of the classifiers to provide a single result. Another view is that over many runs, dropout forces all parts of a network architecture to be used. Therefore, no one feature of the training set will be too influential, avoiding the network from focusing on artifacts that are only specific to the training set.</p>\n\t\t\t\t\t<div class=\"educationSection\">Conclusion</div>\n\t\t\t\t\t<p>Overfitting hinders the performance of classifiers on unseen data. Regularization and dropout are two widely-used and easy-to-implement approaches for combatting overfitting. Combining these methods with cross validation makes it far easier to build more generalizable models.</p>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\n\n\t\t\t<div style=\"height:100px;\"> </div>\n\n\n\t\t</div>\n\n\t\t<div id = 'loadingDataTab' style=\"display: none\">\n\t\t\t<div id='loadingMNIST'>\n\t\t\t\tLoading <span id=\"datasetLoadingName\">MNIST</span> dataset\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Error popup -->\n\t\t<div id = 'error' style=\"display: none\">\n\t\t\t<svg id = 'x' xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/></svg>\n\t\t\t<div id = 'errorMessage'> </div>\n\t\t</div>\n\n\t</div>\n\n\n\t<!-- The right panel -->\n\t<div id = 'paramshell'>\n\t\t<div class = 'trainbox' id = 'trainbox'>\n\t\t\t<div id = 'train' class = 'train' data-actionType = 'json'> Train </div>\n\t\t</div>\n\n\t\t<div class = 'category' id = 'kerasinfo'>\n\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t<div class='expander'>\n\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\tModel Status\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class = 'parambox'>\n\t\t\t\t<div id = 'ti_training' class = 'paramline'>\n\t\t\t\t\t<div class = 'paramname'>Training:</div>\n\t\t\t\t\t<div class = 'paramvalue'>No</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'ti_acc' class = 'paramline'>\n\t\t\t\t\t<div class = 'paramname'>Accuracy:</div>\n\t\t\t\t\t<div class = 'paramvalue'>N/A</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'ti_loss' class = 'paramline'>\n\t\t\t\t\t<div class = 'paramname'>Loss:</div>\n\t\t\t\t\t<div class = 'paramvalue'>N/A</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'ti_vacc' class = 'paramline'>\n\t\t\t\t\t<div class = 'paramname'>Validation Acc:</div>\n\t\t\t\t\t<div class = 'paramvalue'>N/A</div>\n\t\t\t\t</div>\n\t\t\t\t<div id = 'ti_vloss' class = 'paramline'>\n\t\t\t\t\t<div class = 'paramname'>Validation Loss:</div>\n\t\t\t\t\t<div class = 'paramvalue'>N/A</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"category\">\n\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t<div class='expander'>\n\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\tShare\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div id=\"exportPython\" class=\"select-option right-option\">Export to Python</div>\n\t\t\t<div id=\"exportJulia\" class=\"select-option right-option\">Export to Julia</div>\n\t\t\t<div id=\"copyModel\" class=\"select-option right-option\">Copy model link</div>\n\t\t</div>\n\t\t<div id = 'networkParamshell'>\n\n\t\t\t<div class = 'category' id='paramtruck'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tParameters\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div id='defaultparambox' class = 'parambox'>Click on a layer to view and change its parameters.</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'progressParamshell' style=\"display: none\">\n\t\t\t<div class = 'category' id='paramtruck'>\n\t\t\t\t<div class = 'categoryTitle' data-expanded = 'true'>\n\t\t\t\t\t<div class='expander'>\n\t\t\t\t\t\t<svg height=\"24px\" width=\"24px\">\n\t\t\t\t\t\t\t<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" style=\"fill:#FFFFFF;\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class='categoryTitleText'>\n\t\t\t\t\t\tHyperparams\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class = 'parambox'>\n\t\t\t\t\t<div class = 'paramline'>\n\t\t\t\t\t\t<div class=\"paramname\" data-name=\"lr\">Learning rate: </div>\n\t\t\t\t\t\t<input id=\"learningRate\" class=\"paramvalue hyperparamvalue\" value=\"0.01\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class = 'paramline'>\n\t\t\t\t\t\t<div class=\"paramname\" data-name=\"epochs\">Epochs: </div>\n\t\t\t\t\t\t<input id=\"epochs\" class=\"paramvalue hyperparamvalue\" value=\"6\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class = 'paramline'>\n\t\t\t\t\t\t<div class=\"paramname\" data-name=\"lr\">Batch Size: </div>\n\t\t\t\t\t\t<input id=\"batchSize\" class=\"paramvalue hyperparamvalue\" value=\"64\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id = 'visualizationParamshell' style=\"display: none\">\n\t\t</div>\n\n\t\t<div id = 'educationParamshell' style=\"display: none\">\n\t\t</div>\n\n\t</div>\n\n</div>\n<div id='footer'>\n\t<a href='https://accessibility.mit.edu'>Accessibility</a>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "npm-shrinkwrap.json",
    "content": "{\r\n  \"name\": \"ennui\",\r\n  \"version\": \"0.1.0\",\r\n  \"lockfileVersion\": 1,\r\n  \"requires\": true,\r\n  \"dependencies\": {\r\n    \"@babel/code-frame\": {\r\n      \"version\": \"7.8.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz\",\r\n      \"integrity\": \"sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"@babel/highlight\": \"^7.8.3\"\r\n      }\r\n    },\r\n    \"@babel/highlight\": {\r\n      \"version\": \"7.8.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz\",\r\n      \"integrity\": \"sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"chalk\": \"^2.0.0\",\r\n        \"esutils\": \"^2.0.2\",\r\n        \"js-tokens\": \"^4.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-styles\": {\r\n          \"version\": \"3.2.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\r\n          \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"color-convert\": \"^1.9.0\"\r\n          }\r\n        },\r\n        \"chalk\": {\r\n          \"version\": \"2.4.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\r\n          \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.1\",\r\n            \"escape-string-regexp\": \"^1.0.5\",\r\n            \"supports-color\": \"^5.3.0\"\r\n          }\r\n        },\r\n        \"supports-color\": {\r\n          \"version\": \"5.5.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\r\n          \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"has-flag\": \"^3.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"@protobufjs/aspromise\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz\",\r\n      \"integrity\": \"sha1-m4sMxmPWaafY9vXQiToU00jzD78=\"\r\n    },\r\n    \"@protobufjs/base64\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==\"\r\n    },\r\n    \"@protobufjs/codegen\": {\r\n      \"version\": \"2.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz\",\r\n      \"integrity\": \"sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==\"\r\n    },\r\n    \"@protobufjs/eventemitter\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-NVy8mLr61ZePntCV85diHx0Ga3A=\"\r\n    },\r\n    \"@protobufjs/fetch\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=\",\r\n      \"requires\": {\r\n        \"@protobufjs/aspromise\": \"^1.1.1\",\r\n        \"@protobufjs/inquire\": \"^1.1.0\"\r\n      }\r\n    },\r\n    \"@protobufjs/float\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=\"\r\n    },\r\n    \"@protobufjs/inquire\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=\"\r\n    },\r\n    \"@protobufjs/path\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz\",\r\n      \"integrity\": \"sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=\"\r\n    },\r\n    \"@protobufjs/pool\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=\"\r\n    },\r\n    \"@protobufjs/utf8\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=\"\r\n    },\r\n    \"@tensorflow/tfjs\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.5.1.tgz\",\r\n      \"integrity\": \"sha512-WiE+JQ3ibr5LibGiBz6HWUqLJW8HiX6ywUSCA7ehZ67vFsw4mPuVjv0WEEUfD/l47PkXYVAmWd+RYOJiuZC7Eg==\",\r\n      \"requires\": {\r\n        \"@tensorflow/tfjs-converter\": \"1.5.1\",\r\n        \"@tensorflow/tfjs-core\": \"1.5.1\",\r\n        \"@tensorflow/tfjs-data\": \"1.5.1\",\r\n        \"@tensorflow/tfjs-layers\": \"1.5.1\"\r\n      }\r\n    },\r\n    \"@tensorflow/tfjs-converter\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.5.1.tgz\",\r\n      \"integrity\": \"sha512-M9tl2/ep8ntcZpmncHwKuvThsS7TaUWqJ9vJSgJmkazwTfAvlAJmZ8/p1miJ+m5sH1EJO4oTjiEmch6g8IA5IQ==\"\r\n    },\r\n    \"@tensorflow/tfjs-core\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.5.1.tgz\",\r\n      \"integrity\": \"sha512-N4fsi8mLsRwRs8UJN2cARB1rYFxyVXkLyZ4wOusiR976BwwZbCwQrTTSIPzPqYT3rwiexEUzm7sM6ZaDl5dpXA==\",\r\n      \"requires\": {\r\n        \"@types/offscreencanvas\": \"~2019.3.0\",\r\n        \"@types/seedrandom\": \"2.4.27\",\r\n        \"@types/webgl-ext\": \"0.0.30\",\r\n        \"@types/webgl2\": \"0.0.4\",\r\n        \"node-fetch\": \"~2.1.2\",\r\n        \"seedrandom\": \"2.4.3\"\r\n      }\r\n    },\r\n    \"@tensorflow/tfjs-data\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.5.1.tgz\",\r\n      \"integrity\": \"sha512-eu4X0tHS1Tng+cvMO9gkMhUWX/UZQ//VpiaZfQJfa3zvUgxw6s1MHJFb0JC1T1FOnEgDVriZ8G758ysJZOybog==\",\r\n      \"requires\": {\r\n        \"@types/node-fetch\": \"^2.1.2\",\r\n        \"node-fetch\": \"~2.1.2\"\r\n      }\r\n    },\r\n    \"@tensorflow/tfjs-layers\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.5.1.tgz\",\r\n      \"integrity\": \"sha512-DyuhifqflK+bdpBRLAj3RuWm1eTVe8yNX2+WH+W+wmhpjGg7Yagnar6/66JdS2h3WUFoiplCpZRAVMVw631E5g==\"\r\n    },\r\n    \"@tensorflow/tfjs-vis\": {\r\n      \"version\": \"0.4.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-vis/-/tfjs-vis-0.4.2.tgz\",\r\n      \"integrity\": \"sha512-WMe6Xr3WIeKm4lme2Hz4IRwPnObTOD/eyBUc5vTS2DIXGqK2N9KjzundW3DS2UOFXDicN85bEyHqq6xBaLsNyg==\",\r\n      \"requires\": {\r\n        \"d3-format\": \"^1.3.0\",\r\n        \"d3-selection\": \"^1.3.0\",\r\n        \"glamor\": \"^2.20.40\",\r\n        \"glamor-tachyons\": \"^1.0.0-alpha.1\",\r\n        \"preact\": \"^8.2.9\",\r\n        \"vega-embed\": \"3.28.0\",\r\n        \"vega-lib\": \"4.4.0\",\r\n        \"vega-lite\": \"3.0.0-rc10\"\r\n      },\r\n      \"dependencies\": {\r\n        \"vega-lite\": {\r\n          \"version\": \"3.0.0-rc10\",\r\n          \"resolved\": \"https://registry.npmjs.org/vega-lite/-/vega-lite-3.0.0-rc10.tgz\",\r\n          \"integrity\": \"sha512-xgoOXmVdd2j89D6i44JHjozUy7Z4Mw9bcqFySzm77JDUV0BWLrnM61QmaS8ZwAZQbMcmdCTCJ//HgClH2gFZoQ==\",\r\n          \"requires\": {\r\n            \"fast-deep-equal\": \"^2.0.1\",\r\n            \"json-stable-stringify\": \"^1.0.1\",\r\n            \"json-stringify-pretty-compact\": \"^1.2.0\",\r\n            \"tslib\": \"^1.9.3\",\r\n            \"vega-event-selector\": \"^2.0.0\",\r\n            \"vega-typings\": \"0.3.51\",\r\n            \"vega-util\": \"^1.7.0\",\r\n            \"yargs\": \"^12.0.5\"\r\n          }\r\n        },\r\n        \"vega-typings\": {\r\n          \"version\": \"0.3.51\",\r\n          \"resolved\": \"https://registry.npmjs.org/vega-typings/-/vega-typings-0.3.51.tgz\",\r\n          \"integrity\": \"sha512-8UJnlGIZLDYzlLgMJVHO8Yb8yU7pYeNGnW8J7nxgyXqurowovmPM9fV+V49vzbQnZl4/Qq14wGqm9yM7iqZl8g==\",\r\n          \"requires\": {\r\n            \"vega-util\": \"^1.7.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"@types/clone\": {\r\n      \"version\": \"0.1.30\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz\",\r\n      \"integrity\": \"sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=\"\r\n    },\r\n    \"@types/d3\": {\r\n      \"version\": \"5.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3/-/d3-5.7.2.tgz\",\r\n      \"integrity\": \"sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw==\",\r\n      \"requires\": {\r\n        \"@types/d3-array\": \"^1\",\r\n        \"@types/d3-axis\": \"*\",\r\n        \"@types/d3-brush\": \"*\",\r\n        \"@types/d3-chord\": \"*\",\r\n        \"@types/d3-collection\": \"*\",\r\n        \"@types/d3-color\": \"*\",\r\n        \"@types/d3-contour\": \"*\",\r\n        \"@types/d3-dispatch\": \"*\",\r\n        \"@types/d3-drag\": \"*\",\r\n        \"@types/d3-dsv\": \"*\",\r\n        \"@types/d3-ease\": \"*\",\r\n        \"@types/d3-fetch\": \"*\",\r\n        \"@types/d3-force\": \"*\",\r\n        \"@types/d3-format\": \"*\",\r\n        \"@types/d3-geo\": \"*\",\r\n        \"@types/d3-hierarchy\": \"*\",\r\n        \"@types/d3-interpolate\": \"*\",\r\n        \"@types/d3-path\": \"*\",\r\n        \"@types/d3-polygon\": \"*\",\r\n        \"@types/d3-quadtree\": \"*\",\r\n        \"@types/d3-random\": \"*\",\r\n        \"@types/d3-scale\": \"*\",\r\n        \"@types/d3-scale-chromatic\": \"*\",\r\n        \"@types/d3-selection\": \"*\",\r\n        \"@types/d3-shape\": \"*\",\r\n        \"@types/d3-time\": \"*\",\r\n        \"@types/d3-time-format\": \"*\",\r\n        \"@types/d3-timer\": \"*\",\r\n        \"@types/d3-transition\": \"*\",\r\n        \"@types/d3-voronoi\": \"*\",\r\n        \"@types/d3-zoom\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-array\": {\r\n      \"version\": \"1.2.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz\",\r\n      \"integrity\": \"sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==\"\r\n    },\r\n    \"@types/d3-axis\": {\r\n      \"version\": \"1.0.12\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz\",\r\n      \"integrity\": \"sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==\",\r\n      \"requires\": {\r\n        \"@types/d3-selection\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-brush\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.10.tgz\",\r\n      \"integrity\": \"sha512-J8jREATIrfJaAfhJivqaEKPnJsRlwwrOPje+ABqZFgamADjll+q9zaDXnYyjiGPPsiJEU+Qq9jQi5rECxIOfhg==\",\r\n      \"requires\": {\r\n        \"@types/d3-selection\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-chord\": {\r\n      \"version\": \"1.0.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz\",\r\n      \"integrity\": \"sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==\"\r\n    },\r\n    \"@types/d3-collection\": {\r\n      \"version\": \"1.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz\",\r\n      \"integrity\": \"sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==\"\r\n    },\r\n    \"@types/d3-color\": {\r\n      \"version\": \"1.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz\",\r\n      \"integrity\": \"sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw==\"\r\n    },\r\n    \"@types/d3-contour\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.0.tgz\",\r\n      \"integrity\": \"sha1-GkCLEh+l40H3FeMFUwPvMHn8frA=\",\r\n      \"requires\": {\r\n        \"@types/d3-array\": \"*\",\r\n        \"@types/geojson\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-dispatch\": {\r\n      \"version\": \"1.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz\",\r\n      \"integrity\": \"sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==\"\r\n    },\r\n    \"@types/d3-drag\": {\r\n      \"version\": \"1.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz\",\r\n      \"integrity\": \"sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==\",\r\n      \"requires\": {\r\n        \"@types/d3-selection\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-dsv\": {\r\n      \"version\": \"1.0.36\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz\",\r\n      \"integrity\": \"sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==\"\r\n    },\r\n    \"@types/d3-ease\": {\r\n      \"version\": \"1.0.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.9.tgz\",\r\n      \"integrity\": \"sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==\"\r\n    },\r\n    \"@types/d3-fetch\": {\r\n      \"version\": \"1.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.1.5.tgz\",\r\n      \"integrity\": \"sha512-o9c0ItT5/Gl3wbNuVpzRnYX1t3RghzeWAjHUVLuyZJudiTxC4f/fC0ZPFWLQ2lVY8pAMmxpV8TJ6ETYCgPeI3A==\",\r\n      \"requires\": {\r\n        \"@types/d3-dsv\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-force\": {\r\n      \"version\": \"1.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz\",\r\n      \"integrity\": \"sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==\"\r\n    },\r\n    \"@types/d3-format\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==\"\r\n    },\r\n    \"@types/d3-geo\": {\r\n      \"version\": \"1.11.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz\",\r\n      \"integrity\": \"sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==\",\r\n      \"requires\": {\r\n        \"@types/geojson\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-hierarchy\": {\r\n      \"version\": \"1.1.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz\",\r\n      \"integrity\": \"sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==\"\r\n    },\r\n    \"@types/d3-interpolate\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==\",\r\n      \"requires\": {\r\n        \"@types/d3-color\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-path\": {\r\n      \"version\": \"1.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz\",\r\n      \"integrity\": \"sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==\"\r\n    },\r\n    \"@types/d3-polygon\": {\r\n      \"version\": \"1.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz\",\r\n      \"integrity\": \"sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==\"\r\n    },\r\n    \"@types/d3-quadtree\": {\r\n      \"version\": \"1.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz\",\r\n      \"integrity\": \"sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==\"\r\n    },\r\n    \"@types/d3-random\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==\"\r\n    },\r\n    \"@types/d3-scale\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-kNTkbZQ+N/Ip8oX9PByXfDLoCSaZYm+VUOasbmsa6KD850/ziMdYepg/8kLg2plHzoLANdMqPoYQbvExevLUHg==\",\r\n      \"requires\": {\r\n        \"@types/d3-time\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-scale-chromatic\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-Ny3rLbV5tnmqgW7w/poCcef4kXP8mHPo/p8EjTS5d9OUk8MlqAeRaM8eF7Vyv7QMLiIXNE94Pa1cMLSPkXQBoQ==\"\r\n    },\r\n    \"@types/d3-selection\": {\r\n      \"version\": \"1.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz\",\r\n      \"integrity\": \"sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==\"\r\n    },\r\n    \"@types/d3-shape\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==\",\r\n      \"requires\": {\r\n        \"@types/d3-path\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-time\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz\",\r\n      \"integrity\": \"sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==\"\r\n    },\r\n    \"@types/d3-time-format\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==\"\r\n    },\r\n    \"@types/d3-timer\": {\r\n      \"version\": \"1.0.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz\",\r\n      \"integrity\": \"sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==\"\r\n    },\r\n    \"@types/d3-transition\": {\r\n      \"version\": \"1.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.5.tgz\",\r\n      \"integrity\": \"sha512-4IexeQEmEk2u5/ZxqHPCiKxX+sn7uPsg+wb6zL3KLqj8jFlhcueAo3a5Tj1Z74VBeeeQjirdSFNtR87Gox/iwA==\",\r\n      \"requires\": {\r\n        \"@types/d3-selection\": \"*\"\r\n      }\r\n    },\r\n    \"@types/d3-voronoi\": {\r\n      \"version\": \"1.1.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz\",\r\n      \"integrity\": \"sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==\"\r\n    },\r\n    \"@types/d3-zoom\": {\r\n      \"version\": \"1.7.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz\",\r\n      \"integrity\": \"sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==\",\r\n      \"requires\": {\r\n        \"@types/d3-interpolate\": \"*\",\r\n        \"@types/d3-selection\": \"*\"\r\n      }\r\n    },\r\n    \"@types/fast-json-stable-stringify\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==\"\r\n    },\r\n    \"@types/file-saver\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==\"\r\n    },\r\n    \"@types/geojson\": {\r\n      \"version\": \"7946.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz\",\r\n      \"integrity\": \"sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==\"\r\n    },\r\n    \"@types/long\": {\r\n      \"version\": \"3.0.32\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz\",\r\n      \"integrity\": \"sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==\"\r\n    },\r\n    \"@types/node\": {\r\n      \"version\": \"13.1.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-13.1.7.tgz\",\r\n      \"integrity\": \"sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg==\"\r\n    },\r\n    \"@types/node-fetch\": {\r\n      \"version\": \"2.5.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.4.tgz\",\r\n      \"integrity\": \"sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ==\",\r\n      \"requires\": {\r\n        \"@types/node\": \"*\"\r\n      }\r\n    },\r\n    \"@types/offscreencanvas\": {\r\n      \"version\": \"2019.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz\",\r\n      \"integrity\": \"sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==\"\r\n    },\r\n    \"@types/seedrandom\": {\r\n      \"version\": \"2.4.27\",\r\n      \"resolved\": \"http://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz\",\r\n      \"integrity\": \"sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=\"\r\n    },\r\n    \"@types/webgl-ext\": {\r\n      \"version\": \"0.0.30\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz\",\r\n      \"integrity\": \"sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==\"\r\n    },\r\n    \"@types/webgl2\": {\r\n      \"version\": \"0.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz\",\r\n      \"integrity\": \"sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==\"\r\n    },\r\n    \"@webassemblyjs/ast\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/helper-module-context\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.8.5\",\r\n        \"@webassemblyjs/wast-parser\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/floating-point-hex-parser\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==\"\r\n    },\r\n    \"@webassemblyjs/helper-api-error\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==\"\r\n    },\r\n    \"@webassemblyjs/helper-buffer\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==\"\r\n    },\r\n    \"@webassemblyjs/helper-code-frame\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/wast-printer\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/helper-fsm\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==\"\r\n    },\r\n    \"@webassemblyjs/helper-module-context\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"mamacro\": \"^0.0.3\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/helper-wasm-bytecode\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==\"\r\n    },\r\n    \"@webassemblyjs/helper-wasm-section\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-buffer\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-gen\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/ieee754\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==\",\r\n      \"requires\": {\r\n        \"@xtuc/ieee754\": \"^1.2.0\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/leb128\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==\",\r\n      \"requires\": {\r\n        \"@xtuc/long\": \"4.2.2\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/utf8\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==\"\r\n    },\r\n    \"@webassemblyjs/wasm-edit\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-buffer\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-section\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-gen\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-opt\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-parser\": \"1.8.5\",\r\n        \"@webassemblyjs/wast-printer\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/wasm-gen\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.8.5\",\r\n        \"@webassemblyjs/ieee754\": \"1.8.5\",\r\n        \"@webassemblyjs/leb128\": \"1.8.5\",\r\n        \"@webassemblyjs/utf8\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/wasm-opt\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-buffer\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-gen\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-parser\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/wasm-parser\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-api-error\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.8.5\",\r\n        \"@webassemblyjs/ieee754\": \"1.8.5\",\r\n        \"@webassemblyjs/leb128\": \"1.8.5\",\r\n        \"@webassemblyjs/utf8\": \"1.8.5\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/wast-parser\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/floating-point-hex-parser\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-api-error\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-code-frame\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-fsm\": \"1.8.5\",\r\n        \"@xtuc/long\": \"4.2.2\"\r\n      }\r\n    },\r\n    \"@webassemblyjs/wast-printer\": {\r\n      \"version\": \"1.8.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz\",\r\n      \"integrity\": \"sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/wast-parser\": \"1.8.5\",\r\n        \"@xtuc/long\": \"4.2.2\"\r\n      }\r\n    },\r\n    \"@xtuc/ieee754\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=\"\r\n    },\r\n    \"@xtuc/long\": {\r\n      \"version\": \"4.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz\",\r\n      \"integrity\": \"sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==\"\r\n    },\r\n    \"abbrev\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==\"\r\n    },\r\n    \"acorn\": {\r\n      \"version\": \"6.4.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz\",\r\n      \"integrity\": \"sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==\"\r\n    },\r\n    \"ajv\": {\r\n      \"version\": \"6.10.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz\",\r\n      \"integrity\": \"sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==\",\r\n      \"requires\": {\r\n        \"fast-deep-equal\": \"^2.0.1\",\r\n        \"fast-json-stable-stringify\": \"^2.0.0\",\r\n        \"json-schema-traverse\": \"^0.4.1\",\r\n        \"uri-js\": \"^4.2.2\"\r\n      }\r\n    },\r\n    \"ajv-errors\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==\"\r\n    },\r\n    \"ajv-keywords\": {\r\n      \"version\": \"3.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz\",\r\n      \"integrity\": \"sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==\"\r\n    },\r\n    \"amdefine\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=\",\r\n      \"dev\": true\r\n    },\r\n    \"ansi-regex\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=\"\r\n    },\r\n    \"ansi-styles\": {\r\n      \"version\": \"2.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz\",\r\n      \"integrity\": \"sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=\",\r\n      \"dev\": true\r\n    },\r\n    \"anymatch\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-vLJLTzeTTZqnrBe0ra+J58du8us=\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"micromatch\": \"^3.1.4\",\r\n        \"normalize-path\": \"^2.1.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"normalize-path\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"remove-trailing-separator\": \"^1.0.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"aproba\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==\"\r\n    },\r\n    \"are-we-there-yet\": {\r\n      \"version\": \"1.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz\",\r\n      \"integrity\": \"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==\",\r\n      \"requires\": {\r\n        \"delegates\": \"^1.0.0\",\r\n        \"readable-stream\": \"^2.0.6\"\r\n      }\r\n    },\r\n    \"argparse\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\r\n      \"integrity\": \"sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"sprintf-js\": \"~1.0.2\"\r\n      }\r\n    },\r\n    \"arr-diff\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz\",\r\n      \"integrity\": \"sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=\"\r\n    },\r\n    \"arr-flatten\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=\"\r\n    },\r\n    \"arr-union\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz\",\r\n      \"integrity\": \"sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=\"\r\n    },\r\n    \"array-find-index\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=\",\r\n      \"dev\": true\r\n    },\r\n    \"array-unique\": {\r\n      \"version\": \"0.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz\",\r\n      \"integrity\": \"sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=\"\r\n    },\r\n    \"asap\": {\r\n      \"version\": \"2.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\r\n      \"integrity\": \"sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=\"\r\n    },\r\n    \"asn1\": {\r\n      \"version\": \"0.2.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz\",\r\n      \"integrity\": \"sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"safer-buffer\": \"~2.1.0\"\r\n      }\r\n    },\r\n    \"asn1.js\": {\r\n      \"version\": \"4.10.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz\",\r\n      \"integrity\": \"sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"minimalistic-assert\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"assert\": {\r\n      \"version\": \"1.5.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/assert/-/assert-1.5.0.tgz\",\r\n      \"integrity\": \"sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==\",\r\n      \"requires\": {\r\n        \"object-assign\": \"^4.1.1\",\r\n        \"util\": \"0.10.3\"\r\n      },\r\n      \"dependencies\": {\r\n        \"inherits\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=\"\r\n        },\r\n        \"util\": {\r\n          \"version\": \"0.10.3\",\r\n          \"resolved\": \"https://registry.npmjs.org/util/-/util-0.10.3.tgz\",\r\n          \"integrity\": \"sha1-evsa/lCAUkZInj23/g7TeTNqwPk=\",\r\n          \"requires\": {\r\n            \"inherits\": \"2.0.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"assert-plus\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=\",\r\n      \"dev\": true\r\n    },\r\n    \"assign-symbols\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=\"\r\n    },\r\n    \"async-each\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz\",\r\n      \"integrity\": \"sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==\",\r\n      \"optional\": true\r\n    },\r\n    \"async-foreach\": {\r\n      \"version\": \"0.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz\",\r\n      \"integrity\": \"sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=\",\r\n      \"dev\": true\r\n    },\r\n    \"asynckit\": {\r\n      \"version\": \"0.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\r\n      \"integrity\": \"sha1-x57Zf380y48robyXkLzDZkdLS3k=\",\r\n      \"dev\": true\r\n    },\r\n    \"atob\": {\r\n      \"version\": \"2.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/atob/-/atob-2.1.2.tgz\",\r\n      \"integrity\": \"sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=\"\r\n    },\r\n    \"aws-sign2\": {\r\n      \"version\": \"0.7.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz\",\r\n      \"integrity\": \"sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=\",\r\n      \"dev\": true\r\n    },\r\n    \"aws4\": {\r\n      \"version\": \"1.10.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz\",\r\n      \"integrity\": \"sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==\",\r\n      \"dev\": true\r\n    },\r\n    \"balanced-match\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-ibTRmasr7kneFk6gK4nORi1xt2c=\"\r\n    },\r\n    \"base\": {\r\n      \"version\": \"0.11.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/base/-/base-0.11.2.tgz\",\r\n      \"integrity\": \"sha1-e95c7RRbbVUakNuH+DxVi060io8=\",\r\n      \"requires\": {\r\n        \"cache-base\": \"^1.0.1\",\r\n        \"class-utils\": \"^0.3.5\",\r\n        \"component-emitter\": \"^1.2.1\",\r\n        \"define-property\": \"^1.0.0\",\r\n        \"isobject\": \"^3.0.1\",\r\n        \"mixin-deep\": \"^1.2.0\",\r\n        \"pascalcase\": \"^0.1.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-dp66rz9KY6rTr56NMEybvnm/sOY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"is-accessor-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-data-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-descriptor\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=\",\r\n          \"requires\": {\r\n            \"is-accessor-descriptor\": \"^1.0.0\",\r\n            \"is-data-descriptor\": \"^1.0.0\",\r\n            \"kind-of\": \"^6.0.2\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"base64-js\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==\"\r\n    },\r\n    \"bcrypt-pbkdf\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"tweetnacl\": \"^0.14.3\"\r\n      }\r\n    },\r\n    \"big.js\": {\r\n      \"version\": \"5.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz\",\r\n      \"integrity\": \"sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==\"\r\n    },\r\n    \"binary-extensions\": {\r\n      \"version\": \"1.13.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz\",\r\n      \"integrity\": \"sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==\",\r\n      \"optional\": true\r\n    },\r\n    \"bindings\": {\r\n      \"version\": \"1.5.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz\",\r\n      \"integrity\": \"sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"file-uri-to-path\": \"1.0.0\"\r\n      }\r\n    },\r\n    \"block-stream\": {\r\n      \"version\": \"0.0.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz\",\r\n      \"integrity\": \"sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"inherits\": \"~2.0.0\"\r\n      }\r\n    },\r\n    \"bluebird\": {\r\n      \"version\": \"3.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\r\n      \"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\"\r\n    },\r\n    \"bn.js\": {\r\n      \"version\": \"4.11.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz\",\r\n      \"integrity\": \"sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=\"\r\n    },\r\n    \"bowser\": {\r\n      \"version\": \"1.9.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz\",\r\n      \"integrity\": \"sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==\"\r\n    },\r\n    \"brace-expansion\": {\r\n      \"version\": \"1.1.11\",\r\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz\",\r\n      \"integrity\": \"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==\",\r\n      \"requires\": {\r\n        \"balanced-match\": \"^1.0.0\",\r\n        \"concat-map\": \"0.0.1\"\r\n      }\r\n    },\r\n    \"braces\": {\r\n      \"version\": \"2.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/braces/-/braces-2.3.2.tgz\",\r\n      \"integrity\": \"sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=\",\r\n      \"requires\": {\r\n        \"arr-flatten\": \"^1.1.0\",\r\n        \"array-unique\": \"^0.3.2\",\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"fill-range\": \"^4.0.0\",\r\n        \"isobject\": \"^3.0.1\",\r\n        \"repeat-element\": \"^1.1.2\",\r\n        \"snapdragon\": \"^0.8.1\",\r\n        \"snapdragon-node\": \"^2.0.1\",\r\n        \"split-string\": \"^3.0.2\",\r\n        \"to-regex\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"brorand\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=\"\r\n    },\r\n    \"browserify-aes\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=\",\r\n      \"requires\": {\r\n        \"buffer-xor\": \"^1.0.3\",\r\n        \"cipher-base\": \"^1.0.0\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"evp_bytestokey\": \"^1.0.3\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.0.1\"\r\n      }\r\n    },\r\n    \"browserify-cipher\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=\",\r\n      \"requires\": {\r\n        \"browserify-aes\": \"^1.0.4\",\r\n        \"browserify-des\": \"^1.0.0\",\r\n        \"evp_bytestokey\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"browserify-des\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=\",\r\n      \"requires\": {\r\n        \"cipher-base\": \"^1.0.1\",\r\n        \"des.js\": \"^1.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.1.2\"\r\n      }\r\n    },\r\n    \"browserify-rsa\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz\",\r\n      \"integrity\": \"sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.1.0\",\r\n        \"randombytes\": \"^2.0.1\"\r\n      }\r\n    },\r\n    \"browserify-sign\": {\r\n      \"version\": \"4.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz\",\r\n      \"integrity\": \"sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.1.1\",\r\n        \"browserify-rsa\": \"^4.0.0\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"create-hmac\": \"^1.1.2\",\r\n        \"elliptic\": \"^6.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"parse-asn1\": \"^5.0.0\"\r\n      }\r\n    },\r\n    \"browserify-zlib\": {\r\n      \"version\": \"0.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz\",\r\n      \"integrity\": \"sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=\",\r\n      \"requires\": {\r\n        \"pako\": \"~1.0.5\"\r\n      }\r\n    },\r\n    \"buffer\": {\r\n      \"version\": \"4.9.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz\",\r\n      \"integrity\": \"sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==\",\r\n      \"requires\": {\r\n        \"base64-js\": \"^1.0.2\",\r\n        \"ieee754\": \"^1.1.4\",\r\n        \"isarray\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"buffer-from\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz\",\r\n      \"integrity\": \"sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=\"\r\n    },\r\n    \"buffer-xor\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz\",\r\n      \"integrity\": \"sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=\"\r\n    },\r\n    \"builtin-modules\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz\",\r\n      \"integrity\": \"sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=\",\r\n      \"dev\": true\r\n    },\r\n    \"builtin-status-codes\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=\"\r\n    },\r\n    \"cacache\": {\r\n      \"version\": \"12.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz\",\r\n      \"integrity\": \"sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==\",\r\n      \"requires\": {\r\n        \"bluebird\": \"^3.5.5\",\r\n        \"chownr\": \"^1.1.1\",\r\n        \"figgy-pudding\": \"^3.5.1\",\r\n        \"glob\": \"^7.1.4\",\r\n        \"graceful-fs\": \"^4.1.15\",\r\n        \"infer-owner\": \"^1.0.3\",\r\n        \"lru-cache\": \"^5.1.1\",\r\n        \"mississippi\": \"^3.0.0\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"move-concurrently\": \"^1.0.1\",\r\n        \"promise-inflight\": \"^1.0.1\",\r\n        \"rimraf\": \"^2.6.3\",\r\n        \"ssri\": \"^6.0.1\",\r\n        \"unique-filename\": \"^1.1.1\",\r\n        \"y18n\": \"^4.0.0\"\r\n      }\r\n    },\r\n    \"cache-base\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=\",\r\n      \"requires\": {\r\n        \"collection-visit\": \"^1.0.0\",\r\n        \"component-emitter\": \"^1.2.1\",\r\n        \"get-value\": \"^2.0.6\",\r\n        \"has-value\": \"^1.0.0\",\r\n        \"isobject\": \"^3.0.1\",\r\n        \"set-value\": \"^2.0.0\",\r\n        \"to-object-path\": \"^0.3.0\",\r\n        \"union-value\": \"^1.0.0\",\r\n        \"unset-value\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"camelcase\": {\r\n      \"version\": \"5.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz\",\r\n      \"integrity\": \"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==\"\r\n    },\r\n    \"camelcase-keys\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz\",\r\n      \"integrity\": \"sha1-MIvur/3ygRkFHvodkyITyRuPkuc=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"camelcase\": \"^2.0.0\",\r\n        \"map-obj\": \"^1.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"camelcase\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"canvas\": {\r\n      \"version\": \"2.6.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz\",\r\n      \"integrity\": \"sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==\",\r\n      \"requires\": {\r\n        \"nan\": \"^2.14.0\",\r\n        \"node-pre-gyp\": \"^0.11.0\",\r\n        \"simple-get\": \"^3.0.3\"\r\n      }\r\n    },\r\n    \"caseless\": {\r\n      \"version\": \"0.12.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz\",\r\n      \"integrity\": \"sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=\",\r\n      \"dev\": true\r\n    },\r\n    \"chalk\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz\",\r\n      \"integrity\": \"sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"ansi-styles\": \"^2.2.1\",\r\n        \"escape-string-regexp\": \"^1.0.2\",\r\n        \"has-ansi\": \"^2.0.0\",\r\n        \"strip-ansi\": \"^3.0.0\",\r\n        \"supports-color\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-w7M6te42DYbg5ijwRorn7yfWVN8=\",\r\n          \"dev\": true\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"3.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz\",\r\n          \"integrity\": \"sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^2.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"chokidar\": {\r\n      \"version\": \"2.1.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz\",\r\n      \"integrity\": \"sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"anymatch\": \"^2.0.0\",\r\n        \"async-each\": \"^1.0.1\",\r\n        \"braces\": \"^2.3.2\",\r\n        \"fsevents\": \"^1.2.7\",\r\n        \"glob-parent\": \"^3.1.0\",\r\n        \"inherits\": \"^2.0.3\",\r\n        \"is-binary-path\": \"^1.0.0\",\r\n        \"is-glob\": \"^4.0.0\",\r\n        \"normalize-path\": \"^3.0.0\",\r\n        \"path-is-absolute\": \"^1.0.0\",\r\n        \"readdirp\": \"^2.2.1\",\r\n        \"upath\": \"^1.1.1\"\r\n      }\r\n    },\r\n    \"chownr\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz\",\r\n      \"integrity\": \"sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==\"\r\n    },\r\n    \"chrome-trace-event\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==\",\r\n      \"requires\": {\r\n        \"tslib\": \"^1.9.0\"\r\n      }\r\n    },\r\n    \"cipher-base\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz\",\r\n      \"integrity\": \"sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.0.1\"\r\n      }\r\n    },\r\n    \"class-utils\": {\r\n      \"version\": \"0.3.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz\",\r\n      \"integrity\": \"sha1-+TNprouafOAv1B+q0MqDAzGQxGM=\",\r\n      \"requires\": {\r\n        \"arr-union\": \"^3.1.0\",\r\n        \"define-property\": \"^0.2.5\",\r\n        \"isobject\": \"^3.0.0\",\r\n        \"static-extend\": \"^0.1.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"0.2.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz\",\r\n          \"integrity\": \"sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^0.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"cliui\": {\r\n      \"version\": \"4.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz\",\r\n      \"integrity\": \"sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==\",\r\n      \"requires\": {\r\n        \"string-width\": \"^2.1.1\",\r\n        \"strip-ansi\": \"^4.0.0\",\r\n        \"wrap-ansi\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"clone\": {\r\n      \"version\": \"2.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/clone/-/clone-2.1.2.tgz\",\r\n      \"integrity\": \"sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=\"\r\n    },\r\n    \"code-point-at\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=\"\r\n    },\r\n    \"collection-visit\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=\",\r\n      \"requires\": {\r\n        \"map-visit\": \"^1.0.0\",\r\n        \"object-visit\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"color-convert\": {\r\n      \"version\": \"1.9.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\r\n      \"integrity\": \"sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=\",\r\n      \"requires\": {\r\n        \"color-name\": \"1.1.3\"\r\n      }\r\n    },\r\n    \"color-name\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\r\n      \"integrity\": \"sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=\"\r\n    },\r\n    \"combined-stream\": {\r\n      \"version\": \"1.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\r\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"delayed-stream\": \"~1.0.0\"\r\n      }\r\n    },\r\n    \"commander\": {\r\n      \"version\": \"2.20.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-2.20.3.tgz\",\r\n      \"integrity\": \"sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==\"\r\n    },\r\n    \"common-js\": {\r\n      \"version\": \"0.3.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/common-js/-/common-js-0.3.8.tgz\",\r\n      \"integrity\": \"sha1-9DKJGLS6N2+YGtM6Gx+7ZhQSbss=\"\r\n    },\r\n    \"commondir\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=\"\r\n    },\r\n    \"component-emitter\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz\",\r\n      \"integrity\": \"sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==\"\r\n    },\r\n    \"concat-map\": {\r\n      \"version\": \"0.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\r\n      \"integrity\": \"sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=\"\r\n    },\r\n    \"concat-stream\": {\r\n      \"version\": \"1.6.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz\",\r\n      \"integrity\": \"sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=\",\r\n      \"requires\": {\r\n        \"buffer-from\": \"^1.0.0\",\r\n        \"inherits\": \"^2.0.3\",\r\n        \"readable-stream\": \"^2.2.2\",\r\n        \"typedarray\": \"^0.0.6\"\r\n      }\r\n    },\r\n    \"console-browserify\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==\"\r\n    },\r\n    \"console-control-strings\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=\"\r\n    },\r\n    \"constants-browserify\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=\"\r\n    },\r\n    \"copy-concurrently\": {\r\n      \"version\": \"1.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz\",\r\n      \"integrity\": \"sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=\",\r\n      \"requires\": {\r\n        \"aproba\": \"^1.1.1\",\r\n        \"fs-write-stream-atomic\": \"^1.0.8\",\r\n        \"iferr\": \"^0.1.5\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"rimraf\": \"^2.5.4\",\r\n        \"run-queue\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"copy-descriptor\": {\r\n      \"version\": \"0.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz\",\r\n      \"integrity\": \"sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=\"\r\n    },\r\n    \"core-js\": {\r\n      \"version\": \"1.2.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz\",\r\n      \"integrity\": \"sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=\"\r\n    },\r\n    \"core-util-is\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=\"\r\n    },\r\n    \"create-ecdh\": {\r\n      \"version\": \"4.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz\",\r\n      \"integrity\": \"sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.1.0\",\r\n        \"elliptic\": \"^6.0.0\"\r\n      }\r\n    },\r\n    \"create-hash\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=\",\r\n      \"requires\": {\r\n        \"cipher-base\": \"^1.0.1\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"md5.js\": \"^1.3.4\",\r\n        \"ripemd160\": \"^2.0.1\",\r\n        \"sha.js\": \"^2.4.0\"\r\n      }\r\n    },\r\n    \"create-hmac\": {\r\n      \"version\": \"1.1.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz\",\r\n      \"integrity\": \"sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=\",\r\n      \"requires\": {\r\n        \"cipher-base\": \"^1.0.3\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"ripemd160\": \"^2.0.0\",\r\n        \"safe-buffer\": \"^5.0.1\",\r\n        \"sha.js\": \"^2.4.8\"\r\n      }\r\n    },\r\n    \"cross-spawn\": {\r\n      \"version\": \"6.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz\",\r\n      \"integrity\": \"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==\",\r\n      \"requires\": {\r\n        \"nice-try\": \"^1.0.4\",\r\n        \"path-key\": \"^2.0.1\",\r\n        \"semver\": \"^5.5.0\",\r\n        \"shebang-command\": \"^1.2.0\",\r\n        \"which\": \"^1.2.9\"\r\n      }\r\n    },\r\n    \"crypto-browserify\": {\r\n      \"version\": \"3.12.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz\",\r\n      \"integrity\": \"sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=\",\r\n      \"requires\": {\r\n        \"browserify-cipher\": \"^1.0.0\",\r\n        \"browserify-sign\": \"^4.0.0\",\r\n        \"create-ecdh\": \"^4.0.0\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"create-hmac\": \"^1.1.0\",\r\n        \"diffie-hellman\": \"^5.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"pbkdf2\": \"^3.0.3\",\r\n        \"public-encrypt\": \"^4.0.0\",\r\n        \"randombytes\": \"^2.0.0\",\r\n        \"randomfill\": \"^1.0.3\"\r\n      }\r\n    },\r\n    \"css-in-js-utils\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==\",\r\n      \"requires\": {\r\n        \"hyphenate-style-name\": \"^1.0.2\",\r\n        \"isobject\": \"^3.0.1\"\r\n      }\r\n    },\r\n    \"currently-unhandled\": {\r\n      \"version\": \"0.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz\",\r\n      \"integrity\": \"sha1-mI3zP+qxke95mmE2nddsF635V+o=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"array-find-index\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"cyclist\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=\"\r\n    },\r\n    \"d3\": {\r\n      \"version\": \"5.15.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3/-/d3-5.15.0.tgz\",\r\n      \"integrity\": \"sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"1\",\r\n        \"d3-axis\": \"1\",\r\n        \"d3-brush\": \"1\",\r\n        \"d3-chord\": \"1\",\r\n        \"d3-collection\": \"1\",\r\n        \"d3-color\": \"1\",\r\n        \"d3-contour\": \"1\",\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-drag\": \"1\",\r\n        \"d3-dsv\": \"1\",\r\n        \"d3-ease\": \"1\",\r\n        \"d3-fetch\": \"1\",\r\n        \"d3-force\": \"1\",\r\n        \"d3-format\": \"1\",\r\n        \"d3-geo\": \"1\",\r\n        \"d3-hierarchy\": \"1\",\r\n        \"d3-interpolate\": \"1\",\r\n        \"d3-path\": \"1\",\r\n        \"d3-polygon\": \"1\",\r\n        \"d3-quadtree\": \"1\",\r\n        \"d3-random\": \"1\",\r\n        \"d3-scale\": \"2\",\r\n        \"d3-scale-chromatic\": \"1\",\r\n        \"d3-selection\": \"1\",\r\n        \"d3-shape\": \"1\",\r\n        \"d3-time\": \"1\",\r\n        \"d3-time-format\": \"2\",\r\n        \"d3-timer\": \"1\",\r\n        \"d3-transition\": \"1\",\r\n        \"d3-voronoi\": \"1\",\r\n        \"d3-zoom\": \"1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-array\": {\r\n      \"version\": \"2.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz\",\r\n      \"integrity\": \"sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==\"\r\n    },\r\n    \"d3-axis\": {\r\n      \"version\": \"1.0.12\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz\",\r\n      \"integrity\": \"sha1-zfILohDPu0N5WvM3Vohvs2ONqsk=\"\r\n    },\r\n    \"d3-brush\": {\r\n      \"version\": \"1.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz\",\r\n      \"integrity\": \"sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==\",\r\n      \"requires\": {\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-drag\": \"1\",\r\n        \"d3-interpolate\": \"1\",\r\n        \"d3-selection\": \"1\",\r\n        \"d3-transition\": \"1\"\r\n      }\r\n    },\r\n    \"d3-chord\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz\",\r\n      \"integrity\": \"sha1-MJFX4/LbLHUvAoD+3TXyBnzLsV8=\",\r\n      \"requires\": {\r\n        \"d3-array\": \"1\",\r\n        \"d3-path\": \"1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-collection\": {\r\n      \"version\": \"1.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz\",\r\n      \"integrity\": \"sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==\"\r\n    },\r\n    \"d3-color\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==\"\r\n    },\r\n    \"d3-contour\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^1.1.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-dispatch\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz\",\r\n      \"integrity\": \"sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==\"\r\n    },\r\n    \"d3-drag\": {\r\n      \"version\": \"1.2.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz\",\r\n      \"integrity\": \"sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==\",\r\n      \"requires\": {\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-selection\": \"1\"\r\n      }\r\n    },\r\n    \"d3-dsv\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==\",\r\n      \"requires\": {\r\n        \"commander\": \"2\",\r\n        \"iconv-lite\": \"0.4\",\r\n        \"rw\": \"1\"\r\n      }\r\n    },\r\n    \"d3-ease\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz\",\r\n      \"integrity\": \"sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==\"\r\n    },\r\n    \"d3-fetch\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz\",\r\n      \"integrity\": \"sha1-lXyPvG1EgFmboZGxslGL+Gs+G+I=\",\r\n      \"requires\": {\r\n        \"d3-dsv\": \"1\"\r\n      }\r\n    },\r\n    \"d3-force\": {\r\n      \"version\": \"1.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz\",\r\n      \"integrity\": \"sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==\",\r\n      \"requires\": {\r\n        \"d3-collection\": \"1\",\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-quadtree\": \"1\",\r\n        \"d3-timer\": \"1\"\r\n      }\r\n    },\r\n    \"d3-format\": {\r\n      \"version\": \"1.4.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz\",\r\n      \"integrity\": \"sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==\"\r\n    },\r\n    \"d3-geo\": {\r\n      \"version\": \"1.11.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz\",\r\n      \"integrity\": \"sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-geo-projection\": {\r\n      \"version\": \"2.8.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.8.1.tgz\",\r\n      \"integrity\": \"sha512-VObmT3vQQgU7IxkDwyIuOrWK4AS2OHyvucp1vHo98WE7DvAN+VcS3Pf/oKenszPfbMtHusOfQNBLEMyGHguvTg==\",\r\n      \"requires\": {\r\n        \"commander\": \"2\",\r\n        \"d3-array\": \"1\",\r\n        \"d3-geo\": \"^1.10.0\",\r\n        \"resolve\": \"^1.1.10\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-hierarchy\": {\r\n      \"version\": \"1.1.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz\",\r\n      \"integrity\": \"sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==\"\r\n    },\r\n    \"d3-interpolate\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==\",\r\n      \"requires\": {\r\n        \"d3-color\": \"1\"\r\n      }\r\n    },\r\n    \"d3-path\": {\r\n      \"version\": \"1.0.9\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz\",\r\n      \"integrity\": \"sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==\"\r\n    },\r\n    \"d3-polygon\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz\",\r\n      \"integrity\": \"sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==\"\r\n    },\r\n    \"d3-quadtree\": {\r\n      \"version\": \"1.0.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz\",\r\n      \"integrity\": \"sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==\"\r\n    },\r\n    \"d3-random\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz\",\r\n      \"integrity\": \"sha1-KDO+fBJDYL+eLT/U8zhHz+bKspE=\"\r\n    },\r\n    \"d3-scale\": {\r\n      \"version\": \"2.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz\",\r\n      \"integrity\": \"sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^1.2.0\",\r\n        \"d3-collection\": \"1\",\r\n        \"d3-format\": \"1\",\r\n        \"d3-interpolate\": \"1\",\r\n        \"d3-time\": \"1\",\r\n        \"d3-time-format\": \"2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"d3-array\": {\r\n          \"version\": \"1.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\r\n          \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\r\n        }\r\n      }\r\n    },\r\n    \"d3-scale-chromatic\": {\r\n      \"version\": \"1.5.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz\",\r\n      \"integrity\": \"sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==\",\r\n      \"requires\": {\r\n        \"d3-color\": \"1\",\r\n        \"d3-interpolate\": \"1\"\r\n      }\r\n    },\r\n    \"d3-selection\": {\r\n      \"version\": \"1.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz\",\r\n      \"integrity\": \"sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==\"\r\n    },\r\n    \"d3-shape\": {\r\n      \"version\": \"1.3.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz\",\r\n      \"integrity\": \"sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==\",\r\n      \"requires\": {\r\n        \"d3-path\": \"1\"\r\n      }\r\n    },\r\n    \"d3-time\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==\"\r\n    },\r\n    \"d3-time-format\": {\r\n      \"version\": \"2.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz\",\r\n      \"integrity\": \"sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==\",\r\n      \"requires\": {\r\n        \"d3-time\": \"1\"\r\n      }\r\n    },\r\n    \"d3-timer\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz\",\r\n      \"integrity\": \"sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==\"\r\n    },\r\n    \"d3-transition\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==\",\r\n      \"requires\": {\r\n        \"d3-color\": \"1\",\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-ease\": \"1\",\r\n        \"d3-interpolate\": \"1\",\r\n        \"d3-selection\": \"^1.1.0\",\r\n        \"d3-timer\": \"1\"\r\n      }\r\n    },\r\n    \"d3-voronoi\": {\r\n      \"version\": \"1.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz\",\r\n      \"integrity\": \"sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==\"\r\n    },\r\n    \"d3-zoom\": {\r\n      \"version\": \"1.8.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz\",\r\n      \"integrity\": \"sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==\",\r\n      \"requires\": {\r\n        \"d3-dispatch\": \"1\",\r\n        \"d3-drag\": \"1\",\r\n        \"d3-interpolate\": \"1\",\r\n        \"d3-selection\": \"1\",\r\n        \"d3-transition\": \"1\"\r\n      }\r\n    },\r\n    \"dashdash\": {\r\n      \"version\": \"1.14.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz\",\r\n      \"integrity\": \"sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"assert-plus\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"debug\": {\r\n      \"version\": \"3.2.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.2.6.tgz\",\r\n      \"integrity\": \"sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==\",\r\n      \"requires\": {\r\n        \"ms\": \"^2.1.1\"\r\n      }\r\n    },\r\n    \"decamelize\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=\"\r\n    },\r\n    \"decode-uri-component\": {\r\n      \"version\": \"0.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz\",\r\n      \"integrity\": \"sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=\"\r\n    },\r\n    \"decompress-response\": {\r\n      \"version\": \"4.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz\",\r\n      \"integrity\": \"sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==\",\r\n      \"requires\": {\r\n        \"mimic-response\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"deep-extend\": {\r\n      \"version\": \"0.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\r\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\"\r\n    },\r\n    \"define-property\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz\",\r\n      \"integrity\": \"sha1-1Flono1lS6d+AqgX+HENcCyxbp0=\",\r\n      \"requires\": {\r\n        \"is-descriptor\": \"^1.0.2\",\r\n        \"isobject\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"is-accessor-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-data-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-descriptor\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=\",\r\n          \"requires\": {\r\n            \"is-accessor-descriptor\": \"^1.0.0\",\r\n            \"is-data-descriptor\": \"^1.0.0\",\r\n            \"kind-of\": \"^6.0.2\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"delayed-stream\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-3zrhmayt+31ECqrgsp4icrJOxhk=\",\r\n      \"dev\": true\r\n    },\r\n    \"delegates\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=\"\r\n    },\r\n    \"des.js\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.1\",\r\n        \"minimalistic-assert\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"detect-file\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=\",\r\n      \"dev\": true\r\n    },\r\n    \"detect-libc\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz\",\r\n      \"integrity\": \"sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=\"\r\n    },\r\n    \"diff\": {\r\n      \"version\": \"4.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\r\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\r\n      \"dev\": true\r\n    },\r\n    \"diffie-hellman\": {\r\n      \"version\": \"5.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz\",\r\n      \"integrity\": \"sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.1.0\",\r\n        \"miller-rabin\": \"^4.0.0\",\r\n        \"randombytes\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"domain-browser\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=\"\r\n    },\r\n    \"dragselect\": {\r\n      \"version\": \"1.13.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/dragselect/-/dragselect-1.13.1.tgz\",\r\n      \"integrity\": \"sha512-spfUz6/sNnlY4fF/OxPBwaKLa5hVz6V+fq5XhVuD+h47RAkA75TMkfvr4AoWUh5Ufq3V1oIAbfu+sjc9QbewoA==\",\r\n      \"dev\": true\r\n    },\r\n    \"duplexify\": {\r\n      \"version\": \"3.7.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz\",\r\n      \"integrity\": \"sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==\",\r\n      \"requires\": {\r\n        \"end-of-stream\": \"^1.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"readable-stream\": \"^2.0.0\",\r\n        \"stream-shift\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"ecc-jsbn\": {\r\n      \"version\": \"0.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz\",\r\n      \"integrity\": \"sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"jsbn\": \"~0.1.0\",\r\n        \"safer-buffer\": \"^2.1.0\"\r\n      }\r\n    },\r\n    \"elliptic\": {\r\n      \"version\": \"6.5.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz\",\r\n      \"integrity\": \"sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.4.0\",\r\n        \"brorand\": \"^1.0.1\",\r\n        \"hash.js\": \"^1.0.0\",\r\n        \"hmac-drbg\": \"^1.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"minimalistic-assert\": \"^1.0.0\",\r\n        \"minimalistic-crypto-utils\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"emoji-regex\": {\r\n      \"version\": \"7.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz\",\r\n      \"integrity\": \"sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==\"\r\n    },\r\n    \"emojis-list\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz\",\r\n      \"integrity\": \"sha1-TapNnbAPmBmIDHn6RXrlsJof04k=\"\r\n    },\r\n    \"encoding\": {\r\n      \"version\": \"0.1.12\",\r\n      \"resolved\": \"https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz\",\r\n      \"integrity\": \"sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=\",\r\n      \"requires\": {\r\n        \"iconv-lite\": \"~0.4.13\"\r\n      }\r\n    },\r\n    \"end-of-stream\": {\r\n      \"version\": \"1.4.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz\",\r\n      \"integrity\": \"sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==\",\r\n      \"requires\": {\r\n        \"once\": \"^1.4.0\"\r\n      }\r\n    },\r\n    \"enhanced-resolve\": {\r\n      \"version\": \"4.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz\",\r\n      \"integrity\": \"sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==\",\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"memory-fs\": \"^0.5.0\",\r\n        \"tapable\": \"^1.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"memory-fs\": {\r\n          \"version\": \"0.5.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz\",\r\n          \"integrity\": \"sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==\",\r\n          \"requires\": {\r\n            \"errno\": \"^0.1.3\",\r\n            \"readable-stream\": \"^2.0.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"errno\": {\r\n      \"version\": \"0.1.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/errno/-/errno-0.1.7.tgz\",\r\n      \"integrity\": \"sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=\",\r\n      \"requires\": {\r\n        \"prr\": \"~1.0.1\"\r\n      }\r\n    },\r\n    \"error-ex\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"is-arrayish\": \"^0.2.1\"\r\n      }\r\n    },\r\n    \"escape-string-regexp\": {\r\n      \"version\": \"1.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\r\n      \"integrity\": \"sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=\",\r\n      \"dev\": true\r\n    },\r\n    \"eslint-scope\": {\r\n      \"version\": \"4.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz\",\r\n      \"integrity\": \"sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==\",\r\n      \"requires\": {\r\n        \"esrecurse\": \"^4.1.0\",\r\n        \"estraverse\": \"^4.1.1\"\r\n      }\r\n    },\r\n    \"esprima\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\r\n      \"integrity\": \"sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=\",\r\n      \"dev\": true\r\n    },\r\n    \"esrecurse\": {\r\n      \"version\": \"4.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz\",\r\n      \"integrity\": \"sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=\",\r\n      \"requires\": {\r\n        \"estraverse\": \"^4.1.0\"\r\n      }\r\n    },\r\n    \"estraverse\": {\r\n      \"version\": \"4.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz\",\r\n      \"integrity\": \"sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==\"\r\n    },\r\n    \"esutils\": {\r\n      \"version\": \"2.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\r\n      \"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\r\n      \"dev\": true\r\n    },\r\n    \"events\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/events/-/events-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==\"\r\n    },\r\n    \"evp_bytestokey\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz\",\r\n      \"integrity\": \"sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=\",\r\n      \"requires\": {\r\n        \"md5.js\": \"^1.3.4\",\r\n        \"safe-buffer\": \"^5.1.1\"\r\n      }\r\n    },\r\n    \"execa\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-1.0.0.tgz\",\r\n      \"integrity\": \"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==\",\r\n      \"requires\": {\r\n        \"cross-spawn\": \"^6.0.0\",\r\n        \"get-stream\": \"^4.0.0\",\r\n        \"is-stream\": \"^1.1.0\",\r\n        \"npm-run-path\": \"^2.0.0\",\r\n        \"p-finally\": \"^1.0.0\",\r\n        \"signal-exit\": \"^3.0.0\",\r\n        \"strip-eof\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"expand-brackets\": {\r\n      \"version\": \"2.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz\",\r\n      \"integrity\": \"sha1-t3c14xXOMPa27/D4OwQVGiJEliI=\",\r\n      \"requires\": {\r\n        \"debug\": \"^2.3.3\",\r\n        \"define-property\": \"^0.2.5\",\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"posix-character-classes\": \"^0.1.0\",\r\n        \"regex-not\": \"^1.0.0\",\r\n        \"snapdragon\": \"^0.8.1\",\r\n        \"to-regex\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"debug\": {\r\n          \"version\": \"2.6.9\",\r\n          \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\r\n          \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\r\n          \"requires\": {\r\n            \"ms\": \"2.0.0\"\r\n          }\r\n        },\r\n        \"define-property\": {\r\n          \"version\": \"0.2.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz\",\r\n          \"integrity\": \"sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"ms\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\r\n          \"integrity\": \"sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=\"\r\n        }\r\n      }\r\n    },\r\n    \"expand-tilde\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz\",\r\n      \"integrity\": \"sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"homedir-polyfill\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"extend\": {\r\n      \"version\": \"3.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\r\n      \"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\",\r\n      \"dev\": true\r\n    },\r\n    \"extend-shallow\": {\r\n      \"version\": \"3.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz\",\r\n      \"integrity\": \"sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=\",\r\n      \"requires\": {\r\n        \"assign-symbols\": \"^1.0.0\",\r\n        \"is-extendable\": \"^1.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"is-extendable\": {\r\n          \"version\": \"1.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz\",\r\n          \"integrity\": \"sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=\",\r\n          \"requires\": {\r\n            \"is-plain-object\": \"^2.0.4\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"extglob\": {\r\n      \"version\": \"2.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz\",\r\n      \"integrity\": \"sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=\",\r\n      \"requires\": {\r\n        \"array-unique\": \"^0.3.2\",\r\n        \"define-property\": \"^1.0.0\",\r\n        \"expand-brackets\": \"^2.1.4\",\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"fragment-cache\": \"^0.2.1\",\r\n        \"regex-not\": \"^1.0.0\",\r\n        \"snapdragon\": \"^0.8.1\",\r\n        \"to-regex\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-dp66rz9KY6rTr56NMEybvnm/sOY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"is-accessor-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-data-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-descriptor\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=\",\r\n          \"requires\": {\r\n            \"is-accessor-descriptor\": \"^1.0.0\",\r\n            \"is-data-descriptor\": \"^1.0.0\",\r\n            \"kind-of\": \"^6.0.2\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"extsprintf\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz\",\r\n      \"integrity\": \"sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=\",\r\n      \"dev\": true\r\n    },\r\n    \"fast-deep-equal\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=\"\r\n    },\r\n    \"fast-json-stable-stringify\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==\"\r\n    },\r\n    \"fbjs\": {\r\n      \"version\": \"0.8.17\",\r\n      \"resolved\": \"https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz\",\r\n      \"integrity\": \"sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=\",\r\n      \"requires\": {\r\n        \"core-js\": \"^1.0.0\",\r\n        \"isomorphic-fetch\": \"^2.1.1\",\r\n        \"loose-envify\": \"^1.0.0\",\r\n        \"object-assign\": \"^4.1.0\",\r\n        \"promise\": \"^7.1.1\",\r\n        \"setimmediate\": \"^1.0.5\",\r\n        \"ua-parser-js\": \"^0.7.18\"\r\n      }\r\n    },\r\n    \"figgy-pudding\": {\r\n      \"version\": \"3.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz\",\r\n      \"integrity\": \"sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=\"\r\n    },\r\n    \"file-loader\": {\r\n      \"version\": \"3.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz\",\r\n      \"integrity\": \"sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==\",\r\n      \"requires\": {\r\n        \"loader-utils\": \"^1.0.2\",\r\n        \"schema-utils\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"file-saver\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz\",\r\n      \"integrity\": \"sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==\"\r\n    },\r\n    \"file-uri-to-path\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz\",\r\n      \"integrity\": \"sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==\",\r\n      \"optional\": true\r\n    },\r\n    \"fill-range\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz\",\r\n      \"integrity\": \"sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=\",\r\n      \"requires\": {\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"is-number\": \"^3.0.0\",\r\n        \"repeat-string\": \"^1.6.1\",\r\n        \"to-regex-range\": \"^2.1.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"find-cache-dir\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==\",\r\n      \"requires\": {\r\n        \"commondir\": \"^1.0.1\",\r\n        \"make-dir\": \"^2.0.0\",\r\n        \"pkg-dir\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"find-up\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==\",\r\n      \"requires\": {\r\n        \"locate-path\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"findup-sync\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"detect-file\": \"^1.0.0\",\r\n        \"is-glob\": \"^4.0.0\",\r\n        \"micromatch\": \"^3.0.4\",\r\n        \"resolve-dir\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"flush-write-stream\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.3\",\r\n        \"readable-stream\": \"^2.3.6\"\r\n      }\r\n    },\r\n    \"for-in\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=\"\r\n    },\r\n    \"forever-agent\": {\r\n      \"version\": \"0.6.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz\",\r\n      \"integrity\": \"sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=\",\r\n      \"dev\": true\r\n    },\r\n    \"form-data\": {\r\n      \"version\": \"2.3.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz\",\r\n      \"integrity\": \"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"asynckit\": \"^0.4.0\",\r\n        \"combined-stream\": \"^1.0.6\",\r\n        \"mime-types\": \"^2.1.12\"\r\n      }\r\n    },\r\n    \"fragment-cache\": {\r\n      \"version\": \"0.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz\",\r\n      \"integrity\": \"sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=\",\r\n      \"requires\": {\r\n        \"map-cache\": \"^0.2.2\"\r\n      }\r\n    },\r\n    \"from2\": {\r\n      \"version\": \"2.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/from2/-/from2-2.3.0.tgz\",\r\n      \"integrity\": \"sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.1\",\r\n        \"readable-stream\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"fs-minipass\": {\r\n      \"version\": \"1.2.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz\",\r\n      \"integrity\": \"sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==\",\r\n      \"requires\": {\r\n        \"minipass\": \"^2.6.0\"\r\n      }\r\n    },\r\n    \"fs-write-stream-atomic\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz\",\r\n      \"integrity\": \"sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=\",\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"iferr\": \"^0.1.5\",\r\n        \"imurmurhash\": \"^0.1.4\",\r\n        \"readable-stream\": \"1 || 2\"\r\n      }\r\n    },\r\n    \"fs.realpath\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-FQStJSMVjKpA20onh8sBQRmU6k8=\"\r\n    },\r\n    \"fsevents\": {\r\n      \"version\": \"1.2.11\",\r\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz\",\r\n      \"integrity\": \"sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"bindings\": \"^1.5.0\",\r\n        \"nan\": \"^2.12.1\",\r\n        \"node-pre-gyp\": \"*\"\r\n      },\r\n      \"dependencies\": {\r\n        \"abbrev\": {\r\n          \"version\": \"1.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"ansi-regex\": {\r\n          \"version\": \"2.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"aproba\": {\r\n          \"version\": \"1.2.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"are-we-there-yet\": {\r\n          \"version\": \"1.1.5\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"delegates\": \"^1.0.0\",\r\n            \"readable-stream\": \"^2.0.6\"\r\n          }\r\n        },\r\n        \"balanced-match\": {\r\n          \"version\": \"1.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"brace-expansion\": {\r\n          \"version\": \"1.1.11\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"balanced-match\": \"^1.0.0\",\r\n            \"concat-map\": \"0.0.1\"\r\n          }\r\n        },\r\n        \"chownr\": {\r\n          \"version\": \"1.1.3\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"code-point-at\": {\r\n          \"version\": \"1.1.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"concat-map\": {\r\n          \"version\": \"0.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"console-control-strings\": {\r\n          \"version\": \"1.1.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"core-util-is\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"debug\": {\r\n          \"version\": \"3.2.6\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"ms\": \"^2.1.1\"\r\n          }\r\n        },\r\n        \"deep-extend\": {\r\n          \"version\": \"0.6.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"delegates\": {\r\n          \"version\": \"1.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"detect-libc\": {\r\n          \"version\": \"1.0.3\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"fs-minipass\": {\r\n          \"version\": \"1.2.7\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"minipass\": \"^2.6.0\"\r\n          }\r\n        },\r\n        \"fs.realpath\": {\r\n          \"version\": \"1.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"gauge\": {\r\n          \"version\": \"2.7.4\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"aproba\": \"^1.0.3\",\r\n            \"console-control-strings\": \"^1.0.0\",\r\n            \"has-unicode\": \"^2.0.0\",\r\n            \"object-assign\": \"^4.1.0\",\r\n            \"signal-exit\": \"^3.0.0\",\r\n            \"string-width\": \"^1.0.1\",\r\n            \"strip-ansi\": \"^3.0.1\",\r\n            \"wide-align\": \"^1.1.0\"\r\n          }\r\n        },\r\n        \"glob\": {\r\n          \"version\": \"7.1.6\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"fs.realpath\": \"^1.0.0\",\r\n            \"inflight\": \"^1.0.4\",\r\n            \"inherits\": \"2\",\r\n            \"minimatch\": \"^3.0.4\",\r\n            \"once\": \"^1.3.0\",\r\n            \"path-is-absolute\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"has-unicode\": {\r\n          \"version\": \"2.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"iconv-lite\": {\r\n          \"version\": \"0.4.24\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"safer-buffer\": \">= 2.1.2 < 3\"\r\n          }\r\n        },\r\n        \"ignore-walk\": {\r\n          \"version\": \"3.0.3\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"minimatch\": \"^3.0.4\"\r\n          }\r\n        },\r\n        \"inflight\": {\r\n          \"version\": \"1.0.6\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"once\": \"^1.3.0\",\r\n            \"wrappy\": \"1\"\r\n          }\r\n        },\r\n        \"inherits\": {\r\n          \"version\": \"2.0.4\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"ini\": {\r\n          \"version\": \"1.3.5\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"is-fullwidth-code-point\": {\r\n          \"version\": \"1.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"number-is-nan\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"isarray\": {\r\n          \"version\": \"1.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"minimatch\": {\r\n          \"version\": \"3.0.4\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"brace-expansion\": \"^1.1.7\"\r\n          }\r\n        },\r\n        \"minimist\": {\r\n          \"version\": \"0.0.8\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"minipass\": {\r\n          \"version\": \"2.9.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"safe-buffer\": \"^5.1.2\",\r\n            \"yallist\": \"^3.0.0\"\r\n          }\r\n        },\r\n        \"minizlib\": {\r\n          \"version\": \"1.3.3\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"minipass\": \"^2.9.0\"\r\n          }\r\n        },\r\n        \"mkdirp\": {\r\n          \"version\": \"0.5.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"minimist\": \"0.0.8\"\r\n          }\r\n        },\r\n        \"ms\": {\r\n          \"version\": \"2.1.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"needle\": {\r\n          \"version\": \"2.4.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"debug\": \"^3.2.6\",\r\n            \"iconv-lite\": \"^0.4.4\",\r\n            \"sax\": \"^1.2.4\"\r\n          }\r\n        },\r\n        \"node-pre-gyp\": {\r\n          \"version\": \"0.14.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"detect-libc\": \"^1.0.2\",\r\n            \"mkdirp\": \"^0.5.1\",\r\n            \"needle\": \"^2.2.1\",\r\n            \"nopt\": \"^4.0.1\",\r\n            \"npm-packlist\": \"^1.1.6\",\r\n            \"npmlog\": \"^4.0.2\",\r\n            \"rc\": \"^1.2.7\",\r\n            \"rimraf\": \"^2.6.1\",\r\n            \"semver\": \"^5.3.0\",\r\n            \"tar\": \"^4.4.2\"\r\n          }\r\n        },\r\n        \"nopt\": {\r\n          \"version\": \"4.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"abbrev\": \"1\",\r\n            \"osenv\": \"^0.1.4\"\r\n          }\r\n        },\r\n        \"npm-bundled\": {\r\n          \"version\": \"1.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"npm-normalize-package-bin\": \"^1.0.1\"\r\n          }\r\n        },\r\n        \"npm-normalize-package-bin\": {\r\n          \"version\": \"1.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"npm-packlist\": {\r\n          \"version\": \"1.4.7\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"ignore-walk\": \"^3.0.1\",\r\n            \"npm-bundled\": \"^1.0.1\"\r\n          }\r\n        },\r\n        \"npmlog\": {\r\n          \"version\": \"4.1.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"are-we-there-yet\": \"~1.1.2\",\r\n            \"console-control-strings\": \"~1.1.0\",\r\n            \"gauge\": \"~2.7.3\",\r\n            \"set-blocking\": \"~2.0.0\"\r\n          }\r\n        },\r\n        \"number-is-nan\": {\r\n          \"version\": \"1.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"object-assign\": {\r\n          \"version\": \"4.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"once\": {\r\n          \"version\": \"1.4.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"wrappy\": \"1\"\r\n          }\r\n        },\r\n        \"os-homedir\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"os-tmpdir\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"osenv\": {\r\n          \"version\": \"0.1.5\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"os-homedir\": \"^1.0.0\",\r\n            \"os-tmpdir\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"path-is-absolute\": {\r\n          \"version\": \"1.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"process-nextick-args\": {\r\n          \"version\": \"2.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"rc\": {\r\n          \"version\": \"1.2.8\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"deep-extend\": \"^0.6.0\",\r\n            \"ini\": \"~1.3.0\",\r\n            \"minimist\": \"^1.2.0\",\r\n            \"strip-json-comments\": \"~2.0.1\"\r\n          },\r\n          \"dependencies\": {\r\n            \"minimist\": {\r\n              \"version\": \"1.2.0\",\r\n              \"bundled\": true,\r\n              \"optional\": true\r\n            }\r\n          }\r\n        },\r\n        \"readable-stream\": {\r\n          \"version\": \"2.3.6\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"core-util-is\": \"~1.0.0\",\r\n            \"inherits\": \"~2.0.3\",\r\n            \"isarray\": \"~1.0.0\",\r\n            \"process-nextick-args\": \"~2.0.0\",\r\n            \"safe-buffer\": \"~5.1.1\",\r\n            \"string_decoder\": \"~1.1.1\",\r\n            \"util-deprecate\": \"~1.0.1\"\r\n          }\r\n        },\r\n        \"rimraf\": {\r\n          \"version\": \"2.7.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"glob\": \"^7.1.3\"\r\n          }\r\n        },\r\n        \"safe-buffer\": {\r\n          \"version\": \"5.1.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"safer-buffer\": {\r\n          \"version\": \"2.1.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"sax\": {\r\n          \"version\": \"1.2.4\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"semver\": {\r\n          \"version\": \"5.7.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"set-blocking\": {\r\n          \"version\": \"2.0.0\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"signal-exit\": {\r\n          \"version\": \"3.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"code-point-at\": \"^1.0.0\",\r\n            \"is-fullwidth-code-point\": \"^1.0.0\",\r\n            \"strip-ansi\": \"^3.0.0\"\r\n          }\r\n        },\r\n        \"string_decoder\": {\r\n          \"version\": \"1.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"safe-buffer\": \"~5.1.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"3.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^2.0.0\"\r\n          }\r\n        },\r\n        \"strip-json-comments\": {\r\n          \"version\": \"2.0.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"tar\": {\r\n          \"version\": \"4.4.13\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"chownr\": \"^1.1.1\",\r\n            \"fs-minipass\": \"^1.2.5\",\r\n            \"minipass\": \"^2.8.6\",\r\n            \"minizlib\": \"^1.2.1\",\r\n            \"mkdirp\": \"^0.5.0\",\r\n            \"safe-buffer\": \"^5.1.2\",\r\n            \"yallist\": \"^3.0.3\"\r\n          }\r\n        },\r\n        \"util-deprecate\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"wide-align\": {\r\n          \"version\": \"1.1.3\",\r\n          \"bundled\": true,\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"string-width\": \"^1.0.2 || 2\"\r\n          }\r\n        },\r\n        \"wrappy\": {\r\n          \"version\": \"1.0.2\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        },\r\n        \"yallist\": {\r\n          \"version\": \"3.1.1\",\r\n          \"bundled\": true,\r\n          \"optional\": true\r\n        }\r\n      }\r\n    },\r\n    \"fstream\": {\r\n      \"version\": \"1.0.12\",\r\n      \"resolved\": \"https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz\",\r\n      \"integrity\": \"sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"inherits\": \"~2.0.0\",\r\n        \"mkdirp\": \">=0.5 0\",\r\n        \"rimraf\": \"2\"\r\n      }\r\n    },\r\n    \"gauge\": {\r\n      \"version\": \"2.7.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz\",\r\n      \"integrity\": \"sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=\",\r\n      \"requires\": {\r\n        \"aproba\": \"^1.0.3\",\r\n        \"console-control-strings\": \"^1.0.0\",\r\n        \"has-unicode\": \"^2.0.0\",\r\n        \"object-assign\": \"^4.1.0\",\r\n        \"signal-exit\": \"^3.0.0\",\r\n        \"string-width\": \"^1.0.1\",\r\n        \"strip-ansi\": \"^3.0.1\",\r\n        \"wide-align\": \"^1.1.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-w7M6te42DYbg5ijwRorn7yfWVN8=\"\r\n        },\r\n        \"is-fullwidth-code-point\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-754xOG8DGn8NZDr4L95QxFfvAMs=\",\r\n          \"requires\": {\r\n            \"number-is-nan\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=\",\r\n          \"requires\": {\r\n            \"code-point-at\": \"^1.0.0\",\r\n            \"is-fullwidth-code-point\": \"^1.0.0\",\r\n            \"strip-ansi\": \"^3.0.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"3.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz\",\r\n          \"integrity\": \"sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=\",\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^2.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"gaze\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz\",\r\n      \"integrity\": \"sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"globule\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"get-caller-file\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz\",\r\n      \"integrity\": \"sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==\"\r\n    },\r\n    \"get-stdin\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz\",\r\n      \"integrity\": \"sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=\",\r\n      \"dev\": true\r\n    },\r\n    \"get-stream\": {\r\n      \"version\": \"4.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz\",\r\n      \"integrity\": \"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==\",\r\n      \"requires\": {\r\n        \"pump\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"get-value\": {\r\n      \"version\": \"2.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz\",\r\n      \"integrity\": \"sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=\"\r\n    },\r\n    \"getpass\": {\r\n      \"version\": \"0.1.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz\",\r\n      \"integrity\": \"sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"assert-plus\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"glamor\": {\r\n      \"version\": \"2.20.40\",\r\n      \"resolved\": \"https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz\",\r\n      \"integrity\": \"sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==\",\r\n      \"requires\": {\r\n        \"fbjs\": \"^0.8.12\",\r\n        \"inline-style-prefixer\": \"^3.0.6\",\r\n        \"object-assign\": \"^4.1.1\",\r\n        \"prop-types\": \"^15.5.10\",\r\n        \"through\": \"^2.3.8\"\r\n      }\r\n    },\r\n    \"glamor-tachyons\": {\r\n      \"version\": \"1.0.0-alpha.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/glamor-tachyons/-/glamor-tachyons-1.0.0-alpha.1.tgz\",\r\n      \"integrity\": \"sha512-C51lRkk206gkKUHRQIyNcZHv3Oj00SFFnV1RfI3kKhOQur9eavOABb09ZL2vE3ub8EMM0dOjDOS1Bg88MesAWw==\",\r\n      \"requires\": {\r\n        \"lodash\": \"^4.17.4\"\r\n      }\r\n    },\r\n    \"glob\": {\r\n      \"version\": \"7.1.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.1.6.tgz\",\r\n      \"integrity\": \"sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==\",\r\n      \"requires\": {\r\n        \"fs.realpath\": \"^1.0.0\",\r\n        \"inflight\": \"^1.0.4\",\r\n        \"inherits\": \"2\",\r\n        \"minimatch\": \"^3.0.4\",\r\n        \"once\": \"^1.3.0\",\r\n        \"path-is-absolute\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"glob-parent\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz\",\r\n      \"integrity\": \"sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"is-glob\": \"^3.1.0\",\r\n        \"path-dirname\": \"^1.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"is-glob\": {\r\n          \"version\": \"3.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz\",\r\n          \"integrity\": \"sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"is-extglob\": \"^2.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"global-modules\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"global-prefix\": \"^3.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"global-prefix\": {\r\n          \"version\": \"3.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz\",\r\n          \"integrity\": \"sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ini\": \"^1.3.5\",\r\n            \"kind-of\": \"^6.0.2\",\r\n            \"which\": \"^1.3.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"global-prefix\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"expand-tilde\": \"^2.0.2\",\r\n        \"homedir-polyfill\": \"^1.0.1\",\r\n        \"ini\": \"^1.3.4\",\r\n        \"is-windows\": \"^1.0.1\",\r\n        \"which\": \"^1.2.14\"\r\n      }\r\n    },\r\n    \"globule\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/globule/-/globule-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"glob\": \"~7.1.1\",\r\n        \"lodash\": \"~4.17.10\",\r\n        \"minimatch\": \"~3.0.2\"\r\n      }\r\n    },\r\n    \"graceful-fs\": {\r\n      \"version\": \"4.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz\",\r\n      \"integrity\": \"sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==\"\r\n    },\r\n    \"har-schema\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=\",\r\n      \"dev\": true\r\n    },\r\n    \"har-validator\": {\r\n      \"version\": \"5.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz\",\r\n      \"integrity\": \"sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"ajv\": \"^6.12.3\",\r\n        \"har-schema\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ajv\": {\r\n          \"version\": \"6.12.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz\",\r\n          \"integrity\": \"sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"fast-deep-equal\": \"^3.1.1\",\r\n            \"fast-json-stable-stringify\": \"^2.0.0\",\r\n            \"json-schema-traverse\": \"^0.4.1\",\r\n            \"uri-js\": \"^4.2.2\"\r\n          }\r\n        },\r\n        \"fast-deep-equal\": {\r\n          \"version\": \"3.1.3\",\r\n          \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz\",\r\n          \"integrity\": \"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"has-ansi\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"ansi-regex\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-w7M6te42DYbg5ijwRorn7yfWVN8=\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"has-flag\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-tdRU3CGZriJWmfNGfloH87lVuv0=\",\r\n      \"dev\": true\r\n    },\r\n    \"has-unicode\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=\"\r\n    },\r\n    \"has-value\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=\",\r\n      \"requires\": {\r\n        \"get-value\": \"^2.0.6\",\r\n        \"has-values\": \"^1.0.0\",\r\n        \"isobject\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"has-values\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=\",\r\n      \"requires\": {\r\n        \"is-number\": \"^3.0.0\",\r\n        \"kind-of\": \"^4.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"4.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz\",\r\n          \"integrity\": \"sha1-IIE989cSkosgc3hpGkUGb65y3Vc=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"hash-base\": {\r\n      \"version\": \"3.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz\",\r\n      \"integrity\": \"sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.0.1\"\r\n      }\r\n    },\r\n    \"hash.js\": {\r\n      \"version\": \"1.1.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz\",\r\n      \"integrity\": \"sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.3\",\r\n        \"minimalistic-assert\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"hmac-drbg\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=\",\r\n      \"requires\": {\r\n        \"hash.js\": \"^1.0.3\",\r\n        \"minimalistic-assert\": \"^1.0.0\",\r\n        \"minimalistic-crypto-utils\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"homedir-polyfill\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz\",\r\n      \"integrity\": \"sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"parse-passwd\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"hosted-git-info\": {\r\n      \"version\": \"2.8.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz\",\r\n      \"integrity\": \"sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==\",\r\n      \"dev\": true\r\n    },\r\n    \"http-signature\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"assert-plus\": \"^1.0.0\",\r\n        \"jsprim\": \"^1.2.2\",\r\n        \"sshpk\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"https-browserify\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=\"\r\n    },\r\n    \"hyphenate-style-name\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz\",\r\n      \"integrity\": \"sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==\"\r\n    },\r\n    \"iconv-lite\": {\r\n      \"version\": \"0.4.24\",\r\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz\",\r\n      \"integrity\": \"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==\",\r\n      \"requires\": {\r\n        \"safer-buffer\": \">= 2.1.2 < 3\"\r\n      }\r\n    },\r\n    \"ieee754\": {\r\n      \"version\": \"1.1.13\",\r\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz\",\r\n      \"integrity\": \"sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==\"\r\n    },\r\n    \"iferr\": {\r\n      \"version\": \"0.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz\",\r\n      \"integrity\": \"sha1-xg7taebY/bazEEofy8ocGS3FtQE=\"\r\n    },\r\n    \"ignore-walk\": {\r\n      \"version\": \"3.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz\",\r\n      \"integrity\": \"sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==\",\r\n      \"requires\": {\r\n        \"minimatch\": \"^3.0.4\"\r\n      }\r\n    },\r\n    \"import-local\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-VQcL44pZk88Y72236WH1vuXFoJ0=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"pkg-dir\": \"^3.0.0\",\r\n        \"resolve-cwd\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"imurmurhash\": {\r\n      \"version\": \"0.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz\",\r\n      \"integrity\": \"sha1-khi5srkoojixPcT7a21XbyMUU+o=\"\r\n    },\r\n    \"in-publish\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==\",\r\n      \"dev\": true\r\n    },\r\n    \"indent-string\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz\",\r\n      \"integrity\": \"sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"repeating\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"infer-owner\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz\",\r\n      \"integrity\": \"sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==\"\r\n    },\r\n    \"inflight\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz\",\r\n      \"integrity\": \"sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=\",\r\n      \"requires\": {\r\n        \"once\": \"^1.3.0\",\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"inherits\": {\r\n      \"version\": \"2.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\r\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\"\r\n    },\r\n    \"ini\": {\r\n      \"version\": \"1.3.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-1.3.5.tgz\",\r\n      \"integrity\": \"sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==\"\r\n    },\r\n    \"inline-style-prefixer\": {\r\n      \"version\": \"3.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz\",\r\n      \"integrity\": \"sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=\",\r\n      \"requires\": {\r\n        \"bowser\": \"^1.7.3\",\r\n        \"css-in-js-utils\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"interpret\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==\",\r\n      \"dev\": true\r\n    },\r\n    \"invert-kv\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==\"\r\n    },\r\n    \"is-accessor-descriptor\": {\r\n      \"version\": \"0.1.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz\",\r\n      \"integrity\": \"sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=\",\r\n      \"requires\": {\r\n        \"kind-of\": \"^3.0.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"is-arrayish\": {\r\n      \"version\": \"0.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\r\n      \"integrity\": \"sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=\",\r\n      \"dev\": true\r\n    },\r\n    \"is-binary-path\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"binary-extensions\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"is-buffer\": {\r\n      \"version\": \"1.1.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz\",\r\n      \"integrity\": \"sha1-76ouqdqg16suoTqXsritUf776L4=\"\r\n    },\r\n    \"is-data-descriptor\": {\r\n      \"version\": \"0.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz\",\r\n      \"integrity\": \"sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=\",\r\n      \"requires\": {\r\n        \"kind-of\": \"^3.0.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"is-descriptor\": {\r\n      \"version\": \"0.1.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz\",\r\n      \"integrity\": \"sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=\",\r\n      \"requires\": {\r\n        \"is-accessor-descriptor\": \"^0.1.6\",\r\n        \"is-data-descriptor\": \"^0.1.4\",\r\n        \"kind-of\": \"^5.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"5.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz\",\r\n          \"integrity\": \"sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=\"\r\n        }\r\n      }\r\n    },\r\n    \"is-extendable\": {\r\n      \"version\": \"0.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz\",\r\n      \"integrity\": \"sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=\"\r\n    },\r\n    \"is-extglob\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz\",\r\n      \"integrity\": \"sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=\"\r\n    },\r\n    \"is-finite\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==\",\r\n      \"dev\": true\r\n    },\r\n    \"is-fullwidth-code-point\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=\"\r\n    },\r\n    \"is-glob\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz\",\r\n      \"integrity\": \"sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==\",\r\n      \"requires\": {\r\n        \"is-extglob\": \"^2.1.1\"\r\n      }\r\n    },\r\n    \"is-number\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=\",\r\n      \"requires\": {\r\n        \"kind-of\": \"^3.0.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"is-plain-object\": {\r\n      \"version\": \"2.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz\",\r\n      \"integrity\": \"sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=\",\r\n      \"requires\": {\r\n        \"isobject\": \"^3.0.1\"\r\n      }\r\n    },\r\n    \"is-stream\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-EtSj3U5o4Lec6428hBc66A2RykQ=\"\r\n    },\r\n    \"is-typedarray\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=\",\r\n      \"dev\": true\r\n    },\r\n    \"is-utf8\": {\r\n      \"version\": \"0.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz\",\r\n      \"integrity\": \"sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=\",\r\n      \"dev\": true\r\n    },\r\n    \"is-windows\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=\"\r\n    },\r\n    \"is-wsl\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=\"\r\n    },\r\n    \"isarray\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=\"\r\n    },\r\n    \"isexe\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=\"\r\n    },\r\n    \"isobject\": {\r\n      \"version\": \"3.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz\",\r\n      \"integrity\": \"sha1-TkMekrEalzFjaqH5yNHMvP2reN8=\"\r\n    },\r\n    \"isomorphic-fetch\": {\r\n      \"version\": \"2.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz\",\r\n      \"integrity\": \"sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=\",\r\n      \"requires\": {\r\n        \"node-fetch\": \"^1.0.1\",\r\n        \"whatwg-fetch\": \">=0.10.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"node-fetch\": {\r\n          \"version\": \"1.7.3\",\r\n          \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz\",\r\n          \"integrity\": \"sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==\",\r\n          \"requires\": {\r\n            \"encoding\": \"^0.1.11\",\r\n            \"is-stream\": \"^1.0.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"isstream\": {\r\n      \"version\": \"0.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz\",\r\n      \"integrity\": \"sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=\",\r\n      \"dev\": true\r\n    },\r\n    \"js-base64\": {\r\n      \"version\": \"2.6.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz\",\r\n      \"integrity\": \"sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==\",\r\n      \"dev\": true\r\n    },\r\n    \"js-tokens\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\r\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\r\n    },\r\n    \"js-yaml\": {\r\n      \"version\": \"3.13.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz\",\r\n      \"integrity\": \"sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"argparse\": \"^1.0.7\",\r\n        \"esprima\": \"^4.0.0\"\r\n      }\r\n    },\r\n    \"jsbn\": {\r\n      \"version\": \"0.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz\",\r\n      \"integrity\": \"sha1-peZUwuWi3rXyAdls77yoDA7y9RM=\",\r\n      \"dev\": true\r\n    },\r\n    \"json-parse-better-errors\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=\"\r\n    },\r\n    \"json-schema\": {\r\n      \"version\": \"0.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz\",\r\n      \"integrity\": \"sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=\",\r\n      \"dev\": true\r\n    },\r\n    \"json-schema-traverse\": {\r\n      \"version\": \"0.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\r\n      \"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\"\r\n    },\r\n    \"json-stable-stringify\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=\",\r\n      \"requires\": {\r\n        \"jsonify\": \"~0.0.0\"\r\n      }\r\n    },\r\n    \"json-stringify-pretty-compact\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-/11Pj1OyX814QMKO7K8l85SHPTr/KsFxHp8GE2zVa0BtJgGimDjXHfM3FhC7keQdWDea7+nXf+f1de7ATZcZkQ==\"\r\n    },\r\n    \"json-stringify-safe\": {\r\n      \"version\": \"5.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz\",\r\n      \"integrity\": \"sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=\",\r\n      \"dev\": true\r\n    },\r\n    \"json5\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/json5/-/json5-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==\",\r\n      \"requires\": {\r\n        \"minimist\": \"^1.2.0\"\r\n      }\r\n    },\r\n    \"jsonify\": {\r\n      \"version\": \"0.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz\",\r\n      \"integrity\": \"sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=\"\r\n    },\r\n    \"jsprim\": {\r\n      \"version\": \"1.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz\",\r\n      \"integrity\": \"sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"assert-plus\": \"1.0.0\",\r\n        \"extsprintf\": \"1.3.0\",\r\n        \"json-schema\": \"0.2.3\",\r\n        \"verror\": \"1.10.0\"\r\n      }\r\n    },\r\n    \"kind-of\": {\r\n      \"version\": \"6.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz\",\r\n      \"integrity\": \"sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==\"\r\n    },\r\n    \"lcid\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==\",\r\n      \"requires\": {\r\n        \"invert-kv\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"load-json-file\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"parse-json\": \"^2.2.0\",\r\n        \"pify\": \"^2.0.0\",\r\n        \"pinkie-promise\": \"^2.0.0\",\r\n        \"strip-bom\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"pify\": {\r\n          \"version\": \"2.3.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz\",\r\n          \"integrity\": \"sha1-7RQaasBDqEnqWISY59yosVMw6Qw=\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"loader-runner\": {\r\n      \"version\": \"2.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz\",\r\n      \"integrity\": \"sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==\"\r\n    },\r\n    \"loader-utils\": {\r\n      \"version\": \"1.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz\",\r\n      \"integrity\": \"sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==\",\r\n      \"requires\": {\r\n        \"big.js\": \"^5.2.2\",\r\n        \"emojis-list\": \"^2.0.0\",\r\n        \"json5\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"locate-path\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==\",\r\n      \"requires\": {\r\n        \"p-locate\": \"^3.0.0\",\r\n        \"path-exists\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"lodash\": {\r\n      \"version\": \"4.17.20\",\r\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz\",\r\n      \"integrity\": \"sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==\"\r\n    },\r\n    \"long\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/long/-/long-4.0.0.tgz\",\r\n      \"integrity\": \"sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==\"\r\n    },\r\n    \"loose-envify\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\r\n      \"requires\": {\r\n        \"js-tokens\": \"^3.0.0 || ^4.0.0\"\r\n      }\r\n    },\r\n    \"loud-rejection\": {\r\n      \"version\": \"1.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz\",\r\n      \"integrity\": \"sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"currently-unhandled\": \"^0.4.1\",\r\n        \"signal-exit\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"lru-cache\": {\r\n      \"version\": \"5.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\r\n      \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\r\n      \"requires\": {\r\n        \"yallist\": \"^3.0.2\"\r\n      }\r\n    },\r\n    \"make-dir\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==\",\r\n      \"requires\": {\r\n        \"pify\": \"^4.0.1\",\r\n        \"semver\": \"^5.6.0\"\r\n      }\r\n    },\r\n    \"mamacro\": {\r\n      \"version\": \"0.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz\",\r\n      \"integrity\": \"sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==\"\r\n    },\r\n    \"map-age-cleaner\": {\r\n      \"version\": \"0.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz\",\r\n      \"integrity\": \"sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==\",\r\n      \"requires\": {\r\n        \"p-defer\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"map-cache\": {\r\n      \"version\": \"0.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz\",\r\n      \"integrity\": \"sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=\"\r\n    },\r\n    \"map-obj\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=\",\r\n      \"dev\": true\r\n    },\r\n    \"map-visit\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=\",\r\n      \"requires\": {\r\n        \"object-visit\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"md5.js\": {\r\n      \"version\": \"1.3.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz\",\r\n      \"integrity\": \"sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=\",\r\n      \"requires\": {\r\n        \"hash-base\": \"^3.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.1.2\"\r\n      }\r\n    },\r\n    \"mem\": {\r\n      \"version\": \"4.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mem/-/mem-4.3.0.tgz\",\r\n      \"integrity\": \"sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==\",\r\n      \"requires\": {\r\n        \"map-age-cleaner\": \"^0.1.1\",\r\n        \"mimic-fn\": \"^2.0.0\",\r\n        \"p-is-promise\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"memory-fs\": {\r\n      \"version\": \"0.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz\",\r\n      \"integrity\": \"sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=\",\r\n      \"requires\": {\r\n        \"errno\": \"^0.1.3\",\r\n        \"readable-stream\": \"^2.0.1\"\r\n      }\r\n    },\r\n    \"meow\": {\r\n      \"version\": \"3.7.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/meow/-/meow-3.7.0.tgz\",\r\n      \"integrity\": \"sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"camelcase-keys\": \"^2.0.0\",\r\n        \"decamelize\": \"^1.1.2\",\r\n        \"loud-rejection\": \"^1.0.0\",\r\n        \"map-obj\": \"^1.0.1\",\r\n        \"minimist\": \"^1.1.3\",\r\n        \"normalize-package-data\": \"^2.3.4\",\r\n        \"object-assign\": \"^4.0.1\",\r\n        \"read-pkg-up\": \"^1.0.1\",\r\n        \"redent\": \"^1.0.0\",\r\n        \"trim-newlines\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"micromatch\": {\r\n      \"version\": \"3.1.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz\",\r\n      \"integrity\": \"sha1-cIWbyVyYQJUvNZoGij/En57PrCM=\",\r\n      \"requires\": {\r\n        \"arr-diff\": \"^4.0.0\",\r\n        \"array-unique\": \"^0.3.2\",\r\n        \"braces\": \"^2.3.1\",\r\n        \"define-property\": \"^2.0.2\",\r\n        \"extend-shallow\": \"^3.0.2\",\r\n        \"extglob\": \"^2.0.4\",\r\n        \"fragment-cache\": \"^0.2.1\",\r\n        \"kind-of\": \"^6.0.2\",\r\n        \"nanomatch\": \"^1.2.9\",\r\n        \"object.pick\": \"^1.3.0\",\r\n        \"regex-not\": \"^1.0.0\",\r\n        \"snapdragon\": \"^0.8.1\",\r\n        \"to-regex\": \"^3.0.2\"\r\n      }\r\n    },\r\n    \"miller-rabin\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz\",\r\n      \"integrity\": \"sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.0.0\",\r\n        \"brorand\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"mime\": {\r\n      \"version\": \"2.4.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime/-/mime-2.4.4.tgz\",\r\n      \"integrity\": \"sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==\"\r\n    },\r\n    \"mime-db\": {\r\n      \"version\": \"1.44.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz\",\r\n      \"integrity\": \"sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==\",\r\n      \"dev\": true\r\n    },\r\n    \"mime-types\": {\r\n      \"version\": \"2.1.27\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz\",\r\n      \"integrity\": \"sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"mime-db\": \"1.44.0\"\r\n      }\r\n    },\r\n    \"mimic-fn\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\"\r\n    },\r\n    \"mimic-response\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==\"\r\n    },\r\n    \"minimalistic-assert\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=\"\r\n    },\r\n    \"minimalistic-crypto-utils\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=\"\r\n    },\r\n    \"minimatch\": {\r\n      \"version\": \"3.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz\",\r\n      \"integrity\": \"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==\",\r\n      \"requires\": {\r\n        \"brace-expansion\": \"^1.1.7\"\r\n      }\r\n    },\r\n    \"minimist\": {\r\n      \"version\": \"1.2.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz\",\r\n      \"integrity\": \"sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==\"\r\n    },\r\n    \"minipass\": {\r\n      \"version\": \"2.9.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz\",\r\n      \"integrity\": \"sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==\",\r\n      \"requires\": {\r\n        \"safe-buffer\": \"^5.1.2\",\r\n        \"yallist\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"minizlib\": {\r\n      \"version\": \"1.3.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz\",\r\n      \"integrity\": \"sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==\",\r\n      \"requires\": {\r\n        \"minipass\": \"^2.9.0\"\r\n      }\r\n    },\r\n    \"mississippi\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-6goykfl+C16HdrNj1fChLZTGcCI=\",\r\n      \"requires\": {\r\n        \"concat-stream\": \"^1.5.0\",\r\n        \"duplexify\": \"^3.4.2\",\r\n        \"end-of-stream\": \"^1.1.0\",\r\n        \"flush-write-stream\": \"^1.0.0\",\r\n        \"from2\": \"^2.1.0\",\r\n        \"parallel-transform\": \"^1.1.0\",\r\n        \"pump\": \"^3.0.0\",\r\n        \"pumpify\": \"^1.3.3\",\r\n        \"stream-each\": \"^1.1.0\",\r\n        \"through2\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"mixin-deep\": {\r\n      \"version\": \"1.3.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz\",\r\n      \"integrity\": \"sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==\",\r\n      \"requires\": {\r\n        \"for-in\": \"^1.0.2\",\r\n        \"is-extendable\": \"^1.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"is-extendable\": {\r\n          \"version\": \"1.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz\",\r\n          \"integrity\": \"sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=\",\r\n          \"requires\": {\r\n            \"is-plain-object\": \"^2.0.4\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"mkdirp\": {\r\n      \"version\": \"0.5.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz\",\r\n      \"integrity\": \"sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==\",\r\n      \"requires\": {\r\n        \"minimist\": \"^1.2.5\"\r\n      }\r\n    },\r\n    \"move-concurrently\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=\",\r\n      \"requires\": {\r\n        \"aproba\": \"^1.1.1\",\r\n        \"copy-concurrently\": \"^1.0.0\",\r\n        \"fs-write-stream-atomic\": \"^1.0.8\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"rimraf\": \"^2.5.4\",\r\n        \"run-queue\": \"^1.0.3\"\r\n      }\r\n    },\r\n    \"ms\": {\r\n      \"version\": \"2.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\r\n      \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\"\r\n    },\r\n    \"nan\": {\r\n      \"version\": \"2.14.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/nan/-/nan-2.14.0.tgz\",\r\n      \"integrity\": \"sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==\"\r\n    },\r\n    \"nanomatch\": {\r\n      \"version\": \"1.2.13\",\r\n      \"resolved\": \"https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz\",\r\n      \"integrity\": \"sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=\",\r\n      \"requires\": {\r\n        \"arr-diff\": \"^4.0.0\",\r\n        \"array-unique\": \"^0.3.2\",\r\n        \"define-property\": \"^2.0.2\",\r\n        \"extend-shallow\": \"^3.0.2\",\r\n        \"fragment-cache\": \"^0.2.1\",\r\n        \"is-windows\": \"^1.0.2\",\r\n        \"kind-of\": \"^6.0.2\",\r\n        \"object.pick\": \"^1.3.0\",\r\n        \"regex-not\": \"^1.0.0\",\r\n        \"snapdragon\": \"^0.8.1\",\r\n        \"to-regex\": \"^3.0.1\"\r\n      }\r\n    },\r\n    \"needle\": {\r\n      \"version\": \"2.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/needle/-/needle-2.4.0.tgz\",\r\n      \"integrity\": \"sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==\",\r\n      \"requires\": {\r\n        \"debug\": \"^3.2.6\",\r\n        \"iconv-lite\": \"^0.4.4\",\r\n        \"sax\": \"^1.2.4\"\r\n      }\r\n    },\r\n    \"neo-async\": {\r\n      \"version\": \"2.6.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz\",\r\n      \"integrity\": \"sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==\"\r\n    },\r\n    \"nice-try\": {\r\n      \"version\": \"1.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz\",\r\n      \"integrity\": \"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==\"\r\n    },\r\n    \"node-fetch\": {\r\n      \"version\": \"2.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz\",\r\n      \"integrity\": \"sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=\"\r\n    },\r\n    \"node-gyp\": {\r\n      \"version\": \"3.8.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz\",\r\n      \"integrity\": \"sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"fstream\": \"^1.0.0\",\r\n        \"glob\": \"^7.0.3\",\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"mkdirp\": \"^0.5.0\",\r\n        \"nopt\": \"2 || 3\",\r\n        \"npmlog\": \"0 || 1 || 2 || 3 || 4\",\r\n        \"osenv\": \"0\",\r\n        \"request\": \"^2.87.0\",\r\n        \"rimraf\": \"2\",\r\n        \"semver\": \"~5.3.0\",\r\n        \"tar\": \"^2.0.0\",\r\n        \"which\": \"1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"nopt\": {\r\n          \"version\": \"3.0.6\",\r\n          \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz\",\r\n          \"integrity\": \"sha1-xkZdvwirzU2zWTF/eaxopkayj/k=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"abbrev\": \"1\"\r\n          }\r\n        },\r\n        \"semver\": {\r\n          \"version\": \"5.3.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.3.0.tgz\",\r\n          \"integrity\": \"sha1-myzl094C0XxgEq0yaqa00M9U+U8=\",\r\n          \"dev\": true\r\n        },\r\n        \"tar\": {\r\n          \"version\": \"2.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/tar/-/tar-2.2.2.tgz\",\r\n          \"integrity\": \"sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"block-stream\": \"*\",\r\n            \"fstream\": \"^1.0.12\",\r\n            \"inherits\": \"2\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"node-libs-browser\": {\r\n      \"version\": \"2.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz\",\r\n      \"integrity\": \"sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==\",\r\n      \"requires\": {\r\n        \"assert\": \"^1.1.1\",\r\n        \"browserify-zlib\": \"^0.2.0\",\r\n        \"buffer\": \"^4.3.0\",\r\n        \"console-browserify\": \"^1.1.0\",\r\n        \"constants-browserify\": \"^1.0.0\",\r\n        \"crypto-browserify\": \"^3.11.0\",\r\n        \"domain-browser\": \"^1.1.1\",\r\n        \"events\": \"^3.0.0\",\r\n        \"https-browserify\": \"^1.0.0\",\r\n        \"os-browserify\": \"^0.3.0\",\r\n        \"path-browserify\": \"0.0.1\",\r\n        \"process\": \"^0.11.10\",\r\n        \"punycode\": \"^1.2.4\",\r\n        \"querystring-es3\": \"^0.2.0\",\r\n        \"readable-stream\": \"^2.3.3\",\r\n        \"stream-browserify\": \"^2.0.1\",\r\n        \"stream-http\": \"^2.7.2\",\r\n        \"string_decoder\": \"^1.0.0\",\r\n        \"timers-browserify\": \"^2.0.4\",\r\n        \"tty-browserify\": \"0.0.0\",\r\n        \"url\": \"^0.11.0\",\r\n        \"util\": \"^0.11.0\",\r\n        \"vm-browserify\": \"^1.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"punycode\": {\r\n          \"version\": \"1.4.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz\",\r\n          \"integrity\": \"sha1-wNWmOycYgArY4esPpSachN1BhF4=\"\r\n        }\r\n      }\r\n    },\r\n    \"node-pre-gyp\": {\r\n      \"version\": \"0.11.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz\",\r\n      \"integrity\": \"sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==\",\r\n      \"requires\": {\r\n        \"detect-libc\": \"^1.0.2\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"needle\": \"^2.2.1\",\r\n        \"nopt\": \"^4.0.1\",\r\n        \"npm-packlist\": \"^1.1.6\",\r\n        \"npmlog\": \"^4.0.2\",\r\n        \"rc\": \"^1.2.7\",\r\n        \"rimraf\": \"^2.6.1\",\r\n        \"semver\": \"^5.3.0\",\r\n        \"tar\": \"^4\"\r\n      }\r\n    },\r\n    \"node-sass\": {\r\n      \"version\": \"4.14.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz\",\r\n      \"integrity\": \"sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"async-foreach\": \"^0.1.3\",\r\n        \"chalk\": \"^1.1.1\",\r\n        \"cross-spawn\": \"^3.0.0\",\r\n        \"gaze\": \"^1.0.0\",\r\n        \"get-stdin\": \"^4.0.1\",\r\n        \"glob\": \"^7.0.3\",\r\n        \"in-publish\": \"^2.0.0\",\r\n        \"lodash\": \"^4.17.15\",\r\n        \"meow\": \"^3.7.0\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"nan\": \"^2.13.2\",\r\n        \"node-gyp\": \"^3.8.0\",\r\n        \"npmlog\": \"^4.0.0\",\r\n        \"request\": \"^2.88.0\",\r\n        \"sass-graph\": \"2.2.5\",\r\n        \"stdout-stream\": \"^1.4.0\",\r\n        \"true-case-path\": \"^1.0.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"cross-spawn\": {\r\n          \"version\": \"3.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz\",\r\n          \"integrity\": \"sha1-ElYDfsufDF9549bvE14wdwGEuYI=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"lru-cache\": \"^4.0.1\",\r\n            \"which\": \"^1.2.9\"\r\n          }\r\n        },\r\n        \"lru-cache\": {\r\n          \"version\": \"4.1.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz\",\r\n          \"integrity\": \"sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"pseudomap\": \"^1.0.2\",\r\n            \"yallist\": \"^2.1.2\"\r\n          }\r\n        },\r\n        \"yallist\": {\r\n          \"version\": \"2.1.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz\",\r\n          \"integrity\": \"sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"nopt\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz\",\r\n      \"integrity\": \"sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=\",\r\n      \"requires\": {\r\n        \"abbrev\": \"1\",\r\n        \"osenv\": \"^0.1.4\"\r\n      }\r\n    },\r\n    \"normalize-package-data\": {\r\n      \"version\": \"2.5.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz\",\r\n      \"integrity\": \"sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"hosted-git-info\": \"^2.1.4\",\r\n        \"resolve\": \"^1.10.0\",\r\n        \"semver\": \"2 || 3 || 4 || 5\",\r\n        \"validate-npm-package-license\": \"^3.0.1\"\r\n      }\r\n    },\r\n    \"normalize-path\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\r\n      \"optional\": true\r\n    },\r\n    \"npm-bundled\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==\",\r\n      \"requires\": {\r\n        \"npm-normalize-package-bin\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"npm-normalize-package-bin\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==\"\r\n    },\r\n    \"npm-packlist\": {\r\n      \"version\": \"1.4.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz\",\r\n      \"integrity\": \"sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==\",\r\n      \"requires\": {\r\n        \"ignore-walk\": \"^3.0.1\",\r\n        \"npm-bundled\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"npm-run-path\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz\",\r\n      \"integrity\": \"sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=\",\r\n      \"requires\": {\r\n        \"path-key\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"npmlog\": {\r\n      \"version\": \"4.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz\",\r\n      \"integrity\": \"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==\",\r\n      \"requires\": {\r\n        \"are-we-there-yet\": \"~1.1.2\",\r\n        \"console-control-strings\": \"~1.1.0\",\r\n        \"gauge\": \"~2.7.3\",\r\n        \"set-blocking\": \"~2.0.0\"\r\n      }\r\n    },\r\n    \"number-is-nan\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=\"\r\n    },\r\n    \"oauth-sign\": {\r\n      \"version\": \"0.9.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz\",\r\n      \"integrity\": \"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==\",\r\n      \"dev\": true\r\n    },\r\n    \"object-assign\": {\r\n      \"version\": \"4.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\r\n      \"integrity\": \"sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=\"\r\n    },\r\n    \"object-copy\": {\r\n      \"version\": \"0.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz\",\r\n      \"integrity\": \"sha1-fn2Fi3gb18mRpBupde04EnVOmYw=\",\r\n      \"requires\": {\r\n        \"copy-descriptor\": \"^0.1.0\",\r\n        \"define-property\": \"^0.2.5\",\r\n        \"kind-of\": \"^3.0.3\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"0.2.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz\",\r\n          \"integrity\": \"sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"object-visit\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=\",\r\n      \"requires\": {\r\n        \"isobject\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"object.pick\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz\",\r\n      \"integrity\": \"sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=\",\r\n      \"requires\": {\r\n        \"isobject\": \"^3.0.1\"\r\n      }\r\n    },\r\n    \"once\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\r\n      \"integrity\": \"sha1-WDsap3WWHUsROsF9nFC6753Xa9E=\",\r\n      \"requires\": {\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"os-browserify\": {\r\n      \"version\": \"0.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz\",\r\n      \"integrity\": \"sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=\"\r\n    },\r\n    \"os-homedir\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-/7xJiDNuDoM94MFox+8VISGqf7M=\"\r\n    },\r\n    \"os-locale\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==\",\r\n      \"requires\": {\r\n        \"execa\": \"^1.0.0\",\r\n        \"lcid\": \"^2.0.0\",\r\n        \"mem\": \"^4.0.0\"\r\n      }\r\n    },\r\n    \"os-tmpdir\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=\"\r\n    },\r\n    \"osenv\": {\r\n      \"version\": \"0.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz\",\r\n      \"integrity\": \"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==\",\r\n      \"requires\": {\r\n        \"os-homedir\": \"^1.0.0\",\r\n        \"os-tmpdir\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"p-defer\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=\"\r\n    },\r\n    \"p-finally\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=\"\r\n    },\r\n    \"p-is-promise\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==\"\r\n    },\r\n    \"p-limit\": {\r\n      \"version\": \"2.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz\",\r\n      \"integrity\": \"sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==\",\r\n      \"requires\": {\r\n        \"p-try\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"p-locate\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==\",\r\n      \"requires\": {\r\n        \"p-limit\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"p-try\": {\r\n      \"version\": \"2.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz\",\r\n      \"integrity\": \"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==\"\r\n    },\r\n    \"pako\": {\r\n      \"version\": \"1.0.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/pako/-/pako-1.0.10.tgz\",\r\n      \"integrity\": \"sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==\"\r\n    },\r\n    \"parallel-transform\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==\",\r\n      \"requires\": {\r\n        \"cyclist\": \"^1.0.1\",\r\n        \"inherits\": \"^2.0.3\",\r\n        \"readable-stream\": \"^2.1.5\"\r\n      }\r\n    },\r\n    \"parse-asn1\": {\r\n      \"version\": \"5.1.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz\",\r\n      \"integrity\": \"sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==\",\r\n      \"requires\": {\r\n        \"asn1.js\": \"^4.0.0\",\r\n        \"browserify-aes\": \"^1.0.0\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"evp_bytestokey\": \"^1.0.0\",\r\n        \"pbkdf2\": \"^3.0.3\",\r\n        \"safe-buffer\": \"^5.1.1\"\r\n      }\r\n    },\r\n    \"parse-json\": {\r\n      \"version\": \"2.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz\",\r\n      \"integrity\": \"sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"error-ex\": \"^1.2.0\"\r\n      }\r\n    },\r\n    \"parse-passwd\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=\",\r\n      \"dev\": true\r\n    },\r\n    \"pascalcase\": {\r\n      \"version\": \"0.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz\",\r\n      \"integrity\": \"sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=\"\r\n    },\r\n    \"path-browserify\": {\r\n      \"version\": \"0.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz\",\r\n      \"integrity\": \"sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==\"\r\n    },\r\n    \"path-dirname\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=\",\r\n      \"optional\": true\r\n    },\r\n    \"path-exists\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=\"\r\n    },\r\n    \"path-is-absolute\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-F0uSaHNVNP+8es5r9TpanhtcX18=\"\r\n    },\r\n    \"path-key\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=\"\r\n    },\r\n    \"path-parse\": {\r\n      \"version\": \"1.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz\",\r\n      \"integrity\": \"sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=\"\r\n    },\r\n    \"path-type\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"pify\": \"^2.0.0\",\r\n        \"pinkie-promise\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"pify\": {\r\n          \"version\": \"2.3.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz\",\r\n          \"integrity\": \"sha1-7RQaasBDqEnqWISY59yosVMw6Qw=\",\r\n          \"dev\": true\r\n        }\r\n      }\r\n    },\r\n    \"pbkdf2\": {\r\n      \"version\": \"3.0.17\",\r\n      \"resolved\": \"https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz\",\r\n      \"integrity\": \"sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=\",\r\n      \"requires\": {\r\n        \"create-hash\": \"^1.1.2\",\r\n        \"create-hmac\": \"^1.1.4\",\r\n        \"ripemd160\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.0.1\",\r\n        \"sha.js\": \"^2.4.8\"\r\n      }\r\n    },\r\n    \"performance-now\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz\",\r\n      \"integrity\": \"sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=\",\r\n      \"dev\": true\r\n    },\r\n    \"picomatch\": {\r\n      \"version\": \"2.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz\",\r\n      \"integrity\": \"sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==\",\r\n      \"optional\": true\r\n    },\r\n    \"pify\": {\r\n      \"version\": \"4.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/pify/-/pify-4.0.1.tgz\",\r\n      \"integrity\": \"sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==\"\r\n    },\r\n    \"pinkie\": {\r\n      \"version\": \"2.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz\",\r\n      \"integrity\": \"sha1-clVrgM+g1IqXToDnckjoDtT3+HA=\",\r\n      \"dev\": true\r\n    },\r\n    \"pinkie-promise\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-ITXW36ejWMBprJsXh3YogihFD/o=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"pinkie\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"pkg-dir\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=\",\r\n      \"requires\": {\r\n        \"find-up\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"posix-character-classes\": {\r\n      \"version\": \"0.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz\",\r\n      \"integrity\": \"sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=\"\r\n    },\r\n    \"preact\": {\r\n      \"version\": \"8.5.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/preact/-/preact-8.5.3.tgz\",\r\n      \"integrity\": \"sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw==\"\r\n    },\r\n    \"prettier\": {\r\n      \"version\": \"1.19.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz\",\r\n      \"integrity\": \"sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==\",\r\n      \"dev\": true\r\n    },\r\n    \"process\": {\r\n      \"version\": \"0.11.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\r\n      \"integrity\": \"sha1-czIwDoQBYb2j5podHZGn1LwW8YI=\"\r\n    },\r\n    \"process-nextick-args\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\"\r\n    },\r\n    \"promise\": {\r\n      \"version\": \"7.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/promise/-/promise-7.3.1.tgz\",\r\n      \"integrity\": \"sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==\",\r\n      \"requires\": {\r\n        \"asap\": \"~2.0.3\"\r\n      }\r\n    },\r\n    \"promise-inflight\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-mEcocL8igTL8vdhoEputEsPAKeM=\"\r\n    },\r\n    \"prop-types\": {\r\n      \"version\": \"15.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz\",\r\n      \"integrity\": \"sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==\",\r\n      \"requires\": {\r\n        \"loose-envify\": \"^1.4.0\",\r\n        \"object-assign\": \"^4.1.1\",\r\n        \"react-is\": \"^16.8.1\"\r\n      }\r\n    },\r\n    \"protobufjs\": {\r\n      \"version\": \"6.8.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz\",\r\n      \"integrity\": \"sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==\",\r\n      \"requires\": {\r\n        \"@protobufjs/aspromise\": \"^1.1.2\",\r\n        \"@protobufjs/base64\": \"^1.1.2\",\r\n        \"@protobufjs/codegen\": \"^2.0.4\",\r\n        \"@protobufjs/eventemitter\": \"^1.1.0\",\r\n        \"@protobufjs/fetch\": \"^1.1.0\",\r\n        \"@protobufjs/float\": \"^1.0.2\",\r\n        \"@protobufjs/inquire\": \"^1.1.0\",\r\n        \"@protobufjs/path\": \"^1.1.2\",\r\n        \"@protobufjs/pool\": \"^1.1.0\",\r\n        \"@protobufjs/utf8\": \"^1.1.0\",\r\n        \"@types/long\": \"^4.0.0\",\r\n        \"@types/node\": \"^10.1.0\",\r\n        \"long\": \"^4.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"@types/long\": {\r\n          \"version\": \"4.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz\",\r\n          \"integrity\": \"sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==\"\r\n        },\r\n        \"@types/node\": {\r\n          \"version\": \"10.17.13\",\r\n          \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz\",\r\n          \"integrity\": \"sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==\"\r\n        }\r\n      }\r\n    },\r\n    \"prr\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/prr/-/prr-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-0/wRS6BplaRexok/SEzrHXj19HY=\"\r\n    },\r\n    \"pseudomap\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-8FKijacOYYkX7wqKw0wa5aaChrM=\",\r\n      \"dev\": true\r\n    },\r\n    \"psl\": {\r\n      \"version\": \"1.8.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/psl/-/psl-1.8.0.tgz\",\r\n      \"integrity\": \"sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==\",\r\n      \"dev\": true\r\n    },\r\n    \"public-encrypt\": {\r\n      \"version\": \"4.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz\",\r\n      \"integrity\": \"sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=\",\r\n      \"requires\": {\r\n        \"bn.js\": \"^4.1.0\",\r\n        \"browserify-rsa\": \"^4.0.0\",\r\n        \"create-hash\": \"^1.1.0\",\r\n        \"parse-asn1\": \"^5.0.0\",\r\n        \"randombytes\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.1.2\"\r\n      }\r\n    },\r\n    \"pump\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/pump/-/pump-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=\",\r\n      \"requires\": {\r\n        \"end-of-stream\": \"^1.1.0\",\r\n        \"once\": \"^1.3.1\"\r\n      }\r\n    },\r\n    \"pumpify\": {\r\n      \"version\": \"1.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz\",\r\n      \"integrity\": \"sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=\",\r\n      \"requires\": {\r\n        \"duplexify\": \"^3.6.0\",\r\n        \"inherits\": \"^2.0.3\",\r\n        \"pump\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"pump\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/pump/-/pump-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=\",\r\n          \"requires\": {\r\n            \"end-of-stream\": \"^1.1.0\",\r\n            \"once\": \"^1.3.1\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"punycode\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==\"\r\n    },\r\n    \"qs\": {\r\n      \"version\": \"6.5.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.5.2.tgz\",\r\n      \"integrity\": \"sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==\",\r\n      \"dev\": true\r\n    },\r\n    \"querystring\": {\r\n      \"version\": \"0.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz\",\r\n      \"integrity\": \"sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=\"\r\n    },\r\n    \"querystring-es3\": {\r\n      \"version\": \"0.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz\",\r\n      \"integrity\": \"sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=\"\r\n    },\r\n    \"randombytes\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==\",\r\n      \"requires\": {\r\n        \"safe-buffer\": \"^5.1.0\"\r\n      }\r\n    },\r\n    \"randomfill\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz\",\r\n      \"integrity\": \"sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=\",\r\n      \"requires\": {\r\n        \"randombytes\": \"^2.0.5\",\r\n        \"safe-buffer\": \"^5.1.0\"\r\n      }\r\n    },\r\n    \"rc\": {\r\n      \"version\": \"1.2.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/rc/-/rc-1.2.8.tgz\",\r\n      \"integrity\": \"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==\",\r\n      \"requires\": {\r\n        \"deep-extend\": \"^0.6.0\",\r\n        \"ini\": \"~1.3.0\",\r\n        \"minimist\": \"^1.2.0\",\r\n        \"strip-json-comments\": \"~2.0.1\"\r\n      }\r\n    },\r\n    \"react-is\": {\r\n      \"version\": \"16.12.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz\",\r\n      \"integrity\": \"sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==\"\r\n    },\r\n    \"read-pkg\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"load-json-file\": \"^1.0.0\",\r\n        \"normalize-package-data\": \"^2.3.2\",\r\n        \"path-type\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"read-pkg-up\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"find-up\": \"^1.0.0\",\r\n        \"read-pkg\": \"^1.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"find-up\": {\r\n          \"version\": \"1.1.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz\",\r\n          \"integrity\": \"sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"path-exists\": \"^2.0.0\",\r\n            \"pinkie-promise\": \"^2.0.0\"\r\n          }\r\n        },\r\n        \"path-exists\": {\r\n          \"version\": \"2.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz\",\r\n          \"integrity\": \"sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"pinkie-promise\": \"^2.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"readable-stream\": {\r\n      \"version\": \"2.3.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz\",\r\n      \"integrity\": \"sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==\",\r\n      \"requires\": {\r\n        \"core-util-is\": \"~1.0.0\",\r\n        \"inherits\": \"~2.0.3\",\r\n        \"isarray\": \"~1.0.0\",\r\n        \"process-nextick-args\": \"~2.0.0\",\r\n        \"safe-buffer\": \"~5.1.1\",\r\n        \"string_decoder\": \"~1.1.1\",\r\n        \"util-deprecate\": \"~1.0.1\"\r\n      }\r\n    },\r\n    \"readdirp\": {\r\n      \"version\": \"2.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz\",\r\n      \"integrity\": \"sha1-DodiKjMlqjPokihcr4tOhGUppSU=\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"graceful-fs\": \"^4.1.11\",\r\n        \"micromatch\": \"^3.1.10\",\r\n        \"readable-stream\": \"^2.0.2\"\r\n      }\r\n    },\r\n    \"redent\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/redent/-/redent-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"indent-string\": \"^2.1.0\",\r\n        \"strip-indent\": \"^1.0.1\"\r\n      }\r\n    },\r\n    \"regex-not\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=\",\r\n      \"requires\": {\r\n        \"extend-shallow\": \"^3.0.2\",\r\n        \"safe-regex\": \"^1.1.0\"\r\n      }\r\n    },\r\n    \"remove-trailing-separator\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-wkvOKig62tW8P1jg1IJJuSN52O8=\",\r\n      \"optional\": true\r\n    },\r\n    \"repeat-element\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz\",\r\n      \"integrity\": \"sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=\"\r\n    },\r\n    \"repeat-string\": {\r\n      \"version\": \"1.6.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz\",\r\n      \"integrity\": \"sha1-jcrkcOHIirwtYA//Sndihtp15jc=\"\r\n    },\r\n    \"repeating\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"is-finite\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"request\": {\r\n      \"version\": \"2.88.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/request/-/request-2.88.2.tgz\",\r\n      \"integrity\": \"sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"aws-sign2\": \"~0.7.0\",\r\n        \"aws4\": \"^1.8.0\",\r\n        \"caseless\": \"~0.12.0\",\r\n        \"combined-stream\": \"~1.0.6\",\r\n        \"extend\": \"~3.0.2\",\r\n        \"forever-agent\": \"~0.6.1\",\r\n        \"form-data\": \"~2.3.2\",\r\n        \"har-validator\": \"~5.1.3\",\r\n        \"http-signature\": \"~1.2.0\",\r\n        \"is-typedarray\": \"~1.0.0\",\r\n        \"isstream\": \"~0.1.2\",\r\n        \"json-stringify-safe\": \"~5.0.1\",\r\n        \"mime-types\": \"~2.1.19\",\r\n        \"oauth-sign\": \"~0.9.0\",\r\n        \"performance-now\": \"^2.1.0\",\r\n        \"qs\": \"~6.5.2\",\r\n        \"safe-buffer\": \"^5.1.2\",\r\n        \"tough-cookie\": \"~2.5.0\",\r\n        \"tunnel-agent\": \"^0.6.0\",\r\n        \"uuid\": \"^3.3.2\"\r\n      }\r\n    },\r\n    \"require-directory\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\r\n      \"integrity\": \"sha1-jGStX9MNqxyXbiNE/+f3kqam30I=\"\r\n    },\r\n    \"require-main-filename\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=\"\r\n    },\r\n    \"resolve\": {\r\n      \"version\": \"1.14.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz\",\r\n      \"integrity\": \"sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==\",\r\n      \"requires\": {\r\n        \"path-parse\": \"^1.0.6\"\r\n      }\r\n    },\r\n    \"resolve-cwd\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"resolve-from\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"resolve-dir\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"expand-tilde\": \"^2.0.0\",\r\n        \"global-modules\": \"^1.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"global-modules\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz\",\r\n          \"integrity\": \"sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"global-prefix\": \"^1.0.1\",\r\n            \"is-windows\": \"^1.0.1\",\r\n            \"resolve-dir\": \"^1.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"resolve-from\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz\",\r\n      \"integrity\": \"sha1-six699nWiBvItuZTM17rywoYh0g=\",\r\n      \"dev\": true\r\n    },\r\n    \"resolve-url\": {\r\n      \"version\": \"0.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz\",\r\n      \"integrity\": \"sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=\"\r\n    },\r\n    \"ret\": {\r\n      \"version\": \"0.1.15\",\r\n      \"resolved\": \"https://registry.npmjs.org/ret/-/ret-0.1.15.tgz\",\r\n      \"integrity\": \"sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=\"\r\n    },\r\n    \"rimraf\": {\r\n      \"version\": \"2.7.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz\",\r\n      \"integrity\": \"sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==\",\r\n      \"requires\": {\r\n        \"glob\": \"^7.1.3\"\r\n      }\r\n    },\r\n    \"ripemd160\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz\",\r\n      \"integrity\": \"sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=\",\r\n      \"requires\": {\r\n        \"hash-base\": \"^3.0.0\",\r\n        \"inherits\": \"^2.0.1\"\r\n      }\r\n    },\r\n    \"run-queue\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz\",\r\n      \"integrity\": \"sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=\",\r\n      \"requires\": {\r\n        \"aproba\": \"^1.1.1\"\r\n      }\r\n    },\r\n    \"rw\": {\r\n      \"version\": \"1.3.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/rw/-/rw-1.3.3.tgz\",\r\n      \"integrity\": \"sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=\"\r\n    },\r\n    \"safe-buffer\": {\r\n      \"version\": \"5.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\r\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\"\r\n    },\r\n    \"safe-regex\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz\",\r\n      \"integrity\": \"sha1-QKNmnzsHfR6UPURinhV91IAjvy4=\",\r\n      \"requires\": {\r\n        \"ret\": \"~0.1.10\"\r\n      }\r\n    },\r\n    \"safer-buffer\": {\r\n      \"version\": \"2.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\r\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\"\r\n    },\r\n    \"sass-graph\": {\r\n      \"version\": \"2.2.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz\",\r\n      \"integrity\": \"sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"glob\": \"^7.0.0\",\r\n        \"lodash\": \"^4.0.0\",\r\n        \"scss-tokenizer\": \"^0.2.3\",\r\n        \"yargs\": \"^13.3.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"4.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz\",\r\n          \"integrity\": \"sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==\",\r\n          \"dev\": true\r\n        },\r\n        \"ansi-styles\": {\r\n          \"version\": \"3.2.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\r\n          \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"color-convert\": \"^1.9.0\"\r\n          }\r\n        },\r\n        \"cliui\": {\r\n          \"version\": \"5.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz\",\r\n          \"integrity\": \"sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"string-width\": \"^3.1.0\",\r\n            \"strip-ansi\": \"^5.2.0\",\r\n            \"wrap-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"get-caller-file\": {\r\n          \"version\": \"2.0.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\r\n          \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\r\n          \"dev\": true\r\n        },\r\n        \"require-main-filename\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\r\n          \"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\",\r\n          \"dev\": true\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"3.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\r\n          \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"emoji-regex\": \"^7.0.1\",\r\n            \"is-fullwidth-code-point\": \"^2.0.0\",\r\n            \"strip-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"5.2.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\r\n          \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^4.1.0\"\r\n          }\r\n        },\r\n        \"wrap-ansi\": {\r\n          \"version\": \"5.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz\",\r\n          \"integrity\": \"sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"strip-ansi\": \"^5.0.0\"\r\n          }\r\n        },\r\n        \"yargs\": {\r\n          \"version\": \"13.3.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz\",\r\n          \"integrity\": \"sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"cliui\": \"^5.0.0\",\r\n            \"find-up\": \"^3.0.0\",\r\n            \"get-caller-file\": \"^2.0.1\",\r\n            \"require-directory\": \"^2.1.1\",\r\n            \"require-main-filename\": \"^2.0.0\",\r\n            \"set-blocking\": \"^2.0.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"which-module\": \"^2.0.0\",\r\n            \"y18n\": \"^4.0.0\",\r\n            \"yargs-parser\": \"^13.1.2\"\r\n          }\r\n        },\r\n        \"yargs-parser\": {\r\n          \"version\": \"13.1.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz\",\r\n          \"integrity\": \"sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"camelcase\": \"^5.0.0\",\r\n            \"decamelize\": \"^1.2.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"sax\": {\r\n      \"version\": \"1.2.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/sax/-/sax-1.2.4.tgz\",\r\n      \"integrity\": \"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==\"\r\n    },\r\n    \"schema-utils\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz\",\r\n      \"integrity\": \"sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==\",\r\n      \"requires\": {\r\n        \"ajv\": \"^6.1.0\",\r\n        \"ajv-errors\": \"^1.0.0\",\r\n        \"ajv-keywords\": \"^3.1.0\"\r\n      }\r\n    },\r\n    \"scss-tokenizer\": {\r\n      \"version\": \"0.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz\",\r\n      \"integrity\": \"sha1-jrBtualyMzOCTT9VMGQRSYR85dE=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"js-base64\": \"^2.1.8\",\r\n        \"source-map\": \"^0.4.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"source-map\": {\r\n          \"version\": \"0.4.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz\",\r\n          \"integrity\": \"sha1-66T12pwNyZneaAMti092FzZSA2s=\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"amdefine\": \">=0.0.4\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"seedrandom\": {\r\n      \"version\": \"2.4.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz\",\r\n      \"integrity\": \"sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=\"\r\n    },\r\n    \"semver\": {\r\n      \"version\": \"5.7.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.1.tgz\",\r\n      \"integrity\": \"sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==\"\r\n    },\r\n    \"set-blocking\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-BF+XgtARrppoA93TgrJDkrPYkPc=\"\r\n    },\r\n    \"set-value\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==\",\r\n      \"requires\": {\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"is-extendable\": \"^0.1.1\",\r\n        \"is-plain-object\": \"^2.0.3\",\r\n        \"split-string\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"setimmediate\": {\r\n      \"version\": \"1.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz\",\r\n      \"integrity\": \"sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=\"\r\n    },\r\n    \"sha.js\": {\r\n      \"version\": \"2.4.11\",\r\n      \"resolved\": \"https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz\",\r\n      \"integrity\": \"sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=\",\r\n      \"requires\": {\r\n        \"inherits\": \"^2.0.1\",\r\n        \"safe-buffer\": \"^5.0.1\"\r\n      }\r\n    },\r\n    \"shebang-command\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\r\n      \"integrity\": \"sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=\",\r\n      \"requires\": {\r\n        \"shebang-regex\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"shebang-regex\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=\"\r\n    },\r\n    \"signal-exit\": {\r\n      \"version\": \"3.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz\",\r\n      \"integrity\": \"sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=\"\r\n    },\r\n    \"simple-concat\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=\"\r\n    },\r\n    \"simple-get\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==\",\r\n      \"requires\": {\r\n        \"decompress-response\": \"^4.2.0\",\r\n        \"once\": \"^1.3.1\",\r\n        \"simple-concat\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"snapdragon\": {\r\n      \"version\": \"0.8.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz\",\r\n      \"integrity\": \"sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=\",\r\n      \"requires\": {\r\n        \"base\": \"^0.11.1\",\r\n        \"debug\": \"^2.2.0\",\r\n        \"define-property\": \"^0.2.5\",\r\n        \"extend-shallow\": \"^2.0.1\",\r\n        \"map-cache\": \"^0.2.2\",\r\n        \"source-map\": \"^0.5.6\",\r\n        \"source-map-resolve\": \"^0.5.0\",\r\n        \"use\": \"^3.1.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"debug\": {\r\n          \"version\": \"2.6.9\",\r\n          \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\r\n          \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\r\n          \"requires\": {\r\n            \"ms\": \"2.0.0\"\r\n          }\r\n        },\r\n        \"define-property\": {\r\n          \"version\": \"0.2.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz\",\r\n          \"integrity\": \"sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"extend-shallow\": {\r\n          \"version\": \"2.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\r\n          \"integrity\": \"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=\",\r\n          \"requires\": {\r\n            \"is-extendable\": \"^0.1.0\"\r\n          }\r\n        },\r\n        \"ms\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\r\n          \"integrity\": \"sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=\"\r\n        }\r\n      }\r\n    },\r\n    \"snapdragon-node\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz\",\r\n      \"integrity\": \"sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=\",\r\n      \"requires\": {\r\n        \"define-property\": \"^1.0.0\",\r\n        \"isobject\": \"^3.0.0\",\r\n        \"snapdragon-util\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-dp66rz9KY6rTr56NMEybvnm/sOY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"is-accessor-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-data-descriptor\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=\",\r\n          \"requires\": {\r\n            \"kind-of\": \"^6.0.0\"\r\n          }\r\n        },\r\n        \"is-descriptor\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=\",\r\n          \"requires\": {\r\n            \"is-accessor-descriptor\": \"^1.0.0\",\r\n            \"is-data-descriptor\": \"^1.0.0\",\r\n            \"kind-of\": \"^6.0.2\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"snapdragon-util\": {\r\n      \"version\": \"3.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz\",\r\n      \"integrity\": \"sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=\",\r\n      \"requires\": {\r\n        \"kind-of\": \"^3.2.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"source-list-map\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=\"\r\n    },\r\n    \"source-map\": {\r\n      \"version\": \"0.5.7\",\r\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz\",\r\n      \"integrity\": \"sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=\"\r\n    },\r\n    \"source-map-resolve\": {\r\n      \"version\": \"0.5.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz\",\r\n      \"integrity\": \"sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==\",\r\n      \"requires\": {\r\n        \"atob\": \"^2.1.2\",\r\n        \"decode-uri-component\": \"^0.2.0\",\r\n        \"resolve-url\": \"^0.2.1\",\r\n        \"source-map-url\": \"^0.4.0\",\r\n        \"urix\": \"^0.1.0\"\r\n      }\r\n    },\r\n    \"source-map-support\": {\r\n      \"version\": \"0.5.16\",\r\n      \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz\",\r\n      \"integrity\": \"sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==\",\r\n      \"requires\": {\r\n        \"buffer-from\": \"^1.0.0\",\r\n        \"source-map\": \"^0.6.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"source-map\": {\r\n          \"version\": \"0.6.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\r\n          \"integrity\": \"sha1-dHIq8y6WFOnCh6jQu95IteLxomM=\"\r\n        }\r\n      }\r\n    },\r\n    \"source-map-url\": {\r\n      \"version\": \"0.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz\",\r\n      \"integrity\": \"sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=\"\r\n    },\r\n    \"spdx-correct\": {\r\n      \"version\": \"3.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz\",\r\n      \"integrity\": \"sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"spdx-expression-parse\": \"^3.0.0\",\r\n        \"spdx-license-ids\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"spdx-exceptions\": {\r\n      \"version\": \"2.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz\",\r\n      \"integrity\": \"sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==\",\r\n      \"dev\": true\r\n    },\r\n    \"spdx-expression-parse\": {\r\n      \"version\": \"3.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\r\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"spdx-exceptions\": \"^2.1.0\",\r\n        \"spdx-license-ids\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"spdx-license-ids\": {\r\n      \"version\": \"3.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz\",\r\n      \"integrity\": \"sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==\",\r\n      \"dev\": true\r\n    },\r\n    \"split-string\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz\",\r\n      \"integrity\": \"sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=\",\r\n      \"requires\": {\r\n        \"extend-shallow\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"sprintf-js\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz\",\r\n      \"integrity\": \"sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=\",\r\n      \"dev\": true\r\n    },\r\n    \"sshpk\": {\r\n      \"version\": \"1.16.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz\",\r\n      \"integrity\": \"sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"asn1\": \"~0.2.3\",\r\n        \"assert-plus\": \"^1.0.0\",\r\n        \"bcrypt-pbkdf\": \"^1.0.0\",\r\n        \"dashdash\": \"^1.12.0\",\r\n        \"ecc-jsbn\": \"~0.1.1\",\r\n        \"getpass\": \"^0.1.1\",\r\n        \"jsbn\": \"~0.1.0\",\r\n        \"safer-buffer\": \"^2.0.2\",\r\n        \"tweetnacl\": \"~0.14.0\"\r\n      }\r\n    },\r\n    \"ssri\": {\r\n      \"version\": \"6.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz\",\r\n      \"integrity\": \"sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=\",\r\n      \"requires\": {\r\n        \"figgy-pudding\": \"^3.5.1\"\r\n      }\r\n    },\r\n    \"static-extend\": {\r\n      \"version\": \"0.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz\",\r\n      \"integrity\": \"sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=\",\r\n      \"requires\": {\r\n        \"define-property\": \"^0.2.5\",\r\n        \"object-copy\": \"^0.1.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"define-property\": {\r\n          \"version\": \"0.2.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz\",\r\n          \"integrity\": \"sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=\",\r\n          \"requires\": {\r\n            \"is-descriptor\": \"^0.1.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"stdout-stream\": {\r\n      \"version\": \"1.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz\",\r\n      \"integrity\": \"sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"readable-stream\": \"^2.0.1\"\r\n      }\r\n    },\r\n    \"stream-browserify\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz\",\r\n      \"integrity\": \"sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==\",\r\n      \"requires\": {\r\n        \"inherits\": \"~2.0.1\",\r\n        \"readable-stream\": \"^2.0.2\"\r\n      }\r\n    },\r\n    \"stream-each\": {\r\n      \"version\": \"1.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz\",\r\n      \"integrity\": \"sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=\",\r\n      \"requires\": {\r\n        \"end-of-stream\": \"^1.1.0\",\r\n        \"stream-shift\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"stream-http\": {\r\n      \"version\": \"2.8.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz\",\r\n      \"integrity\": \"sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=\",\r\n      \"requires\": {\r\n        \"builtin-status-codes\": \"^3.0.0\",\r\n        \"inherits\": \"^2.0.1\",\r\n        \"readable-stream\": \"^2.3.6\",\r\n        \"to-arraybuffer\": \"^1.0.0\",\r\n        \"xtend\": \"^4.0.0\"\r\n      }\r\n    },\r\n    \"stream-shift\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==\"\r\n    },\r\n    \"string-width\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==\",\r\n      \"requires\": {\r\n        \"is-fullwidth-code-point\": \"^2.0.0\",\r\n        \"strip-ansi\": \"^4.0.0\"\r\n      }\r\n    },\r\n    \"string_decoder\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\r\n      \"requires\": {\r\n        \"safe-buffer\": \"~5.1.0\"\r\n      }\r\n    },\r\n    \"strip-ansi\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz\",\r\n      \"integrity\": \"sha1-qEeQIusaw2iocTibY1JixQXuNo8=\",\r\n      \"requires\": {\r\n        \"ansi-regex\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"strip-bom\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"is-utf8\": \"^0.2.0\"\r\n      }\r\n    },\r\n    \"strip-eof\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=\"\r\n    },\r\n    \"strip-indent\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"get-stdin\": \"^4.0.1\"\r\n      }\r\n    },\r\n    \"strip-json-comments\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz\",\r\n      \"integrity\": \"sha1-PFMZQukIwml8DsNEhYwobHygpgo=\"\r\n    },\r\n    \"supports-color\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=\",\r\n      \"dev\": true\r\n    },\r\n    \"tapable\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz\",\r\n      \"integrity\": \"sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==\"\r\n    },\r\n    \"tar\": {\r\n      \"version\": \"4.4.13\",\r\n      \"resolved\": \"https://registry.npmjs.org/tar/-/tar-4.4.13.tgz\",\r\n      \"integrity\": \"sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==\",\r\n      \"requires\": {\r\n        \"chownr\": \"^1.1.1\",\r\n        \"fs-minipass\": \"^1.2.5\",\r\n        \"minipass\": \"^2.8.6\",\r\n        \"minizlib\": \"^1.2.1\",\r\n        \"mkdirp\": \"^0.5.0\",\r\n        \"safe-buffer\": \"^5.1.2\",\r\n        \"yallist\": \"^3.0.3\"\r\n      }\r\n    },\r\n    \"terser\": {\r\n      \"version\": \"4.6.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/terser/-/terser-4.6.3.tgz\",\r\n      \"integrity\": \"sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==\",\r\n      \"requires\": {\r\n        \"commander\": \"^2.20.0\",\r\n        \"source-map\": \"~0.6.1\",\r\n        \"source-map-support\": \"~0.5.12\"\r\n      },\r\n      \"dependencies\": {\r\n        \"source-map\": {\r\n          \"version\": \"0.6.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\r\n          \"integrity\": \"sha1-dHIq8y6WFOnCh6jQu95IteLxomM=\"\r\n        }\r\n      }\r\n    },\r\n    \"terser-webpack-plugin\": {\r\n      \"version\": \"1.4.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz\",\r\n      \"integrity\": \"sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==\",\r\n      \"requires\": {\r\n        \"cacache\": \"^12.0.2\",\r\n        \"find-cache-dir\": \"^2.1.0\",\r\n        \"is-wsl\": \"^1.1.0\",\r\n        \"schema-utils\": \"^1.0.0\",\r\n        \"serialize-javascript\": \"^4.0.0\",\r\n        \"source-map\": \"^0.6.1\",\r\n        \"terser\": \"^4.1.2\",\r\n        \"webpack-sources\": \"^1.4.0\",\r\n        \"worker-farm\": \"^1.7.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"serialize-javascript\": {\r\n          \"version\": \"4.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz\",\r\n          \"integrity\": \"sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==\",\r\n          \"requires\": {\r\n            \"randombytes\": \"^2.1.0\"\r\n          }\r\n        },\r\n        \"source-map\": {\r\n          \"version\": \"0.6.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\r\n          \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\"\r\n        }\r\n      }\r\n    },\r\n    \"tfjs-cifar10-web\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/tfjs-cifar10-web/-/tfjs-cifar10-web-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-tV1Hd7LpZUC+pz5ladNeYBV8D8d3QoCywJsKiTdfQ8oct0PzDn572RE1BeV2r/PXnmTplJh20/tHX1JPR12U1A==\",\r\n      \"requires\": {\r\n        \"@tensorflow/tfjs\": \"^0.12.0\",\r\n        \"canvas\": \"^2.0.0-alpha.12\"\r\n      },\r\n      \"dependencies\": {\r\n        \"@tensorflow/tfjs\": {\r\n          \"version\": \"0.12.7\",\r\n          \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-0.12.7.tgz\",\r\n          \"integrity\": \"sha512-sGqnS7+Zj4SK6ap+fdFDGgddQf7l9RJBkWJc36frwP2F4LmFQQ5ED4+Wq7cBM1LzuyNq0p3pREWBbCfab0pnyw==\",\r\n          \"requires\": {\r\n            \"@tensorflow/tfjs-converter\": \"0.5.9\",\r\n            \"@tensorflow/tfjs-core\": \"0.12.17\",\r\n            \"@tensorflow/tfjs-layers\": \"0.7.5\"\r\n          },\r\n          \"dependencies\": {\r\n            \"@tensorflow/tfjs-converter\": {\r\n              \"version\": \"0.5.9\",\r\n              \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-0.5.9.tgz\",\r\n              \"integrity\": \"sha512-48sw17WffIoPYTN2gNZ5HWvjKLtQYXrSy+mqaZtiWaRYVjDzJdla6g7dPAL77MR2rxQAfVYMXg8GRDBmkzyBDw==\",\r\n              \"requires\": {\r\n                \"@types/long\": \"~3.0.32\",\r\n                \"protobufjs\": \"~6.8.6\"\r\n              }\r\n            },\r\n            \"@tensorflow/tfjs-core\": {\r\n              \"version\": \"0.12.17\",\r\n              \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-0.12.17.tgz\",\r\n              \"integrity\": \"sha512-CgFazQpGB21n1LRSxgyMwy0cN6WtuUPBP2W75zk6Rw+gFUXb8ZNh7fhn4nObjgKeIka36TI9MvT1FYrY+z150w==\",\r\n              \"requires\": {\r\n                \"@types/seedrandom\": \"~2.4.27\",\r\n                \"@types/webgl-ext\": \"~0.0.29\",\r\n                \"@types/webgl2\": \"~0.0.4\",\r\n                \"seedrandom\": \"~2.4.3\"\r\n              }\r\n            },\r\n            \"@tensorflow/tfjs-layers\": {\r\n              \"version\": \"0.7.5\",\r\n              \"resolved\": \"https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-0.7.5.tgz\",\r\n              \"integrity\": \"sha512-JIo4l0yEIfYi+quJG71wAeCP9tgXICg/MIOstowfCVGTHKh8oBVEm39bAI/zyTYYtFVLHeQSvY2KuRCN2h0nBg==\"\r\n            }\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"through\": {\r\n      \"version\": \"2.3.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\r\n      \"integrity\": \"sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=\"\r\n    },\r\n    \"through2\": {\r\n      \"version\": \"2.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/through2/-/through2-2.0.5.tgz\",\r\n      \"integrity\": \"sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=\",\r\n      \"requires\": {\r\n        \"readable-stream\": \"~2.3.6\",\r\n        \"xtend\": \"~4.0.1\"\r\n      }\r\n    },\r\n    \"timers-browserify\": {\r\n      \"version\": \"2.0.11\",\r\n      \"resolved\": \"https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz\",\r\n      \"integrity\": \"sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==\",\r\n      \"requires\": {\r\n        \"setimmediate\": \"^1.0.4\"\r\n      }\r\n    },\r\n    \"to-arraybuffer\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz\",\r\n      \"integrity\": \"sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=\"\r\n    },\r\n    \"to-object-path\": {\r\n      \"version\": \"0.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz\",\r\n      \"integrity\": \"sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=\",\r\n      \"requires\": {\r\n        \"kind-of\": \"^3.0.2\"\r\n      },\r\n      \"dependencies\": {\r\n        \"kind-of\": {\r\n          \"version\": \"3.2.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz\",\r\n          \"integrity\": \"sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=\",\r\n          \"requires\": {\r\n            \"is-buffer\": \"^1.1.5\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"to-regex\": {\r\n      \"version\": \"3.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz\",\r\n      \"integrity\": \"sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=\",\r\n      \"requires\": {\r\n        \"define-property\": \"^2.0.2\",\r\n        \"extend-shallow\": \"^3.0.2\",\r\n        \"regex-not\": \"^1.0.2\",\r\n        \"safe-regex\": \"^1.1.0\"\r\n      }\r\n    },\r\n    \"to-regex-range\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz\",\r\n      \"integrity\": \"sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=\",\r\n      \"requires\": {\r\n        \"is-number\": \"^3.0.0\",\r\n        \"repeat-string\": \"^1.6.1\"\r\n      }\r\n    },\r\n    \"topojson-client\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==\",\r\n      \"requires\": {\r\n        \"commander\": \"2\"\r\n      }\r\n    },\r\n    \"tough-cookie\": {\r\n      \"version\": \"2.5.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz\",\r\n      \"integrity\": \"sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"psl\": \"^1.1.28\",\r\n        \"punycode\": \"^2.1.1\"\r\n      }\r\n    },\r\n    \"trim-newlines\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-WIeWa7WCpFA6QetST301ARgVphM=\",\r\n      \"dev\": true\r\n    },\r\n    \"true-case-path\": {\r\n      \"version\": \"1.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz\",\r\n      \"integrity\": \"sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"glob\": \"^7.1.2\"\r\n      }\r\n    },\r\n    \"tslib\": {\r\n      \"version\": \"1.10.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz\",\r\n      \"integrity\": \"sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==\"\r\n    },\r\n    \"tslint\": {\r\n      \"version\": \"5.20.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz\",\r\n      \"integrity\": \"sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"@babel/code-frame\": \"^7.0.0\",\r\n        \"builtin-modules\": \"^1.1.1\",\r\n        \"chalk\": \"^2.3.0\",\r\n        \"commander\": \"^2.12.1\",\r\n        \"diff\": \"^4.0.1\",\r\n        \"glob\": \"^7.1.1\",\r\n        \"js-yaml\": \"^3.13.1\",\r\n        \"minimatch\": \"^3.0.4\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"resolve\": \"^1.3.2\",\r\n        \"semver\": \"^5.3.0\",\r\n        \"tslib\": \"^1.8.0\",\r\n        \"tsutils\": \"^2.29.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-styles\": {\r\n          \"version\": \"3.2.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\r\n          \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"color-convert\": \"^1.9.0\"\r\n          }\r\n        },\r\n        \"chalk\": {\r\n          \"version\": \"2.4.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\r\n          \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.1\",\r\n            \"escape-string-regexp\": \"^1.0.5\",\r\n            \"supports-color\": \"^5.3.0\"\r\n          }\r\n        },\r\n        \"supports-color\": {\r\n          \"version\": \"5.5.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\r\n          \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"has-flag\": \"^3.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"tslint-config-prettier\": {\r\n      \"version\": \"1.18.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz\",\r\n      \"integrity\": \"sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==\",\r\n      \"dev\": true\r\n    },\r\n    \"tsutils\": {\r\n      \"version\": \"2.29.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz\",\r\n      \"integrity\": \"sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"tslib\": \"^1.8.1\"\r\n      }\r\n    },\r\n    \"tty-browserify\": {\r\n      \"version\": \"0.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz\",\r\n      \"integrity\": \"sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=\"\r\n    },\r\n    \"tunnel-agent\": {\r\n      \"version\": \"0.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz\",\r\n      \"integrity\": \"sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"safe-buffer\": \"^5.0.1\"\r\n      }\r\n    },\r\n    \"tweetnacl\": {\r\n      \"version\": \"0.14.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz\",\r\n      \"integrity\": \"sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=\",\r\n      \"dev\": true\r\n    },\r\n    \"typedarray\": {\r\n      \"version\": \"0.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz\",\r\n      \"integrity\": \"sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=\"\r\n    },\r\n    \"typescript\": {\r\n      \"version\": \"3.7.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz\",\r\n      \"integrity\": \"sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==\",\r\n      \"dev\": true\r\n    },\r\n    \"ua-parser-js\": {\r\n      \"version\": \"0.7.21\",\r\n      \"resolved\": \"https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz\",\r\n      \"integrity\": \"sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==\"\r\n    },\r\n    \"uglifycss\": {\r\n      \"version\": \"0.0.29\",\r\n      \"resolved\": \"https://registry.npmjs.org/uglifycss/-/uglifycss-0.0.29.tgz\",\r\n      \"integrity\": \"sha512-J2SQ2QLjiknNGbNdScaNZsXgmMGI0kYNrXaDlr4obnPW9ni1jljb1NeEVWAiTgZ8z+EBWP2ozfT9vpy03rjlMQ==\"\r\n    },\r\n    \"uglifyjs\": {\r\n      \"version\": \"2.4.11\",\r\n      \"resolved\": \"https://registry.npmjs.org/uglifyjs/-/uglifyjs-2.4.11.tgz\",\r\n      \"integrity\": \"sha1-NEDWTgRXWViVJEGOtkHGi7kNET4=\"\r\n    },\r\n    \"union-value\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==\",\r\n      \"requires\": {\r\n        \"arr-union\": \"^3.1.0\",\r\n        \"get-value\": \"^2.0.6\",\r\n        \"is-extendable\": \"^0.1.1\",\r\n        \"set-value\": \"^2.0.1\"\r\n      }\r\n    },\r\n    \"unique-filename\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz\",\r\n      \"integrity\": \"sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=\",\r\n      \"requires\": {\r\n        \"unique-slug\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"unique-slug\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz\",\r\n      \"integrity\": \"sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==\",\r\n      \"requires\": {\r\n        \"imurmurhash\": \"^0.1.4\"\r\n      }\r\n    },\r\n    \"unset-value\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz\",\r\n      \"integrity\": \"sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=\",\r\n      \"requires\": {\r\n        \"has-value\": \"^0.3.1\",\r\n        \"isobject\": \"^3.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"has-value\": {\r\n          \"version\": \"0.3.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz\",\r\n          \"integrity\": \"sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=\",\r\n          \"requires\": {\r\n            \"get-value\": \"^2.0.3\",\r\n            \"has-values\": \"^0.1.4\",\r\n            \"isobject\": \"^2.0.0\"\r\n          },\r\n          \"dependencies\": {\r\n            \"isobject\": {\r\n              \"version\": \"2.1.0\",\r\n              \"resolved\": \"https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz\",\r\n              \"integrity\": \"sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=\",\r\n              \"requires\": {\r\n                \"isarray\": \"1.0.0\"\r\n              }\r\n            }\r\n          }\r\n        },\r\n        \"has-values\": {\r\n          \"version\": \"0.1.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz\",\r\n          \"integrity\": \"sha1-bWHeldkd/Km5oCCJrThL/49it3E=\"\r\n        }\r\n      }\r\n    },\r\n    \"upath\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/upath/-/upath-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==\",\r\n      \"optional\": true\r\n    },\r\n    \"uri-js\": {\r\n      \"version\": \"4.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz\",\r\n      \"integrity\": \"sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==\",\r\n      \"requires\": {\r\n        \"punycode\": \"^2.1.0\"\r\n      }\r\n    },\r\n    \"urix\": {\r\n      \"version\": \"0.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/urix/-/urix-0.1.0.tgz\",\r\n      \"integrity\": \"sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=\"\r\n    },\r\n    \"url\": {\r\n      \"version\": \"0.11.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/url/-/url-0.11.0.tgz\",\r\n      \"integrity\": \"sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=\",\r\n      \"requires\": {\r\n        \"punycode\": \"1.3.2\",\r\n        \"querystring\": \"0.2.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"punycode\": {\r\n          \"version\": \"1.3.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz\",\r\n          \"integrity\": \"sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=\"\r\n        }\r\n      }\r\n    },\r\n    \"url-loader\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==\",\r\n      \"requires\": {\r\n        \"loader-utils\": \"^1.1.0\",\r\n        \"mime\": \"^2.0.3\",\r\n        \"schema-utils\": \"^1.0.0\"\r\n      }\r\n    },\r\n    \"use\": {\r\n      \"version\": \"3.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/use/-/use-3.1.1.tgz\",\r\n      \"integrity\": \"sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=\"\r\n    },\r\n    \"util\": {\r\n      \"version\": \"0.11.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/util/-/util-0.11.1.tgz\",\r\n      \"integrity\": \"sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==\",\r\n      \"requires\": {\r\n        \"inherits\": \"2.0.3\"\r\n      },\r\n      \"dependencies\": {\r\n        \"inherits\": {\r\n          \"version\": \"2.0.3\",\r\n          \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz\",\r\n          \"integrity\": \"sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=\"\r\n        }\r\n      }\r\n    },\r\n    \"util-deprecate\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=\"\r\n    },\r\n    \"uuid\": {\r\n      \"version\": \"3.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz\",\r\n      \"integrity\": \"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==\",\r\n      \"dev\": true\r\n    },\r\n    \"v8-compile-cache\": {\r\n      \"version\": \"2.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz\",\r\n      \"integrity\": \"sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==\",\r\n      \"dev\": true\r\n    },\r\n    \"validate-npm-package-license\": {\r\n      \"version\": \"3.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\r\n      \"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"spdx-correct\": \"^3.0.0\",\r\n        \"spdx-expression-parse\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"vega-canvas\": {\r\n      \"version\": \"1.2.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz\",\r\n      \"integrity\": \"sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==\"\r\n    },\r\n    \"vega-crossfilter\": {\r\n      \"version\": \"3.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-3.0.1.tgz\",\r\n      \"integrity\": \"sha512-GNCP0k1otJKtE9SnYm1cDBqUfBvWTaxJ3/bdMpWvGNUtAdDBAlrtspDBTpwMu4MLNWbAy1zp9jN0ztCXBZF29Q==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-dataflow\": {\r\n      \"version\": \"4.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-4.1.0.tgz\",\r\n      \"integrity\": \"sha512-LuXoN3LkYWNYTPeMiOgSlw2TZAWjmN46Q9HmHM8ClhXYAj+pYme3IPdtYn1OmcvWe4rKeiYgNYrtJCgTOvCepg==\",\r\n      \"requires\": {\r\n        \"vega-loader\": \"^3.1.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-embed\": {\r\n      \"version\": \"3.28.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-embed/-/vega-embed-3.28.0.tgz\",\r\n      \"integrity\": \"sha512-qIHNKPk7rwuID8/dHthXPMQrEhA6AjLiiVqD3Ols8Ff80GLOgXggjxwwyAI8DrKhOVNFbQwsTgx5E8cH0X5y6w==\",\r\n      \"requires\": {\r\n        \"d3-selection\": \"^1.3.2\",\r\n        \"json-stringify-pretty-compact\": \"^1.2.0\",\r\n        \"semver\": \"^5.6.0\",\r\n        \"vega-lib\": \"^4.4.0\",\r\n        \"vega-lite\": \"^3.0.0-rc10 || ^2.6.0\",\r\n        \"vega-schema-url-parser\": \"^1.1.0\",\r\n        \"vega-themes\": \"^2.2.0\",\r\n        \"vega-tooltip\": \"^0.15.0\"\r\n      }\r\n    },\r\n    \"vega-encode\": {\r\n      \"version\": \"3.2.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-encode/-/vega-encode-3.2.2.tgz\",\r\n      \"integrity\": \"sha512-Hmk+ReH6R1wTnz56gWyk8CnzgAzq11QYkrEzw794MMY2l61EG3sX9veyZ9AdtDufOq9oDa58/kfgk65UD9A+sA==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"d3-format\": \"^1.3.2\",\r\n        \"d3-interpolate\": \"^1.3.2\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-scale\": \"^2.5.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-event-selector\": {\r\n      \"version\": \"2.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.2.tgz\",\r\n      \"integrity\": \"sha512-Uv72vBfM0lrlI2belKHFMZuVnW2uJl2ShqWPwGSXPVe6p+PzgqoPJYC8A/i5N8B54UA4UMDzlbBeo3x7q2W9Yg==\"\r\n    },\r\n    \"vega-expression\": {\r\n      \"version\": \"2.6.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.3.tgz\",\r\n      \"integrity\": \"sha512-sME1+45BToTGsftb1Q6Ubs2iRYEoXkD2NRGnJuKS9YJ2ITzZwPHF/jy2kHW3iLpuNjj54meaO7HMQ/hUKrciUw==\",\r\n      \"requires\": {\r\n        \"vega-util\": \"^1.11.0\"\r\n      }\r\n    },\r\n    \"vega-force\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-force/-/vega-force-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-Uar26RDxDQEpIdWBIFKnOr6/B30RU8/2qBtoiux1C3goZIWBRkXNlCR5kMDkll8Mg60deD6ynflsXXNwyGS69w==\",\r\n      \"requires\": {\r\n        \"d3-force\": \"^1.1.0\",\r\n        \"vega-dataflow\": \"^4.0.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-geo\": {\r\n      \"version\": \"3.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-geo/-/vega-geo-3.1.1.tgz\",\r\n      \"integrity\": \"sha512-EltBQmid6DZ7d4iArgTnsGRsx4ZaHrwvaegq6iIwWp7GHtJ8i+8bzPFfHo1pBuRVmHG4ZA2NH+cNaW2IIgWcPg==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"d3-contour\": \"^1.3.2\",\r\n        \"d3-geo\": \"^1.11.3\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-projection\": \"^1.2.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-hierarchy\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-zPxOsQbswVDMfn9JdDG0ihZA4qhQL5WJxBsSRFsMeuyDTFuE6biBInpm/g0QDGmHMF2EOY4AwD2WRyF+jAyTqw==\",\r\n      \"requires\": {\r\n        \"d3-collection\": \"^1.0.7\",\r\n        \"d3-hierarchy\": \"^1.1.8\",\r\n        \"vega-dataflow\": \"^4.0.4\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-lib\": {\r\n      \"version\": \"4.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-lib/-/vega-lib-4.4.0.tgz\",\r\n      \"integrity\": \"sha512-bfOsO5wks+ctnJ94fIPWH/B0qocdFs4WZ8teIgjF7m5XE+EVln+1nq9Z+sV7wdw7vftzGg0GAx9UH/kJxyopKg==\",\r\n      \"requires\": {\r\n        \"vega-crossfilter\": \"^3.0.1\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-encode\": \"^3.2.2\",\r\n        \"vega-event-selector\": \"^2.0.0\",\r\n        \"vega-expression\": \"^2.4.0\",\r\n        \"vega-force\": \"^3.0.0\",\r\n        \"vega-geo\": \"^3.1.1\",\r\n        \"vega-hierarchy\": \"^3.1.0\",\r\n        \"vega-loader\": \"^3.1.0\",\r\n        \"vega-parser\": \"^3.9.0\",\r\n        \"vega-projection\": \"^1.2.0\",\r\n        \"vega-runtime\": \"^3.2.0\",\r\n        \"vega-scale\": \"^2.5.1\",\r\n        \"vega-scenegraph\": \"^3.2.3\",\r\n        \"vega-statistics\": \"^1.2.3\",\r\n        \"vega-transforms\": \"^2.3.1\",\r\n        \"vega-typings\": \"*\",\r\n        \"vega-util\": \"^1.7.0\",\r\n        \"vega-view\": \"^3.4.1\",\r\n        \"vega-view-transforms\": \"^2.0.3\",\r\n        \"vega-voronoi\": \"^3.0.0\",\r\n        \"vega-wordcloud\": \"^3.0.0\"\r\n      }\r\n    },\r\n    \"vega-lite\": {\r\n      \"version\": \"3.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-lite/-/vega-lite-3.4.0.tgz\",\r\n      \"integrity\": \"sha512-RJg9uBNh5g0hA8xTzAcALUfNx0cEq7E7xx+vxPEGSMgI8z+A5KlE9u4jUx6nKu7Mjg1qZO8WOyWCmBS1kdFWPg==\",\r\n      \"requires\": {\r\n        \"@types/clone\": \"~0.1.30\",\r\n        \"@types/fast-json-stable-stringify\": \"^2.0.0\",\r\n        \"clone\": \"~2.1.2\",\r\n        \"fast-deep-equal\": \"~2.0.1\",\r\n        \"fast-json-stable-stringify\": \"~2.0.0\",\r\n        \"json-stringify-pretty-compact\": \"~2.0.0\",\r\n        \"tslib\": \"~1.10.0\",\r\n        \"vega-event-selector\": \"~2.0.0\",\r\n        \"vega-expression\": \"~2.6.0\",\r\n        \"vega-typings\": \"0.7.2\",\r\n        \"vega-util\": \"~1.10.0\",\r\n        \"yargs\": \"~13.3.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"4.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz\",\r\n          \"integrity\": \"sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==\"\r\n        },\r\n        \"ansi-styles\": {\r\n          \"version\": \"3.2.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\r\n          \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\r\n          \"requires\": {\r\n            \"color-convert\": \"^1.9.0\"\r\n          }\r\n        },\r\n        \"cliui\": {\r\n          \"version\": \"5.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz\",\r\n          \"integrity\": \"sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==\",\r\n          \"requires\": {\r\n            \"string-width\": \"^3.1.0\",\r\n            \"strip-ansi\": \"^5.2.0\",\r\n            \"wrap-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"fast-json-stable-stringify\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz\",\r\n          \"integrity\": \"sha1-1RQsDK7msRifh9OnYREGT4bIu/I=\"\r\n        },\r\n        \"get-caller-file\": {\r\n          \"version\": \"2.0.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\r\n          \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\"\r\n        },\r\n        \"json-stringify-pretty-compact\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz\",\r\n          \"integrity\": \"sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==\"\r\n        },\r\n        \"require-main-filename\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\r\n          \"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\"\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"3.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\r\n          \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\r\n          \"requires\": {\r\n            \"emoji-regex\": \"^7.0.1\",\r\n            \"is-fullwidth-code-point\": \"^2.0.0\",\r\n            \"strip-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"5.2.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\r\n          \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^4.1.0\"\r\n          }\r\n        },\r\n        \"vega-typings\": {\r\n          \"version\": \"0.7.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/vega-typings/-/vega-typings-0.7.2.tgz\",\r\n          \"integrity\": \"sha512-BReB2qRERA/Ke+QoxKDQ7fES25A9Q3qKRm1CJxwvpLGhAl4k5cGDORx6yW+J3rFHMzpJlmdRM+kb489EuphxZQ==\",\r\n          \"requires\": {\r\n            \"vega-util\": \"^1.10.0\"\r\n          }\r\n        },\r\n        \"vega-util\": {\r\n          \"version\": \"1.10.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/vega-util/-/vega-util-1.10.0.tgz\",\r\n          \"integrity\": \"sha512-fTGnTG7FhtTG9tiYDL3k5s8YHqB71Ml5+aC9B7eaBygeB8GKXBrcbTXLOzoCRxT3Jr5cRhr99PMBu0AkqmhBog==\"\r\n        },\r\n        \"wrap-ansi\": {\r\n          \"version\": \"5.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz\",\r\n          \"integrity\": \"sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==\",\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"strip-ansi\": \"^5.0.0\"\r\n          }\r\n        },\r\n        \"yargs\": {\r\n          \"version\": \"13.3.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz\",\r\n          \"integrity\": \"sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==\",\r\n          \"requires\": {\r\n            \"cliui\": \"^5.0.0\",\r\n            \"find-up\": \"^3.0.0\",\r\n            \"get-caller-file\": \"^2.0.1\",\r\n            \"require-directory\": \"^2.1.1\",\r\n            \"require-main-filename\": \"^2.0.0\",\r\n            \"set-blocking\": \"^2.0.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"which-module\": \"^2.0.0\",\r\n            \"y18n\": \"^4.0.0\",\r\n            \"yargs-parser\": \"^13.1.2\"\r\n          }\r\n        },\r\n        \"yargs-parser\": {\r\n          \"version\": \"13.1.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz\",\r\n          \"integrity\": \"sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==\",\r\n          \"requires\": {\r\n            \"camelcase\": \"^5.0.0\",\r\n            \"decamelize\": \"^1.2.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"vega-loader\": {\r\n      \"version\": \"3.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-loader/-/vega-loader-3.1.0.tgz\",\r\n      \"integrity\": \"sha512-FD9KJdPxBOa+fTnjC2dfY5+kB05hXyVOfjIkssmgyyhELJPp2FwclcF4mVy7Ay1E8fUHY3GgbwSE5jL8k4pYUg==\",\r\n      \"requires\": {\r\n        \"d3-dsv\": \"^1.0.10\",\r\n        \"d3-time-format\": \"^2.1.3\",\r\n        \"node-fetch\": \"^2.3.0\",\r\n        \"topojson-client\": \"^3.0.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"node-fetch\": {\r\n          \"version\": \"2.6.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz\",\r\n          \"integrity\": \"sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==\"\r\n        }\r\n      }\r\n    },\r\n    \"vega-parser\": {\r\n      \"version\": \"3.9.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-parser/-/vega-parser-3.9.0.tgz\",\r\n      \"integrity\": \"sha512-/fdPt5wcZgbPi0zwzJsBgi/k2GO3s53j7kJUYFGff75+wLJ2n/XtLCU295Wo7+cGCfkCZs0FfYKWa8AJrQZiag==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"d3-color\": \"^1.2.3\",\r\n        \"d3-format\": \"^1.3.2\",\r\n        \"d3-geo\": \"^1.11.3\",\r\n        \"d3-time-format\": \"^2.1.3\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-event-selector\": \"^2.0.0\",\r\n        \"vega-expression\": \"^2.4.0\",\r\n        \"vega-scale\": \"^2.5.1\",\r\n        \"vega-scenegraph\": \"^3.2.3\",\r\n        \"vega-statistics\": \"^1.2.3\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-projection\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-projection/-/vega-projection-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-Prb/E41PqZT5b+46rHv6BZLDsXMe+NFClHxJ9NbwW7mntz8aMGAHiYolVa/M2KuTLbsXVgDAPxk/aA9tbQ0SSg==\",\r\n      \"requires\": {\r\n        \"d3-geo\": \"^1.11.9\",\r\n        \"d3-geo-projection\": \"^2.7.1\"\r\n      }\r\n    },\r\n    \"vega-runtime\": {\r\n      \"version\": \"3.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-runtime/-/vega-runtime-3.2.0.tgz\",\r\n      \"integrity\": \"sha512-aoWqH+U5tiByj3cIGZsTDPMTb10tUN2nm4zWa3Z7lOUilbw/+gEaOuy1qvr4VrVhUShsnytudED4OpQNUkKy3Q==\",\r\n      \"requires\": {\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-scale\": {\r\n      \"version\": \"2.5.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-scale/-/vega-scale-2.5.1.tgz\",\r\n      \"integrity\": \"sha512-EOpUDOjTAD7DhXglyOquXTzXFXjnNvrGyMDCOsfRL/XUTsbjYYNkdl0Q30c9fVN1I+H65lMz52xwN16yxwMuTw==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"d3-interpolate\": \"^1.3.2\",\r\n        \"d3-scale\": \"^2.1.2\",\r\n        \"d3-scale-chromatic\": \"^1.3.3\",\r\n        \"d3-time\": \"^1.0.10\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-scenegraph\": {\r\n      \"version\": \"3.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-3.2.3.tgz\",\r\n      \"integrity\": \"sha512-L4mZ6LpEKvW5Q0c8gyqozGuoY5miJI4DiRipiAG0BQ6rB67tK+8qlaTfslX4tNBz88mu+CyVO9ZjNW/M4nBI3w==\",\r\n      \"requires\": {\r\n        \"d3-path\": \"^1.0.7\",\r\n        \"d3-shape\": \"^1.2.2\",\r\n        \"vega-canvas\": \"^1.1.0\",\r\n        \"vega-loader\": \"^3.0.1\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-schema-url-parser\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==\"\r\n    },\r\n    \"vega-statistics\": {\r\n      \"version\": \"1.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.2.tgz\",\r\n      \"integrity\": \"sha512-G6rvZ50MqnmiN1fGqDnFoCLWFwBCYt3nCucXu3zWov7A1/lsatvbDKYeSlVlnvT9OHtv4L+3pRpepFh5IhXKFg==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.4.0\"\r\n      }\r\n    },\r\n    \"vega-themes\": {\r\n      \"version\": \"2.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-themes/-/vega-themes-2.6.0.tgz\",\r\n      \"integrity\": \"sha512-TO9xs+xJcHD4YEQSd3G/SiLAxJyXltsgQM2scK7ZLJrPZ8bhkEdqBJWOhIQlxH7OOrUBf/RCtyUDynDTTP5WEw==\"\r\n    },\r\n    \"vega-tooltip\": {\r\n      \"version\": \"0.15.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.15.0.tgz\",\r\n      \"integrity\": \"sha512-xfac+5I7YR1ZKfip2i9xlEHuNrl5YpQnZAmTc9dzQcnkoo5MmGVIhH01tEGOr8keVC9UbYU1AREezwv8Mpajhw==\",\r\n      \"requires\": {\r\n        \"vega-util\": \"^1.7.1\"\r\n      }\r\n    },\r\n    \"vega-transforms\": {\r\n      \"version\": \"2.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-transforms/-/vega-transforms-2.3.1.tgz\",\r\n      \"integrity\": \"sha512-jvDz33ohZiP6cN74quEvesHr0sbSMMQ69ZZqgL6cRDHBqfiuHPhZofBKWDXE1nEWDmJqTEyvg0gsnA8vpHzpjQ==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-statistics\": \"^1.2.3\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-typings\": {\r\n      \"version\": \"0.12.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-typings/-/vega-typings-0.12.0.tgz\",\r\n      \"integrity\": \"sha512-K+IoUTTtXW3E1Qhr/y+JgLRxy476viAm6DeM8IiVrA8vvuLA3FTzHaeI7TCnaWEwk9xxLJBtdVKKC5FGbp0Nyw==\",\r\n      \"requires\": {\r\n        \"vega-util\": \"^1.12.1\"\r\n      }\r\n    },\r\n    \"vega-util\": {\r\n      \"version\": \"1.12.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-util/-/vega-util-1.12.2.tgz\",\r\n      \"integrity\": \"sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw==\"\r\n    },\r\n    \"vega-view\": {\r\n      \"version\": \"3.4.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-view/-/vega-view-3.4.1.tgz\",\r\n      \"integrity\": \"sha512-hT9Bj9qRCGz+4umid8tFuADyUF7xOHTQmeu18XtRgEkNOtTALlDYLmCSpcGkP1N6eeZm3aRWBtkUz/XE7/6d+Q==\",\r\n      \"requires\": {\r\n        \"d3-array\": \"^2.0.2\",\r\n        \"d3-timer\": \"^1.0.9\",\r\n        \"vega-dataflow\": \"^4.1.0\",\r\n        \"vega-parser\": \"^3.9.0\",\r\n        \"vega-runtime\": \"^3.2.0\",\r\n        \"vega-scenegraph\": \"^3.2.3\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-view-transforms\": {\r\n      \"version\": \"2.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-2.0.3.tgz\",\r\n      \"integrity\": \"sha512-m42sP2G72KIIEhbno5P3wYXuGe4C5fj0ztfg1TrSEmGsIHOqoehRvte/1e9q/dV+1rB3TqfcWXgQVEDHCFLEvQ==\",\r\n      \"requires\": {\r\n        \"vega-dataflow\": \"^4.0.4\",\r\n        \"vega-scenegraph\": \"^3.2.3\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-voronoi\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-ZkQw4UprxqiS3IjrdLOoQq1oEeH0REqWonf7Wz5zt2pKDHyMPlFX89EueoDYOKnfQjk9/7IiptBDK1ruAbDNiQ==\",\r\n      \"requires\": {\r\n        \"d3-voronoi\": \"^1.1.2\",\r\n        \"vega-dataflow\": \"^4.0.0\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"vega-wordcloud\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-/2F09L2tNTQ8aqK/ZLjd7m+fYwJR8/waE8YWuexLZob4+4BEByzqFfRMATE39ZpdTHOreCEQ5uUKyvv0qA6O0A==\",\r\n      \"requires\": {\r\n        \"vega-canvas\": \"^1.0.1\",\r\n        \"vega-dataflow\": \"^4.0.0\",\r\n        \"vega-scale\": \"^2.1.1\",\r\n        \"vega-statistics\": \"^1.2.1\",\r\n        \"vega-util\": \"^1.7.0\"\r\n      }\r\n    },\r\n    \"verror\": {\r\n      \"version\": \"1.10.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/verror/-/verror-1.10.0.tgz\",\r\n      \"integrity\": \"sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"assert-plus\": \"^1.0.0\",\r\n        \"core-util-is\": \"1.0.2\",\r\n        \"extsprintf\": \"^1.2.0\"\r\n      }\r\n    },\r\n    \"vm-browserify\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==\"\r\n    },\r\n    \"watchpack\": {\r\n      \"version\": \"1.7.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz\",\r\n      \"integrity\": \"sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==\",\r\n      \"requires\": {\r\n        \"chokidar\": \"^3.4.1\",\r\n        \"graceful-fs\": \"^4.1.2\",\r\n        \"neo-async\": \"^2.5.0\",\r\n        \"watchpack-chokidar2\": \"^2.0.0\"\r\n      },\r\n      \"dependencies\": {\r\n        \"anymatch\": {\r\n          \"version\": \"3.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz\",\r\n          \"integrity\": \"sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"normalize-path\": \"^3.0.0\",\r\n            \"picomatch\": \"^2.0.4\"\r\n          }\r\n        },\r\n        \"binary-extensions\": {\r\n          \"version\": \"2.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz\",\r\n          \"integrity\": \"sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==\",\r\n          \"optional\": true\r\n        },\r\n        \"braces\": {\r\n          \"version\": \"3.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/braces/-/braces-3.0.2.tgz\",\r\n          \"integrity\": \"sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"fill-range\": \"^7.0.1\"\r\n          }\r\n        },\r\n        \"chokidar\": {\r\n          \"version\": \"3.4.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz\",\r\n          \"integrity\": \"sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"anymatch\": \"~3.1.1\",\r\n            \"braces\": \"~3.0.2\",\r\n            \"fsevents\": \"~2.1.2\",\r\n            \"glob-parent\": \"~5.1.0\",\r\n            \"is-binary-path\": \"~2.1.0\",\r\n            \"is-glob\": \"~4.0.1\",\r\n            \"normalize-path\": \"~3.0.0\",\r\n            \"readdirp\": \"~3.4.0\"\r\n          }\r\n        },\r\n        \"fill-range\": {\r\n          \"version\": \"7.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz\",\r\n          \"integrity\": \"sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"to-regex-range\": \"^5.0.1\"\r\n          }\r\n        },\r\n        \"fsevents\": {\r\n          \"version\": \"2.1.3\",\r\n          \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz\",\r\n          \"integrity\": \"sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==\",\r\n          \"optional\": true\r\n        },\r\n        \"glob-parent\": {\r\n          \"version\": \"5.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz\",\r\n          \"integrity\": \"sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"is-glob\": \"^4.0.1\"\r\n          }\r\n        },\r\n        \"is-binary-path\": {\r\n          \"version\": \"2.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz\",\r\n          \"integrity\": \"sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"binary-extensions\": \"^2.0.0\"\r\n          }\r\n        },\r\n        \"is-number\": {\r\n          \"version\": \"7.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz\",\r\n          \"integrity\": \"sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==\",\r\n          \"optional\": true\r\n        },\r\n        \"readdirp\": {\r\n          \"version\": \"3.4.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz\",\r\n          \"integrity\": \"sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"picomatch\": \"^2.2.1\"\r\n          }\r\n        },\r\n        \"to-regex-range\": {\r\n          \"version\": \"5.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz\",\r\n          \"integrity\": \"sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==\",\r\n          \"optional\": true,\r\n          \"requires\": {\r\n            \"is-number\": \"^7.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"watchpack-chokidar2\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz\",\r\n      \"integrity\": \"sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==\",\r\n      \"optional\": true,\r\n      \"requires\": {\r\n        \"chokidar\": \"^2.1.8\"\r\n      }\r\n    },\r\n    \"webpack\": {\r\n      \"version\": \"4.41.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz\",\r\n      \"integrity\": \"sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==\",\r\n      \"requires\": {\r\n        \"@webassemblyjs/ast\": \"1.8.5\",\r\n        \"@webassemblyjs/helper-module-context\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-edit\": \"1.8.5\",\r\n        \"@webassemblyjs/wasm-parser\": \"1.8.5\",\r\n        \"acorn\": \"^6.2.1\",\r\n        \"ajv\": \"^6.10.2\",\r\n        \"ajv-keywords\": \"^3.4.1\",\r\n        \"chrome-trace-event\": \"^1.0.2\",\r\n        \"enhanced-resolve\": \"^4.1.0\",\r\n        \"eslint-scope\": \"^4.0.3\",\r\n        \"json-parse-better-errors\": \"^1.0.2\",\r\n        \"loader-runner\": \"^2.4.0\",\r\n        \"loader-utils\": \"^1.2.3\",\r\n        \"memory-fs\": \"^0.4.1\",\r\n        \"micromatch\": \"^3.1.10\",\r\n        \"mkdirp\": \"^0.5.1\",\r\n        \"neo-async\": \"^2.6.1\",\r\n        \"node-libs-browser\": \"^2.2.1\",\r\n        \"schema-utils\": \"^1.0.0\",\r\n        \"tapable\": \"^1.1.3\",\r\n        \"terser-webpack-plugin\": \"^1.4.3\",\r\n        \"watchpack\": \"^1.6.0\",\r\n        \"webpack-sources\": \"^1.4.1\"\r\n      }\r\n    },\r\n    \"webpack-cli\": {\r\n      \"version\": \"3.3.10\",\r\n      \"resolved\": \"https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz\",\r\n      \"integrity\": \"sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==\",\r\n      \"dev\": true,\r\n      \"requires\": {\r\n        \"chalk\": \"2.4.2\",\r\n        \"cross-spawn\": \"6.0.5\",\r\n        \"enhanced-resolve\": \"4.1.0\",\r\n        \"findup-sync\": \"3.0.0\",\r\n        \"global-modules\": \"2.0.0\",\r\n        \"import-local\": \"2.0.0\",\r\n        \"interpret\": \"1.2.0\",\r\n        \"loader-utils\": \"1.2.3\",\r\n        \"supports-color\": \"6.1.0\",\r\n        \"v8-compile-cache\": \"2.0.3\",\r\n        \"yargs\": \"13.2.4\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"4.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz\",\r\n          \"integrity\": \"sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==\",\r\n          \"dev\": true\r\n        },\r\n        \"ansi-styles\": {\r\n          \"version\": \"3.2.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\r\n          \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"color-convert\": \"^1.9.0\"\r\n          }\r\n        },\r\n        \"chalk\": {\r\n          \"version\": \"2.4.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\r\n          \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.1\",\r\n            \"escape-string-regexp\": \"^1.0.5\",\r\n            \"supports-color\": \"^5.3.0\"\r\n          },\r\n          \"dependencies\": {\r\n            \"supports-color\": {\r\n              \"version\": \"5.5.0\",\r\n              \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\r\n              \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\r\n              \"dev\": true,\r\n              \"requires\": {\r\n                \"has-flag\": \"^3.0.0\"\r\n              }\r\n            }\r\n          }\r\n        },\r\n        \"cliui\": {\r\n          \"version\": \"5.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz\",\r\n          \"integrity\": \"sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"string-width\": \"^3.1.0\",\r\n            \"strip-ansi\": \"^5.2.0\",\r\n            \"wrap-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"enhanced-resolve\": {\r\n          \"version\": \"4.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz\",\r\n          \"integrity\": \"sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"graceful-fs\": \"^4.1.2\",\r\n            \"memory-fs\": \"^0.4.0\",\r\n            \"tapable\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"get-caller-file\": {\r\n          \"version\": \"2.0.5\",\r\n          \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\r\n          \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\r\n          \"dev\": true\r\n        },\r\n        \"require-main-filename\": {\r\n          \"version\": \"2.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\r\n          \"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\",\r\n          \"dev\": true\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"3.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\r\n          \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"emoji-regex\": \"^7.0.1\",\r\n            \"is-fullwidth-code-point\": \"^2.0.0\",\r\n            \"strip-ansi\": \"^5.1.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"5.2.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\r\n          \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^4.1.0\"\r\n          }\r\n        },\r\n        \"supports-color\": {\r\n          \"version\": \"6.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz\",\r\n          \"integrity\": \"sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"has-flag\": \"^3.0.0\"\r\n          }\r\n        },\r\n        \"wrap-ansi\": {\r\n          \"version\": \"5.1.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz\",\r\n          \"integrity\": \"sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"ansi-styles\": \"^3.2.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"strip-ansi\": \"^5.0.0\"\r\n          }\r\n        },\r\n        \"yargs\": {\r\n          \"version\": \"13.2.4\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz\",\r\n          \"integrity\": \"sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"cliui\": \"^5.0.0\",\r\n            \"find-up\": \"^3.0.0\",\r\n            \"get-caller-file\": \"^2.0.1\",\r\n            \"os-locale\": \"^3.1.0\",\r\n            \"require-directory\": \"^2.1.1\",\r\n            \"require-main-filename\": \"^2.0.0\",\r\n            \"set-blocking\": \"^2.0.0\",\r\n            \"string-width\": \"^3.0.0\",\r\n            \"which-module\": \"^2.0.0\",\r\n            \"y18n\": \"^4.0.0\",\r\n            \"yargs-parser\": \"^13.1.0\"\r\n          }\r\n        },\r\n        \"yargs-parser\": {\r\n          \"version\": \"13.1.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz\",\r\n          \"integrity\": \"sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==\",\r\n          \"dev\": true,\r\n          \"requires\": {\r\n            \"camelcase\": \"^5.0.0\",\r\n            \"decamelize\": \"^1.2.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"webpack-sources\": {\r\n      \"version\": \"1.4.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz\",\r\n      \"integrity\": \"sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==\",\r\n      \"requires\": {\r\n        \"source-list-map\": \"^2.0.0\",\r\n        \"source-map\": \"~0.6.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"source-map\": {\r\n          \"version\": \"0.6.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\r\n          \"integrity\": \"sha1-dHIq8y6WFOnCh6jQu95IteLxomM=\"\r\n        }\r\n      }\r\n    },\r\n    \"whatwg-fetch\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==\"\r\n    },\r\n    \"which\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\r\n      \"requires\": {\r\n        \"isexe\": \"^2.0.0\"\r\n      }\r\n    },\r\n    \"which-module\": {\r\n      \"version\": \"2.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz\",\r\n      \"integrity\": \"sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=\"\r\n    },\r\n    \"wide-align\": {\r\n      \"version\": \"1.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz\",\r\n      \"integrity\": \"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==\",\r\n      \"requires\": {\r\n        \"string-width\": \"^1.0.2 || 2\"\r\n      }\r\n    },\r\n    \"worker-farm\": {\r\n      \"version\": \"1.7.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz\",\r\n      \"integrity\": \"sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==\",\r\n      \"requires\": {\r\n        \"errno\": \"~0.1.7\"\r\n      }\r\n    },\r\n    \"wrap-ansi\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz\",\r\n      \"integrity\": \"sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=\",\r\n      \"requires\": {\r\n        \"string-width\": \"^1.0.1\",\r\n        \"strip-ansi\": \"^3.0.1\"\r\n      },\r\n      \"dependencies\": {\r\n        \"ansi-regex\": {\r\n          \"version\": \"2.1.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\r\n          \"integrity\": \"sha1-w7M6te42DYbg5ijwRorn7yfWVN8=\"\r\n        },\r\n        \"is-fullwidth-code-point\": {\r\n          \"version\": \"1.0.0\",\r\n          \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz\",\r\n          \"integrity\": \"sha1-754xOG8DGn8NZDr4L95QxFfvAMs=\",\r\n          \"requires\": {\r\n            \"number-is-nan\": \"^1.0.0\"\r\n          }\r\n        },\r\n        \"string-width\": {\r\n          \"version\": \"1.0.2\",\r\n          \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz\",\r\n          \"integrity\": \"sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=\",\r\n          \"requires\": {\r\n            \"code-point-at\": \"^1.0.0\",\r\n            \"is-fullwidth-code-point\": \"^1.0.0\",\r\n            \"strip-ansi\": \"^3.0.0\"\r\n          }\r\n        },\r\n        \"strip-ansi\": {\r\n          \"version\": \"3.0.1\",\r\n          \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz\",\r\n          \"integrity\": \"sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=\",\r\n          \"requires\": {\r\n            \"ansi-regex\": \"^2.0.0\"\r\n          }\r\n        }\r\n      }\r\n    },\r\n    \"wrappy\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\r\n      \"integrity\": \"sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=\"\r\n    },\r\n    \"xtend\": {\r\n      \"version\": \"4.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz\",\r\n      \"integrity\": \"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==\"\r\n    },\r\n    \"y18n\": {\r\n      \"version\": \"4.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz\",\r\n      \"integrity\": \"sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==\"\r\n    },\r\n    \"yallist\": {\r\n      \"version\": \"3.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\r\n      \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\"\r\n    },\r\n    \"yargs\": {\r\n      \"version\": \"12.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz\",\r\n      \"integrity\": \"sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==\",\r\n      \"requires\": {\r\n        \"cliui\": \"^4.0.0\",\r\n        \"decamelize\": \"^1.2.0\",\r\n        \"find-up\": \"^3.0.0\",\r\n        \"get-caller-file\": \"^1.0.1\",\r\n        \"os-locale\": \"^3.0.0\",\r\n        \"require-directory\": \"^2.1.1\",\r\n        \"require-main-filename\": \"^1.0.1\",\r\n        \"set-blocking\": \"^2.0.0\",\r\n        \"string-width\": \"^2.0.0\",\r\n        \"which-module\": \"^2.0.0\",\r\n        \"y18n\": \"^3.2.1 || ^4.0.0\",\r\n        \"yargs-parser\": \"^11.1.1\"\r\n      }\r\n    },\r\n    \"yargs-parser\": {\r\n      \"version\": \"11.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz\",\r\n      \"integrity\": \"sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==\",\r\n      \"requires\": {\r\n        \"camelcase\": \"^5.0.0\",\r\n        \"decamelize\": \"^1.2.0\"\r\n      }\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ennui\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Neural nework visualizer.\",\n  \"main\": \"app.ts\",\n  \"dependencies\": {\n    \"@tensorflow/tfjs\": \"^1.5.1\",\n    \"@tensorflow/tfjs-vis\": \"^0.4.0\",\n    \"@types/d3\": \"^5.7.2\",\n    \"@types/file-saver\": \"^2.0.1\",\n    \"common-js\": \"^0.3.8\",\n    \"d3\": \"^5.15.0\",\n    \"file-loader\": \"^3.0.1\",\n    \"file-saver\": \"^2.0.2\",\n    \"tfjs-cifar10-web\": \"^1.1.1\",\n    \"uglifycss\": \"0.0.29\",\n    \"uglifyjs\": \"^2.4.11\",\n    \"url-loader\": \"^1.1.2\",\n    \"webpack\": \"^4.41.5\"\n  },\n  \"devDependencies\": {\n    \"dragselect\": \"^1.13.1\",\n    \"node-sass\": \"^4.14.1\",\n    \"prettier\": \"^1.19.1\",\n    \"tslint\": \"^5.20.1\",\n    \"tslint-config-prettier\": \"^1.18.0\",\n    \"typescript\": \"^3.7.4\",\n    \"webpack-cli\": \"^3.3.10\"\n  },\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"scss\": \"node-sass src/ui -o src/ui\",\n    \"scss-watch\": \"node-sass --watch src/ui -o src/ui\",\n    \"ts-watch\": \"tsc --skipLibCheck --watch\",\n    \"webpack-watch\": \"webpack --watch --mode development\",\n    \"build\": \"tsc --skipLibCheck && webpack --mode development && node-sass src/ui -o src/ui\",\n    \"watch\": \"tsc --skipLibCheck && webpack --mode development && node-sass src/ui -o src/ui && tsc --skipLibCheck --watch & webpack --watch --mode development & node-sass --watch src/ui -o src/ui\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.mit.edu/jmmichel/ClientENNUI.git\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "robots.txt",
    "content": "User-agent: *\nDisallow: \n"
  },
  {
    "path": "src/model/build_network.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\r\n\r\nimport { displayError } from \"../ui/error\";\r\nimport { Layer } from \"../ui/shapes/layer\";\r\nimport { Input } from \"../ui/shapes/layers/input\";\r\n\r\n/**\r\n * Wrap errors from networkDAG\r\n * @param input an input layer that is the root of the computational graph\r\n */\r\nexport function buildNetworkDAG(input: Input): tf.LayersModel {\r\n    const toposorted = topologicalSort(input);\r\n    return networkDAG(toposorted);\r\n}\r\n\r\n/**\r\n * Wrap model generation and produce a summary.\r\n * @param toposorted topologically sorted list of layers\r\n */\r\nfunction networkDAG(toposorted: Layer[]): tf.LayersModel {\r\n    const model = generateTfjsModel(toposorted);\r\n    // tslint:disable-next-line:no-console\r\n    console.log(model.summary());\r\n    return model;\r\n}\r\n\r\n/**\r\n * Clone a full computational graph\r\n * @param input an input layer that is the root of the computational graph\r\n * @param newInput the input that will be the root of the cloned graph\r\n */\r\nexport function cloneNetwork(input: Input, newInput: Input): void {\r\n    // Initialize queues, dags, and parents (visited)\r\n\r\n    const oldId2Clone: Map<number, Layer> = new Map<number, Layer>();\r\n    oldId2Clone.set(input.uid, newInput);\r\n\r\n    const queue: Layer[] = [input];\r\n    const visited: Set<Layer> = new Set();\r\n\r\n    let newLayer: Layer;\r\n    while (queue.length !== 0) {\r\n        const current = queue.shift();\r\n\r\n        // Clone layer\r\n        if (current !== input) {\r\n            if (!(current.uid in oldId2Clone)) {\r\n                newLayer = current.clone();\r\n                oldId2Clone.set(current.uid, newLayer);\r\n            } else {\r\n                newLayer = oldId2Clone.get(current.uid);\r\n            }\r\n\r\n            // Add in cloned parent/child relations\r\n            for (const p of current.parents) {\r\n                if (!(p.uid in oldId2Clone)) {\r\n                    oldId2Clone.set(p.uid, p.clone());\r\n                }\r\n                const newParent = oldId2Clone.get(p.uid);\r\n                newParent.addChild(newLayer);\r\n                newLayer.addParent(newParent);\r\n            }\r\n        } else {\r\n            newLayer = newInput;\r\n        }\r\n\r\n        // Continue BFS\r\n        for (const child of current.children) {\r\n\r\n            if (!visited.has(child)) {\r\n                queue.push(child);\r\n                visited.add(child);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Topologically sort a graph of layers that are rooted at the input.\r\n * @param input an input layer that is the root of the computational graph\r\n * @param showErrors decide whether or not to surface errors to the UI\r\n */\r\nexport function topologicalSort(input: Input, showErrors: boolean = true): Layer[] {\r\n    // Kahn's algorithm\r\n    const sorted: Layer[] = [];\r\n    const visited: Set<Layer> = new Set();\r\n    const frontier: Layer[] = [input];\r\n    // This is to detect if we have a branch that doesn't start from input\r\n    const potentialBranch: Set<number> = new Set();\r\n\r\n    while (frontier.length > 0) {\r\n        const layer = frontier.pop();\r\n        visited.add(layer);\r\n        sorted.push(layer);\r\n\r\n        if (potentialBranch.has(layer.uid)) {\r\n            potentialBranch.delete(layer.uid);\r\n        }\r\n\r\n        for (const child of layer.children) {\r\n\r\n            // Check not a cycle\r\n            const childIndex = sorted.indexOf(child);\r\n\r\n            if (childIndex >= 0 && childIndex < sorted.indexOf(layer)) {\r\n                displayError(new Error(\"Cannot have backwards edges\"));\r\n            }\r\n\r\n            // Check if we've already visited all parents\r\n            let canAdd = true;\r\n            for (const parent of child.parents) {\r\n\r\n                canAdd = visited.has(parent);\r\n                if (!canAdd) {\r\n                    potentialBranch.add(parent.uid);\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // All dependencies are added then add child\r\n            if (canAdd) {\r\n                frontier.push(child);\r\n            }\r\n        }\r\n    }\r\n\r\n    // Either there are layers with no parents (other than input), there is a cycle, or output is never reached\r\n    if (sorted[sorted.length - 1].layerType !== \"Output\" && showErrors) {\r\n\r\n        if (potentialBranch.size > 0) {\r\n            displayError(new Error(\"All layers must have input as an ancestor.\"));\r\n        } else {\r\n            displayError(new Error(\"Something is wrong with your network architecture.\"));\r\n        }\r\n    }\r\n\r\n    return sorted;\r\n}\r\n\r\n/**\r\n * Creates corresponding tfjs model.\r\n * @param sorted topologically sorted list of layers\r\n */\r\nexport function generateTfjsModel(sorted: Layer[]): tf.LayersModel {\r\n    sorted.forEach((layer) => layer.generateTfjsLayer());\r\n    const input = sorted[0].getTfjsLayer();\r\n    const output = sorted[sorted.length - 1].getTfjsLayer();\r\n    return tf.model({ inputs: input, outputs: output });\r\n}\r\n"
  },
  {
    "path": "src/model/code_generation.ts",
    "content": "import { displayError } from \"../ui/error\";\nimport { ActivationLayer } from \"../ui/shapes/activationlayer\";\nimport { Layer } from \"../ui/shapes/layer\";\nimport { juliaSkeleton } from \"./julia_skeleton\";\nimport { pythonSkeleton } from \"./python_skeleton\";\n/**\n * Creates corresponding Python code.\n * @param sorted topologically sorted list of layers\n */\nexport function generatePython(sorted: Layer[]): string {\n    let pythonScript: string = \"\";\n    for (const layer of sorted) {\n        const layerstring = layer.lineOfPython();\n        let applystring = \"\"; // Nothing to apply if no parents (input)\n        if (layer.parents.size === 1) {\n            applystring = `(x${layer.parents.values().next().value.uid})`;\n        } else if (layer.parents.size > 1) {\n            applystring = `([${[...layer.parents].map((p) => \"x\" + p.uid).join(\", \")}])`;\n        }\n        pythonScript += `x${layer.uid} = ` + layerstring + applystring + \"\\n\";\n        // TODO: Move this to BatchNorm and generalize layerstring to an array\n        if (layer.layerType === \"BatchNorm\" && (layer as ActivationLayer).activation != null) {\n            if (this.activation != null && this.activation.activationType !== \"relu\") {\n                displayError(new Error(\"Batch Normalization does not support activations other than ReLu\"));\n            }\n            pythonScript += `x${layer.uid} = ` + \"ReLU()\" + `(x${layer.uid})` + \"\\n\";\n        }\n    }\n    pythonScript += `model = Model(inputs=x${sorted[0].uid}, outputs=x${sorted[sorted.length - 1].uid})`;\n    return pythonSkeleton(pythonScript);\n}\n/**\n * Creates corresponding Julia code.\n * @param sorted topologically sorted list of layers\n */\nexport function generateJulia(sorted: Layer[]): string {\n    let juliaInitialization: string = \"\";\n    let juliaScript: string = \"\";\n    for (const layer of sorted) {\n        juliaInitialization += layer.initLineOfJulia();\n        juliaScript += layer.lineOfJulia();\n    }\n    return juliaSkeleton(juliaInitialization, juliaScript);\n}\n"
  },
  {
    "path": "src/model/data.ts",
    "content": "// Adapted from https://github.com/tensorflow/tfjs-examples/blob/master/mnist/data.js\r\n\r\nimport * as tf from \"@tensorflow/tfjs\";\r\nimport { Rank, Tensor } from \"@tensorflow/tfjs\";\r\nimport { Cifar10 } from \"tfjs-cifar10-web\";\r\n\r\nconst NUM_DATASET_ELEMENTS = 65000;\r\n\r\nexport const NUM_TRAIN_ELEMENTS = 55000;\r\n// const NUM_TEST_ELEMENTS = NUM_DATASET_ELEMENTS - NUM_TRAIN_ELEMENTS;\r\n\r\nconst MNIST_IMAGES_SPRITE_PATH =\r\n    \"https://storage.googleapis.com/learnjs-data/model-builder/mnist_images.png\";\r\nconst MNIST_LABELS_PATH =\r\n    \"https://storage.googleapis.com/learnjs-data/model-builder/mnist_labels_uint8\";\r\n\r\n/**\r\n * A class that serves as a schema for loading image data.\r\n */\r\nexport abstract class ImageData {\r\n    public readonly IMAGE_HEIGHT: number;\r\n    public readonly IMAGE_WIDTH: number;\r\n    public readonly IMAGE_CHANNELS: number;\r\n    public readonly IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS;\r\n    public readonly NUM_CLASSES: number;\r\n    public pythonName: string;\r\n\r\n    public dataLoaded: boolean = false;\r\n\r\n    public readonly classStrings: string[] = null;\r\n\r\n    protected trainImages: Tensor<Rank.R4>;\r\n    protected testImages: Tensor<Rank>;\r\n    protected trainLabels: Tensor<Rank>;\r\n    protected testLabels: Tensor<Rank>;\r\n    protected datasetName: string;\r\n\r\n    public abstract async load(): Promise<void>;\r\n\r\n    /**\r\n     * Get all training data as a data tensor and a labels tensor.\r\n     *\r\n     * @returns\r\n     *   xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`.\r\n     *   labels: The one-hot encoded labels tensor, of shape `[numTrainExamples, NUM_CLASSES]`.\r\n     */\r\n    public getTrainData(numExamples: number = 15000): {xs: Tensor<tf.Rank.R4>, labels: Tensor<tf.Rank.R2>} {\r\n        let xs = tf.reshape<tf.Rank.R4>(this.trainImages, [this.trainImages.size / this.IMAGE_SIZE,\r\n                                                           this.IMAGE_HEIGHT,\r\n                                                           this.IMAGE_WIDTH,\r\n                                                           this.IMAGE_CHANNELS]);\r\n        let labels = tf.reshape<tf.Rank.R2>(this.trainLabels,\r\n                                            [this.trainLabels.size / this.NUM_CLASSES, this.NUM_CLASSES]);\r\n        if (numExamples != null) {\r\n            xs = xs.slice([0, 0, 0, 0], [numExamples, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]);\r\n            labels = labels.slice([0, 0], [numExamples, this.NUM_CLASSES]);\r\n        }\r\n        return {xs, labels};\r\n    }\r\n\r\n    /**\r\n     * Get all test data as a data tensor a a labels tensor.\r\n     *\r\n     * @param {number} numExamples Optional number of examples to get. If not provided,\r\n     *   all test examples will be returned.\r\n     * @returns\r\n     *   xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`.\r\n     *   labels: The one-hot encoded labels tensor, of shape `[numTestExamples, NUM_CLASSES]`.\r\n     */\r\n    public getTestData(numExamples: number = 1500): {xs: Tensor<tf.Rank.R4>, labels: Tensor<tf.Rank.R2>} {\r\n        let xs = tf.reshape<tf.Rank.R4>(this.testImages, [this.testImages.size / this.IMAGE_SIZE,\r\n                                                          this.IMAGE_HEIGHT,\r\n                                                          this.IMAGE_WIDTH,\r\n                                                          this.IMAGE_CHANNELS]);\r\n        let labels = tf.reshape<tf.Rank.R2>(this.testLabels,\r\n                                            [this.testLabels.size / this.NUM_CLASSES, this.NUM_CLASSES]);\r\n\r\n        if (numExamples != null) {\r\n            xs = xs.slice([0, 0, 0, 0], [numExamples, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]);\r\n            labels = labels.slice([0, 0], [numExamples, this.NUM_CLASSES]);\r\n        }\r\n        return {xs, labels};\r\n    }\r\n\r\n    /**\r\n     * Returns test examples with the desired label.\r\n     *\r\n     * @param {number} numExamples number of examples to get.\r\n     * @returns xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`.\r\n     *          labels: The one-hot encoded labels tensor, of shape `[numTestExamples, NUM_CLASSES]`.\r\n     */\r\n    public async getTestDataWithLabel(numExamples: number,\r\n                                      label: string): Promise<{xs: Tensor<tf.Rank.R4>, labels: Tensor<tf.Rank.R2>}> {\r\n        if (label === \"all\") {\r\n            return this.getTestData(numExamples);\r\n        }\r\n\r\n        let {xs, labels} = this.getTestData();\r\n\r\n        // select only the numbers with the given label\r\n        const classLabels = labels.argMax(1).arraySync() as number[];\r\n        const mask = tf.equal(classLabels, parseInt(label, 10));\r\n        xs = await tf.booleanMaskAsync(xs, mask) as Tensor<tf.Rank.R4>;\r\n        labels = await tf.booleanMaskAsync(labels, mask) as Tensor<tf.Rank.R2>;\r\n        xs = xs.slice([0, 0, 0, 0], [numExamples, xs.shape[1], xs.shape[2], xs.shape[3]]) as Tensor<tf.Rank.R4>;\r\n        labels = labels.slice([0, 0], [numExamples, labels.shape[1]]) as Tensor<tf.Rank.R2>;\r\n        return {xs, labels};\r\n    }\r\n\r\n    protected toggleLoadingOverlay(): void {\r\n        if (document.getElementById(\"loadingDataTab\").style.display === \"none\") {\r\n            document.getElementById(\"datasetLoadingName\").innerText = this.datasetName;\r\n            document.getElementById(\"loadingDataTab\").style.display = \"block\";\r\n        } else {\r\n            document.getElementById(\"loadingDataTab\").style.display = \"none\";\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * A class that fetches the sprited CIFAR dataset and provide data as\r\n * Tensors.\r\n */\r\nexport class Cifar10Data extends ImageData {\r\n\r\n    public static get Instance(): ImageData {\r\n        return this.instance || (this.instance = new this());\r\n    }\r\n\r\n    private static instance: Cifar10Data;\r\n    public IMAGE_HEIGHT: number = 32;\r\n    public IMAGE_WIDTH: number = 32;\r\n    public IMAGE_CHANNELS: number = 3;\r\n    public IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS;\r\n    public NUM_CLASSES: number = 10;\r\n\r\n    public datasetName: string = \"CIFAR-10\";\r\n    public pythonName: string = \"cifar10\";\r\n\r\n    public readonly classStrings: string[] =\r\n        [\"Airplane\", \"Automobile\", \"Bird\", \"Cat\", \"Deer\", \"Dog\", \"Frog\", \"Horse\", \"Ship\", \"Truck\"];\r\n\r\n    public async load(): Promise<void> {\r\n        if (this.dataLoaded) {\r\n            return;\r\n        }\r\n\r\n        this.toggleLoadingOverlay();\r\n\r\n        const data = new Cifar10();\r\n        await data.load();\r\n\r\n        const {xs: trainX, ys: trainY} = data.nextTrainBatch(15000);\r\n        const {xs: testX, ys: testY} = data.nextTestBatch(1500);\r\n        this.trainImages = trainX as unknown as Tensor<Rank.R4>;\r\n        this.trainLabels = trainY as unknown as Tensor<Rank.R4>;\r\n        this.testImages = testX as unknown as Tensor<Rank.R2>;\r\n        this.testLabels = testY as unknown as Tensor<Rank.R2>;\r\n\r\n        this.dataLoaded = true;\r\n\r\n        document.getElementById(\"loadingDataTab\").style.display = \"none\";\r\n    }\r\n\r\n}\r\n\r\n/**\r\n * A class that fetches the sprited MNIST dataset and provide data as\r\n * Tensors.\r\n */\r\nexport class MnistData extends ImageData {\r\n\r\n    public static get Instance(): ImageData {\r\n        return this.instance || (this.instance = new this());\r\n    }\r\n\r\n    private static instance: MnistData;\r\n    public IMAGE_HEIGHT: number = 28;\r\n    public IMAGE_WIDTH: number = 28;\r\n    public IMAGE_CHANNELS: number = 1;\r\n    public IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS;\r\n    public NUM_CLASSES: number = 10;\r\n\r\n    public datasetName: string = \"MNIST\";\r\n    public pythonName: string = \"mnist\";\r\n\r\n    public async load(): Promise<void> {\r\n        // Make a request for the MNIST sprited image.\r\n        if (this.dataLoaded) {\r\n            return;\r\n        }\r\n\r\n        this.toggleLoadingOverlay();\r\n\r\n        const img = new Image();\r\n        const canvas = document.createElement(\"canvas\");\r\n        const ctx = canvas.getContext(\"2d\");\r\n        const imgRequest = new Promise<Float32Array>((resolve, _) => {\r\n            img.crossOrigin = \"\";\r\n            img.onload = () => {\r\n                img.width = img.naturalWidth;\r\n                img.height = img.naturalHeight;\r\n\r\n                const datasetBytesBuffer = new ArrayBuffer(NUM_DATASET_ELEMENTS * this.IMAGE_SIZE * 4);\r\n\r\n                const chunkSize = 5000;\r\n                canvas.width = img.width;\r\n                canvas.height = chunkSize;\r\n\r\n                for (let i = 0; i < NUM_DATASET_ELEMENTS / chunkSize; i++) {\r\n                    const datasetBytesView = new Float32Array(\r\n                        datasetBytesBuffer, i * this.IMAGE_SIZE * chunkSize * 4,\r\n                        this.IMAGE_SIZE * chunkSize);\r\n                    ctx.drawImage(\r\n                        img, 0, i * chunkSize, img.width, chunkSize, 0, 0, img.width,\r\n                        chunkSize);\r\n\r\n                    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n                    for (let j = 0; j < imageData.data.length / 4; j++) {\r\n                        // All channels hold an equal value since the image is grayscale, so\r\n                        // just read the red channel.\r\n                        datasetBytesView[j] = imageData.data[j * 4] / 255;\r\n                    }\r\n                }\r\n                const dataImages = new Float32Array(datasetBytesBuffer);\r\n\r\n                resolve(dataImages);\r\n            };\r\n            img.src = MNIST_IMAGES_SPRITE_PATH;\r\n        });\r\n\r\n        const labelsRequest = fetch(MNIST_LABELS_PATH);\r\n        const [datasetImages, labelsResponse] = await Promise.all([imgRequest, labelsRequest]);\r\n\r\n        const datasetLabels = new Uint8Array(await labelsResponse.arrayBuffer());\r\n\r\n        // Slice the the images and labels into train and test sets.\r\n        const trainImages = datasetImages.slice(0, this.IMAGE_SIZE * NUM_TRAIN_ELEMENTS);\r\n        this.trainImages = tf.tensor4d(trainImages, [trainImages.length / this.IMAGE_SIZE,\r\n                                                     this.IMAGE_HEIGHT, this.IMAGE_WIDTH,\r\n                                                     this.IMAGE_CHANNELS]);\r\n        const testImages = datasetImages.slice(this.IMAGE_SIZE * NUM_TRAIN_ELEMENTS);\r\n        this.testImages = tf.tensor4d(testImages, [testImages.length / this.IMAGE_SIZE,\r\n                                                   this.IMAGE_HEIGHT, this.IMAGE_WIDTH,\r\n                                                   this.IMAGE_CHANNELS]);\r\n        const trainLabels = datasetLabels.slice(0, this.NUM_CLASSES * NUM_TRAIN_ELEMENTS);\r\n        this.trainLabels = tf.tensor2d(trainLabels, [trainImages.length / this.IMAGE_SIZE, this.NUM_CLASSES]);\r\n        const testLabels =\r\n            datasetLabels.slice(this.NUM_CLASSES * NUM_TRAIN_ELEMENTS);\r\n        this.testLabels = tf.tensor2d(testLabels, [testImages.length / this.IMAGE_SIZE, this.NUM_CLASSES]);\r\n\r\n        this.dataLoaded = true;\r\n\r\n        document.getElementById(\"loadingDataTab\").style.display = \"none\";\r\n    }\r\n\r\n}\r\n\r\nexport let dataset: ImageData = MnistData.Instance;\r\n\r\nexport function changeDataset(newDataset: string): void {\r\n    switch (newDataset) {\r\n        case \"mnist\": dataset = MnistData.Instance; break;\r\n        case \"cifar\": dataset = Cifar10Data.Instance; break;\r\n    }\r\n\r\n    // Set the image visualizations divs with class name identifiers\r\n    Array.from(document.getElementById(\"classes\").getElementsByClassName(\"option\")).forEach((element, i) => {\r\n        if (i !== 0) { // Skip the first since it represents 'Any' class\r\n            element.innerHTML = (i - 1) + ( dataset.classStrings != null ? ` (${dataset.classStrings[i]})` : \"\");\r\n        }\r\n    });\r\n}\r\n"
  },
  {
    "path": "src/model/export_model.ts",
    "content": "import { saveAs } from \"file-saver\";\r\nimport { IDraggableData } from \"../ui/app\";\r\nimport { displayError } from \"../ui/error\";\r\nimport { Activation, Relu, Sigmoid, Tanh } from \"../ui/shapes/activation\";\r\nimport { ActivationLayer } from \"../ui/shapes/activationlayer\";\r\nimport { ILayerJson, Layer } from \"../ui/shapes/layer\";\r\nimport { Add } from \"../ui/shapes/layers/add\";\r\nimport { BatchNorm } from \"../ui/shapes/layers/batchnorm\";\r\nimport { Concatenate } from \"../ui/shapes/layers/concatenate\";\r\nimport { Conv2D } from \"../ui/shapes/layers/convolutional\";\r\nimport { Dense } from \"../ui/shapes/layers/dense\";\r\nimport { Dropout } from \"../ui/shapes/layers/dropout\";\r\nimport { Flatten } from \"../ui/shapes/layers/flatten\";\r\nimport { Input } from \"../ui/shapes/layers/input\";\r\nimport { MaxPooling2D } from \"../ui/shapes/layers/maxpooling\";\r\nimport { Output } from \"../ui/shapes/layers/output\";\r\nimport { Point } from \"../ui/shapes/shape\";\r\nimport { IHyperparameterData } from \"./params_object\";\r\n\r\n/**\r\n * Schema for serialized networks.\r\n */\r\nexport interface ISerializedNetwork {\r\n    graph: ILayerJson[];\r\n    hyperparameters: IHyperparameterData;\r\n}\r\n\r\n/**\r\n * Check that there is a path from the input to the output.\r\n * @param svgData the input nn architecture\r\n */\r\nexport function hasPathToOutput(svgData: IDraggableData): boolean {\r\n    const queue: Layer[] = [svgData.input];\r\n    const visited: Set<Layer> = new Set();\r\n    const layersFromInput: Set<Layer> = new Set();\r\n    while (queue.length !== 0) {\r\n        const current = queue.shift();\r\n        layersFromInput.add(current);\r\n        // check each connections of the node\r\n        for (const child of current.children) {\r\n            if (!visited.has(child)) {\r\n                queue.push(child);\r\n                visited.add(child);\r\n            }\r\n        }\r\n    }\r\n\r\n    return layersFromInput.has(svgData.output);\r\n}\r\n\r\n/**\r\n * Convert the nn to a json blob for storage.\r\n * @param svgData the input nn architecture\r\n */\r\nexport function graphToJson(svgData: IDraggableData): ISerializedNetwork {\r\n    // Initialize queues, dags, and parents (visited)\r\n    const queue: Layer[] = [svgData.input];\r\n    const visited: Set<Layer> = new Set();\r\n    const layersjson: ILayerJson[] = new Array();\r\n    while (queue.length !== 0) {\r\n        const current = queue.shift();\r\n        layersjson.push(current.toJson());\r\n        // check each connections of the node\r\n        for (const child of current.children) {\r\n            if (!visited.has(child)) {\r\n                queue.push(child);\r\n                visited.add(child);\r\n            }\r\n        }\r\n    }\r\n\r\n    const serializedNet: ISerializedNetwork = {\r\n        graph: layersjson,\r\n        hyperparameters: setHyperparameterData(),\r\n    };\r\n\r\n    return serializedNet;\r\n}\r\n\r\n/**\r\n * Takes the hyperparemeters from the html and assigns them to the global model.\r\n */\r\nfunction setHyperparameterData(): IHyperparameterData {\r\n    let learningRate: number;\r\n    let batchSize: number;\r\n    let optimizerId: string;\r\n    let epochs: number;\r\n    let lossId: string;\r\n    const hyperparams = document.getElementsByClassName(\"hyperparamvalue\");\r\n    for (const hyperparam of hyperparams) {\r\n        const value = ( document.getElementById(hyperparam.id) as HTMLInputElement).value;\r\n        switch (hyperparam.id) {\r\n            case \"learningRate\":\r\n                learningRate = Number(value);\r\n                break;\r\n\r\n            case \"epochs\":\r\n                epochs = parseInt(value, 10);\r\n                break;\r\n\r\n            case \"batchSize\":\r\n                batchSize = parseInt(value, 10);\r\n                break;\r\n        }\r\n    }\r\n    for (const elmt of document.getElementsByClassName(\"selected\")) {\r\n        if (elmt.hasAttribute(\"data-trainType\")) {\r\n            optimizerId = elmt.id;\r\n        } else if (elmt.hasAttribute(\"data-lossType\")) {\r\n            lossId = elmt.id;\r\n        }\r\n    }\r\n\r\n    return {batchSize, epochs, learningRate, lossId, optimizerId};\r\n}\r\n\r\n/**\r\n * Deserialize a `serializedNet` into svgData.\r\n * @param svgData an empty structure for `Layer` instances\r\n * @param serializedNet a blob of all of the json\r\n */\r\nexport function stateFromJson(svgData: IDraggableData, serializedNet: ISerializedNetwork): IDraggableData {\r\n    const hyperparams: IHyperparameterData = serializedNet.hyperparameters;\r\n    setHyperparams(hyperparams);\r\n\r\n    const layersJson: ILayerJson[] = serializedNet.graph;\r\n    return graphFromJson(svgData, layersJson);\r\n}\r\n\r\n/**\r\n * Set hyperparameters from serialized data.\r\n * @param hyperparamData a container for all of the hyperparameter data\r\n */\r\nfunction setHyperparams(hyperparamData: IHyperparameterData): void {\r\n    const hyperparams = document.getElementsByClassName(\"hyperparamvalue\");\r\n    for (const hyperparam of hyperparams) {\r\n        const paramName = document.getElementById(hyperparam.id as string) as HTMLInputElement;\r\n        paramName.value = (hyperparamData as any)[hyperparam.id].toString();\r\n    }\r\n    document.getElementById(\"defaultOptimizer\").classList.remove(\"selected\");\r\n    document.getElementById(hyperparamData.optimizerId).classList.add(\"selected\");\r\n    document.getElementById(\"defaultLoss\").classList.remove(\"selected\");\r\n    document.getElementById(hyperparamData.lossId).classList.add(\"selected\");\r\n}\r\n\r\n/**\r\n * Populate `svgData` from a serialize nn architecture in `layersJson`.\r\n * @param svgData empty empty structure blob to be filled\r\n * @param layersJson a json blob of all of the nn architecture\r\n */\r\nfunction graphFromJson(svgData: IDraggableData, layersJson: ILayerJson[]): IDraggableData {\r\n\r\n    // Make each of the objects without parents and children\r\n    const uidToObject: Map<number, Layer> = new Map();\r\n    for (const l of layersJson) {\r\n        const layer = createLayerInstanceFromName(svgData, l);\r\n        uidToObject.set(l.id, layer);\r\n    }\r\n\r\n    // Add in all of the parents, children, and activations\r\n    for (const l of layersJson) {\r\n        const layer: Layer = uidToObject.get(l.id);\r\n        for (const childId of l.children_ids) {\r\n            layer.addChild(uidToObject.get(childId));\r\n        }\r\n        for (const parentId of l.parent_ids) {\r\n            layer.addParent(uidToObject.get(parentId));\r\n        }\r\n        layer.setParams(l.params);\r\n        if (l.params.activation != null) {\r\n            createActivationInstanceFromName(svgData,  layer as ActivationLayer, l.params.activation);\r\n        }\r\n    }\r\n\r\n    return svgData;\r\n}\r\n\r\n/**\r\n * Make an `Activation` instance from it's name, adding it to svgData, and attaching it to the given layer.\r\n * @param svgData the input nn architecture\r\n * @param layer layer to attach the activation to\r\n * @param activation_name the name of an `Activation` to be created\r\n */\r\nfunction createActivationInstanceFromName(svgData: IDraggableData,\r\n                                          layer: ActivationLayer,\r\n                                          activationName: string): Activation {\r\n    let activation: Activation;\r\n    switch (activationName) {\r\n        case \"relu\":\r\n            activation = new Relu();\r\n            break;\r\n        case \"sigmoid\":\r\n            activation = new Sigmoid();\r\n            break;\r\n        case \"tanh\":\r\n            activation = new Tanh();\r\n            break;\r\n        default:\r\n            displayError(new Error(`The specified activation \"${activationName}\" was not recognized. `));\r\n    }\r\n    layer.addActivation(activation);\r\n    svgData.draggable.push(activation);\r\n    return activation;\r\n}\r\n\r\n/**\r\n * Make a `Layer` instance from it's name and add it to svgData.\r\n * @param svgData the input nn architecture\r\n * @param lj a json blob of all of the layers\r\n */\r\nfunction createLayerInstanceFromName(svgData: IDraggableData, lj: ILayerJson): Layer {\r\n\r\n    // Create an instance from the instance name.\r\n    let layer: Layer;\r\n    const location = new Point(lj.xPosition, lj.yPosition);\r\n    switch (lj.layer_name) {\r\n        case \"Input\":\r\n            layer = new Input();\r\n            layer.setPosition(location);\r\n            svgData.input = layer as Input;\r\n            break;\r\n        case \"Output\":\r\n            layer = new Output();\r\n            layer.setPosition(location);\r\n            svgData.output = layer as Output;\r\n            break;\r\n        default:\r\n            switch (lj.layer_name) {\r\n                case \"MaxPooling2D\":\r\n                    layer = new MaxPooling2D(location); break;\r\n                case \"Dense\":\r\n                    layer = new Dense(location); break;\r\n                case \"Conv2D\":\r\n                    layer = new Conv2D(location); break;\r\n                case \"Concatenate\":\r\n                    layer = new Concatenate(location); break;\r\n                case \"Flatten\":\r\n                    layer = new Flatten(location); break;\r\n                case \"BatchNorm\":\r\n                    layer = new BatchNorm(location); break;\r\n                case \"Dropout\":\r\n                    layer = new Dropout(location); break;\r\n                case \"Add\":\r\n                    layer = new Add(location); break;\r\n                default:\r\n                     displayError(new Error(`The specified layer \"${lj}\" was not recognized. `));\r\n            }\r\n            svgData.draggable.push(layer);\r\n            break;\r\n    }\r\n\r\n    return layer;\r\n}\r\n\r\n/**\r\n * Download a file given the content and name.\r\n * @param content content to add to the file\r\n * @param filename name of the file to be created\r\n */\r\nexport function download(content: string, filename: string): void {\r\n    const blob = new Blob([content], {\r\n     type: \"text/plain;charset=utf-8\",\r\n    });\r\n    saveAs(blob, filename);\r\n}\r\n"
  },
  {
    "path": "src/model/graphs.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport * as tfvis from \"@tensorflow/tfjs-vis\";\nimport { tabSelected } from \"../ui/app\";\nimport { dataset } from \"./data\";\nimport { model } from \"./params_object\";\n\nconst GRAPH_FONT_SIZE: number = 14;\nconst NUM_CLASSES: number = 10;\n\nconst testExamples: number = 50;\n\n/**\n * Show predictions on a number of test examples.\n */\nexport async function showPredictions(): Promise<void> {\n  if (tabSelected() === \"visualizationTab\" && dataset.dataLoaded) {\n    let label: string = null;\n    const options = document.getElementById(\"classes\").getElementsByClassName(\"option\");\n    for (const option of options) {\n        if (option.classList.contains(\"selected\")) {\n            label = option.getAttribute(\"data-optionValue\");\n            break;\n        }\n    }\n\n    dataset.getTestDataWithLabel(testExamples, label).then(({xs, labels}) => {\n      // Code wrapped in a tf.tidy() function callback will have their tensors freed\n      // from GPU memory after execution without having to call dispose().\n      // The tf.tidy callback runs synchronously.\n      tf.tidy(() => {\n        const output = model.architecture.predict(xs) as tf.Tensor<tf.Rank.R1>;\n\n        // tf.argMax() returns the indices of the maximum values in the tensor along\n        // a specific axis. Categorical classification tasks like this one often\n        // represent classes as one-hot vectors. One-hot vectors are 1D vectors with\n        // one element for each output class. All values in the vector are 0\n        // except for one, which has a value of 1 (e.g. [0, 0, 0, 1, 0]). The\n        // output from model.predict() will be a probability distribution, so we use\n        // argMax to get the index of the vector element that has the highest\n        // probability. This is our prediction.\n        // (e.g. argmax([0.07, 0.1, 0.03, 0.75, 0.05]) == 3)\n        // dataSync() synchronously downloads the tf.tensor values from the GPU so\n        // that we can use them in our normal CPU JavaScript code\n        // (for a non-blocking version of this function, use data()).\n        const axis = 1;\n        const newLabels = Array.from(labels.argMax(axis).dataSync());\n        const predictions = Array.from(output.argMax(axis).dataSync());\n\n        showTestResults({xs, labels}, predictions, newLabels);\n      });\n    });\n  }\n}\n\n// TOOD: Remove this peice of problematic global state.\nlet confusionValues: any = [];\nfor (let i = 0; i < NUM_CLASSES; i++) {\n  const arr = new Array(NUM_CLASSES);\n  arr.fill(0, 0, NUM_CLASSES);\n  confusionValues.push(arr);\n}\n\nexport function showConfusionMatrix(): void {\n  if (tabSelected() === \"progressTab\" && dataset.dataLoaded) {\n    const {xs, labels} = dataset.getTestData(1000);\n    tf.tidy(() => {\n      const output = model.architecture.predict(xs) as tf.Tensor<tf.Rank.R1>;\n\n      const fixedLabels = labels.argMax(1) as tf.Tensor<tf.Rank.R1>;\n      const predictions = output.argMax(1) as tf.Tensor<tf.Rank.R1>;\n\n      tfvis.metrics.confusionMatrix(fixedLabels, predictions, NUM_CLASSES).then((confusionVals) => {\n        confusionValues = confusionVals;\n        renderConfusionMatrix();\n      });\n\n    });\n  }\n\n}\n\nexport function setupTestResults(): void {\n  const imagesElement = document.getElementById(\"images\");\n  imagesElement.innerHTML = \"\";\n  for (let i = 0; i < testExamples; i++) {\n    const div = document.createElement(\"div\");\n    div.className = \"pred-container\";\n\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = dataset.IMAGE_WIDTH;\n    canvas.height = dataset.IMAGE_HEIGHT;\n    canvas.className = \"prediction-canvas\";\n    const ctx = canvas.getContext(\"2d\");\n    ctx.rect(0, 0, 1000, 5000);\n    ctx.fillStyle = \"#888\";\n    ctx.fill();\n\n    const pred = document.createElement(\"div\");\n    pred.className = `pred pred-none`;\n    pred.innerText = `pred: -`;\n\n    div.appendChild(pred);\n    div.appendChild(canvas);\n\n    imagesElement.appendChild(div);\n  }\n}\n\nexport function showTestResults(batch: {xs: tf.Tensor<tf.Rank.R4>, labels: tf.Tensor<tf.Rank.R2>},\n                                predictions: number[],\n                                labels: number[]): void {\n  const imagesElement = document.getElementById(\"images\");\n  imagesElement.innerHTML = \"\";\n  for (let i = 0; i < testExamples; i++) {\n    const image = batch.xs.slice([i, 0], [1, batch.xs.shape[1]]);\n\n    const div = document.createElement(\"div\");\n    div.className = \"pred-container\";\n\n    const canvas = document.createElement(\"canvas\");\n    canvas.className = \"prediction-canvas\";\n    draw(image.flatten(), canvas);\n\n    const pred = document.createElement(\"div\");\n\n    const prediction = predictions[i];\n    const label = labels[i];\n    const correct = prediction === label;\n\n    pred.className = `pred ${(correct ? \"pred-correct\" : \"pred-incorrect\")}`;\n    pred.innerText = `pred: ${prediction}`;\n\n    div.appendChild(pred);\n    div.appendChild(canvas);\n\n    imagesElement.appendChild(div);\n  }\n}\n\n// TOOD: Remove this piece of problematic global state.\nlet lossValues: Array<Array<{x: number, y: number}>> = [[], []];\nexport function plotLoss(batchNum: number, loss: number, set: string): void {\n  const series = set === \"train\" ? 0 : 1;\n  // Set the first validation loss as the first training loss\n  if (series === 0 && lossValues[1].length === 0) {\n    lossValues[1].push({x: batchNum, y: loss});\n  }\n  lossValues[series].push({x: batchNum, y: loss});\n  if (tabSelected() === \"progressTab\") {\n    renderLossPlot();\n  }\n}\n\nexport function renderLossPlot(): void {\n  const lossContainer = document.getElementById(\"loss-canvas\");\n  tfvis.render.linechart(\n      {values: lossValues, series: [\"train\", \"validation\"]}, lossContainer, {\n        xLabel: \"Batch #\",\n        yLabel: \"Loss\",  // tslint:disable-next-line: object-literal-sort-keys\n        width: canvasWidth() / 2,\n        height: canvasHeight() / 2,\n        fontSize: GRAPH_FONT_SIZE,\n      });\n}\n\nexport function resetPlotValues(): void {\n  // set initial accuracy values to 0,0 for validation\n  accuracyValues = [[], [{x: 0, y: 0}]];\n  lossValues = [[], []];\n}\n\nlet accuracyValues = [[], [{x: 0, y: 0}]];\nexport function plotAccuracy(epochs: number, accuracy: number, set: string): void {\n  const series = set === \"train\" ? 0 : 1;\n  accuracyValues[series].push({x: epochs, y: accuracy});\n  if (tabSelected() === \"progressTab\") {\n    renderAccuracyPlot();\n  }\n}\n\nexport function renderAccuracyPlot(): void {\n  const accuracyContainer = document.getElementById(\"accuracy-canvas\");\n  tfvis.render.linechart(\n      {values: accuracyValues, series: [\"train\", \"validation\"]},\n      accuracyContainer, {\n        xLabel: \"Batch #\",\n        yLabel: \"Accuracy\",  // tslint:disable-next-line: object-literal-sort-keys\n        width: canvasWidth() / 2,\n        height: canvasHeight() / 2,\n        yAxisDomain: [0, 1],\n        fontSize: GRAPH_FONT_SIZE,\n      });\n}\n\nfunction renderConfusionMatrix(): void {\n  const confusionMatrixElement = document.getElementById(\"confusion-matrix-canvas\");\n  tfvis.render.confusionMatrix({\n    labels: [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"],\n    values: confusionValues ,\n  }, confusionMatrixElement, {\n    fontSize: GRAPH_FONT_SIZE,\n    shadeDiagonal: false,\n  });\n}\n\nfunction canvasWidth(): number {\n  const columnGap = parseInt(getComputedStyle(document.getElementById(\"progressTab\")).gridColumnGap, 10);\n  return document.getElementById(\"middle\").clientWidth - columnGap;\n}\n\nfunction canvasHeight(): number {\n  const verticalPadding = parseInt(getComputedStyle(document.getElementById(\"progressTab\")).padding, 10);\n  const height = document.getElementById(\"middle\").clientHeight - 2 * verticalPadding;\n  return height;\n}\n\nexport function setupPlots(): void {\n  renderLossPlot();\n  renderAccuracyPlot();\n  renderConfusionMatrix();\n}\n\nexport function draw(image: tf.Tensor, canvas: HTMLCanvasElement): void {\n  const [width, height] = [dataset.IMAGE_HEIGHT, dataset.IMAGE_WIDTH];\n  canvas.width = width;\n  canvas.height = height;\n  const ctx = canvas.getContext(\"2d\");\n  const imageData = new ImageData(width, height);\n  const data = image.dataSync();\n  for (let i = 0; i < height * width; ++i) {\n    const j = i * 4;\n    if (dataset.IMAGE_CHANNELS === 3) {\n      const k = i * 3;\n      imageData.data[j + 0] = data[k + 0] * 255;\n      imageData.data[j + 1] = data[k + 1] * 255;\n      imageData.data[j + 2] = data[k + 2] * 255;\n      imageData.data[j + 3] = 255;\n    } else {\n      imageData.data[j + 0] = data[i] * 255;\n      imageData.data[j + 1] = data[i] * 255;\n      imageData.data[j + 2] = data[i] * 255;\n      imageData.data[j + 3] = 255;\n    }\n  }\n  ctx.putImageData(imageData, 0, 0);\n}\n"
  },
  {
    "path": "src/model/julia_skeleton.ts",
    "content": "import { setModelHyperparameters } from \"../ui/app\";\nimport { model } from \"./params_object\";\n\nexport function juliaSkeleton(initializationCode: string, modelCode: string): string {\n    setModelHyperparameters();\n    return `using Flux, Statistics\nusing Flux: onehotbatch, onecold, crossentropy, mse, throttle, @treelike\nusing MLDatasets: MNIST, CIFAR10\nusing Base.Iterators: repeated, partition\nusing LightGraphs\n\ntrainX, trainY = MNIST.traindata()\n\nunsqueeze3(x) = reshape(x, (size(x, 1), size(x, 2), 1, size(x, 3)))\n\ntrainX, trainY = unsqueeze3(trainX), onehotbatch(trainY, 0:9)\n\nbatch_size = ${model.params.batchSize}\n\n# Partition into batches\ntrain = [(trainX[:,:,:,i], trainY[:,i]) for i in partition(1:50000, batch_size)]\n\ntrain = gpu.(train)\n\n# Prepare test set (first 10,000 images)\ntX, tY = MNIST.testdata()\ntX = unsqueeze3(tX) |> gpu\ntY = onehotbatch(tY, 0:9) |> gpu\n\nstruct Network\n    inits::Vector\n    nodes::Dict{Int, Any}\n    graph::DiGraph\n    shapes::Dict{Int, Any}\n    data::Dict{Int, Any}\nend\n\nFlux.children(net::Network) = values(net.nodes)\nFlux.mapchildren(f, net::Network) = map(f, values(net.nodes))\n\ninsert!(net, node) = (push!(net.inits, node); add_vertex!(net.graph); length(net.inits))\nconnect!(net, n1, n2) = add_edge!(net.graph, n1, n2)\n\nnet = Network(Vector(), Dict(), SimpleDiGraph(), Dict(), Dict())\n\n############################# Architecture made by Ennui\n# Initialize the network\n${initializationCode}\n\n# Build the graph\n${modelCode}\n#############################\n\n# Initialize the network with the appropriate shapes\n# This is achived by doing a forward pass with a single batch\nfunction init(net, data)\n    worklist = topological_sort_by_dfs(net.graph)\n    root = first(worklist)\n    for work in worklist\n        if work == root\n            inputs = data\n            node = net.inits[work](size(inputs))\n            net.data[work] = node(inputs)\n            net.shapes[work] = size(net.data[work])\n        else\n            input_ids = inneighbors(net.graph, work)\n            if (size(input_ids, 1) > 1)\n                node = net.inits[work]\n                net.data[work] = node(map((x)->net.data[x], input_ids))\n                net.shapes[work] = size(net.data[work])\n            else\n                node = net.inits[work](net.shapes[input_ids[1]])\n                net.data[work] = node(net.data[input_ids[1]])\n                net.shapes[work] = size(net.data[work])\n            end\n        end\n        net.nodes[work] = node\n    end\nend\n\ninit(net, train[1][1])\n\nfunction forward(net, data)\n    worklist = topological_sort_by_dfs(net.graph)\n    root = first(worklist)\n    for work in worklist\n        if work == root\n            net.data[work] = net.nodes[work](data)\n        else\n            input_ids = inneighbors(net.graph, work)\n            if (size(input_ids, 1) > 1)\n                net.data[work] = net.nodes[work](map((x)->net.data[x], input_ids))\n            else\n                net.data[work] = net.nodes[work](net.data[input_ids[1]])\n            end\n        end\n    end\n    net.data[size(worklist, 1)]\nend\n\nloss(x, y) = ${model.params.getJuliaLoss()}(forward(net, x), y)\n\naccuracy(x, y) = mean(onecold(forward(net, x)) .== onecold(y))\n\nevalcb = throttle(() -> @show(accuracy(tX, tY)), 10)\nopt = ${model.params.getJuliaOptimizer()}(${model.params.learningRate})\n\nfor i in 1:6\n    Flux.train!(loss, params(net), train, opt, cb = evalcb)\nend\n`;\n}\n"
  },
  {
    "path": "src/model/mnist_model.ts",
    "content": "// Adapted from https://github.com/tensorflow/tfjs-examples/tree/master/mnist\n\nimport * as tf from \"@tensorflow/tfjs\";\nimport {plotAccuracy,\n        plotLoss,\n        resetPlotValues,\n        setupPlots,\n        setupTestResults,\n        showConfusionMatrix,\n        showPredictions} from \"./graphs\";\n\nimport {dataset} from \"./data\";\nimport { model } from \"./params_object\";\n\n/**\n * Compile and train the given model.\n *\n * @param {*} model The model to\n */\nexport async function train(): Promise<void> {\n    // Set up all of the plots\n    resetPlotValues();\n    setupPlots();\n    setupTestResults();\n    await dataset.load();\n\n    const onIteration = () => showPredictions();\n    const optimizer = model.params.getOptimizer();\n\n    model.architecture.compile({\n        loss: model.params.loss,\n        metrics: [\"accuracy\"],\n        optimizer,\n    });\n    const batchSize = model.params.batchSize;\n    const validationSplit = 0.15;\n\n    const trainEpochs = model.params.epochs;\n\n    // We'll keep a buffer of loss and accuracy values over time.\n    let trainBatchCount: number = 0;\n    let prevTrainBatchCount: number = 0;\n    let totalLoss: number = 0;\n    let totalAccuracy: number = 0;\n    const plotLossFrequency: number = 25;\n\n    const trainData = dataset.getTrainData();\n    const testData = dataset.getTestData();\n    const totalNumBatches = Math.ceil(trainData.xs.shape[0] * (1 - validationSplit) / batchSize) * trainEpochs;\n\n    await model.architecture.fit(trainData.xs, trainData.labels, {\n        batchSize,\n        callbacks: {\n            onBatchEnd: async (batch: number, logs: tf.Logs) => {\n                trainBatchCount++;\n                const accBox = document.getElementById(\"ti_acc\");\n                const lossBox = document.getElementById(\"ti_loss\");\n                const trainBox = document.getElementById(\"ti_training\");\n                accBox.children[1].innerHTML = String(Number((100 * logs.acc).toFixed(2)));\n                lossBox.children[1].innerHTML = String(Number((logs.loss).toFixed(2)));\n                trainBox.children[1].innerHTML = String((trainBatchCount / totalNumBatches * 100).toFixed(1) + \"%\");\n                // For logging training in console.\n                // console.log(\n                //     `Training... (` +\n                //     `${(trainBatchCount / totalNumBatches * 100).toFixed(1)}%` +\n                //     ` complete). To stop training, refresh or close page.`);\n                totalLoss += logs.loss;\n                totalAccuracy += logs.acc;\n                if (batch % plotLossFrequency === 0) {\n                  // Compute the average loss for the last plotLossFrequency iterations\n                  plotLoss(trainBatchCount, totalLoss / (trainBatchCount - prevTrainBatchCount), \"train\");\n                  plotAccuracy(trainBatchCount, totalAccuracy / (trainBatchCount - prevTrainBatchCount), \"train\");\n                  prevTrainBatchCount = trainBatchCount;\n                  totalLoss = 0;\n                  totalAccuracy = 0;\n                }\n                if (batch % 60 === 0) {\n                  onIteration();\n                }\n                await tf.nextFrame();\n            },\n            onEpochEnd: async (_: number, logs: tf.Logs) => {\n                const valAcc = logs.val_acc;\n                const valLoss = logs.val_loss;\n                const accBox = document.getElementById(\"ti_vacc\");\n                const lossBox = document.getElementById(\"ti_vloss\");\n                accBox.children[1].innerHTML = String(Number((100 * valAcc).toFixed(2)));\n                lossBox.children[1].innerHTML = String(Number((valLoss).toFixed(2)));\n                plotLoss(trainBatchCount, logs.val_loss, \"validation\");\n                plotAccuracy(trainBatchCount, logs.val_acc, \"validation\");\n                showConfusionMatrix();\n                onIteration();\n                await tf.nextFrame();\n            },\n        },\n        epochs: trainEpochs,\n        validationSplit,\n    });\n\n    const testResult = model.architecture.evaluate(testData.xs, testData.labels) as Array<tf.Tensor<tf.Rank.R0>>;\n    const vaccBox = document.getElementById(\"ti_vacc\");\n    const vlossBox = document.getElementById(\"ti_vloss\");\n    vaccBox.children[1].innerHTML = String(Number((100 * testResult[1].dataSync()[0] ).toFixed(2)));\n    vlossBox.children[1].innerHTML = String(Number((testResult[0].dataSync()[0]).toFixed(2)));\n}\n"
  },
  {
    "path": "src/model/params_object.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { displayError } from \"../ui/error\";\n\n/** All the hyperparameters for the network */\nexport interface IHyperparameterData {\n    learningRate: number;\n    batchSize: number;\n    optimizerId: string;\n    epochs: number;\n    lossId: string;\n}\n\nclass NetworkParameters {\n    public learningRate: number = 0.01;\n    public batchSize: number = 64;\n    public optimizer: string = \"sgd\";\n    public epochs: number = 6;\n    public loss: string = \"categoricalCrossentropy\";\n    private paramNames: Set<string> = new Set([\"optimizer\", \"loss\"]);\n\n    public isParam(param: string): boolean {\n        return this.paramNames.has(param);\n    }\n\n    public getOptimizer(): tf.Optimizer {\n        switch (this.optimizer) {\n            case \"sgd\":\n                return tf.train.sgd(this.learningRate);\n\n            case \"rmsprop\":\n                return tf.train.rmsprop(this.learningRate);\n\n            case \"adagrad\":\n                return tf.train.adagrad(this.learningRate);\n\n            case \"adam\":\n                return tf.train.adam(this.learningRate);\n\n            default:\n                throw new Error(\"Undefined optimizer!\");\n        }\n    }\n\n    public getPythonLoss(): string {\n        return this.loss.split(/(?=[A-Z])/).join(\"_\").toLowerCase();\n    }\n\n    public getPythonOptimizer(): string {\n        switch (this.optimizer) {\n            case \"sgd\":\n                return \"SGD\";\n\n            case \"rmsprop\":\n                return \"RMSprop\";\n\n            case \"adagrad\":\n                return \"Adagrad\";\n\n            case \"adam\":\n                return \"Adam\";\n\n            default:\n                throw new Error(\"Undefined optimizer!\");\n        }\n    }\n\n    public getJuliaLoss(): string {\n        switch (this.loss) {\n            case \"categoricalCrossentropy\":\n                return \"crossentropy\";\n\n            case \"hinge\":\n                displayError(new Error(\"Hinge loss is not yet implemented in Julia. \"));\n\n            case \"meanSquaredError\":\n                return \"mse\";\n\n            case \"meanAbsoluteError\":\n                return \"((pred, y) -> mean(abs.(pred .- y)))\";\n\n            default:\n                throw new Error(\"Undefined loss!\");\n        }\n    }\n\n    public getJuliaOptimizer(): string {\n        switch (this.optimizer) {\n            case \"sgd\":\n                return \"Descent\";\n\n            case \"rmsprop\":\n                return \"RMSProp\";\n\n            case \"adagrad\":\n                return \"ADAGrad\";\n\n            case \"adam\":\n                return \"ADAM\";\n\n            default:\n                throw new Error(\"Undefined optimizer!\");\n        }\n    }\n}\n\n/**\n * Create a singleton model.\n */\nclass Model {\n    private static instance: Model;\n    public params: NetworkParameters = new NetworkParameters();\n    public architecture: tf.LayersModel = null;\n\n    private constructor() {}\n\n    public static get Instance(): Model {\n        return this.instance || (this.instance = new this());\n    }\n}\n\nexport const model = Model.Instance;\n"
  },
  {
    "path": "src/model/python_skeleton.ts",
    "content": "import { setModelHyperparameters } from \"../ui/app\";\r\nimport { dataset } from \"./data\";\r\nimport { model } from \"./params_object\";\r\n\r\nexport function pythonSkeleton(modelCode: string): string {\r\n    setModelHyperparameters();\r\n    return `from __future__ import print_function\r\nimport keras\r\nfrom keras.datasets import ${dataset.pythonName}\r\nfrom keras.models import Model\r\nfrom keras.layers import Dense, Dropout, Flatten, Input, Concatenate, BatchNormalization, Add\r\nfrom keras.layers import Conv2D, MaxPooling2D, ReLU\r\nfrom keras import backend as K\r\n\r\nbatch_size = ${model.params.batchSize}\r\nnum_classes = ${dataset.NUM_CLASSES}\r\nepochs = ${model.params.epochs}\r\n\r\n# input image dimensions\r\nimg_rows, img_cols, channels = ${dataset.IMAGE_HEIGHT}, ${dataset.IMAGE_WIDTH}, ${dataset.IMAGE_CHANNELS}\r\n\r\n# the data, split between train and test sets\r\n(x_train, y_train), (x_test, y_test) = ${dataset.pythonName}.load_data()\r\n\r\nif K.image_data_format() == 'channels_first':\r\n    x_train = x_train.reshape(x_train.shape[0], channels, img_rows, img_cols)\r\n    x_test = x_test.reshape(x_test.shape[0], channels, img_rows, img_cols)\r\n    input_shape = (channels, img_rows, img_cols)\r\nelse:\r\n    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, channels)\r\n    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, channels)\r\n    input_shape = (img_rows, img_cols, channels)\r\n\r\nx_train = x_train.astype('float32')\r\nx_test = x_test.astype('float32')\r\nx_train /= 255\r\nx_test /= 255\r\nprint('x_train shape:', x_train.shape)\r\nprint(x_train.shape[0], 'train samples')\r\nprint(x_test.shape[0], 'test samples')\r\n\r\n# convert class vectors to binary class matrices\r\ny_train = keras.utils.to_categorical(y_train, num_classes)\r\ny_test = keras.utils.to_categorical(y_test, num_classes)\r\n\r\n############################# Architecture made by Ennui\r\n${modelCode}\r\n#############################\r\n\r\nmodel.compile(loss=keras.losses.${model.params.getPythonLoss()},\r\n              optimizer=keras.optimizers.${model.params.getPythonOptimizer()}(lr=${model.params.learningRate}),\r\n              metrics=['accuracy'])\r\n\r\nmodel.fit(x_train, y_train,\r\n          batch_size=batch_size,\r\n          epochs=epochs,\r\n          verbose=1,\r\n          validation_data=(x_test, y_test))\r\nscore = model.evaluate(x_test, y_test, verbose=0)\r\nprint('Test loss:', score[0])\r\nprint('Test accuracy:', score[1])\r\n`;\r\n}\r\n"
  },
  {
    "path": "src/model/save_state_url.ts",
    "content": "import { IDraggableData } from \"../ui/app\";\nimport { defaultTemplate, resetWorkspace } from \"../ui/model_templates\";\nimport { Input } from \"../ui/shapes/layers/input\";\nimport { Output } from \"../ui/shapes/layers/output\";\nimport { ISerializedNetwork, stateFromJson } from \"./export_model\";\n\nexport function storeNetworkInUrl(state: ISerializedNetwork): string {\n    // To encode in URL\n    return encodeURI(JSON.stringify(state));\n}\n\n/**\n * Load a network from a URL if possible. Otherwise, load the default workspace.\n */\nexport function loadStateIfPossible(): IDraggableData {\n\n    let svgData: IDraggableData = {\n        draggable : [],\n        input: null,\n        output: null,\n    };\n\n    const urlParams: string = window.location.hash;\n    try {\n        resetWorkspace(svgData);\n        if (urlParams.length > 1) {\n            const network: ISerializedNetwork = JSON.parse(decodeURI(urlParams.slice(1)));\n\n            // Serialize the model if it exists\n            svgData = stateFromJson(svgData, network);\n        } else {\n            svgData.input = new Input();\n            svgData.output = new Output();\n            defaultTemplate(svgData);\n        }\n    } catch (err) {\n        svgData.input = new Input();\n        svgData.output = new Output();\n        defaultTemplate(svgData);\n        throw err;\n    }\n\n    // Used for getting positions of each draggable in terms of percents of svg canvas\n    // useful if creating a new template\n    // let canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById(\"svg\"));\n    // let width = canvasBoundingBox.width;\n    // let height = canvasBoundingBox.height;\n\n    // for (let draggable of svgData.draggable) {\n    //     let pos = draggable.getPosition()\n    //     console.log(pos.x / width, pos.y / height, draggable.getHoverText())\n    // }\n\n    history.replaceState(null, null, \" \");\n\n    return svgData;\n}\n"
  },
  {
    "path": "src/ui/app.ts",
    "content": "import * as d3 from \"d3\";\nimport { buildNetworkDAG, topologicalSort } from \"../model/build_network\";\nimport { generateJulia, generatePython } from \"../model/code_generation\";\nimport { changeDataset } from \"../model/data\";\nimport { download, graphToJson } from \"../model/export_model\";\nimport { setupPlots, setupTestResults, showPredictions } from \"../model/graphs\";\nimport { train } from \"../model/mnist_model\";\nimport { model } from \"../model/params_object\";\nimport { loadStateIfPossible, storeNetworkInUrl } from \"../model/save_state_url\";\nimport { clearError, displayError } from \"./error\";\nimport { blankTemplate, defaultTemplate, resnetTemplate } from \"./model_templates\";\nimport { Activation, Relu, Sigmoid, Tanh } from \"./shapes/activation\";\nimport { ActivationLayer } from \"./shapes/activationlayer\";\nimport { Draggable } from \"./shapes/draggable\";\nimport { Layer } from \"./shapes/layer\";\nimport { Add } from \"./shapes/layers/add\";\nimport { BatchNorm } from \"./shapes/layers/batchnorm\";\nimport { Concatenate } from \"./shapes/layers/concatenate\";\nimport { Conv2D } from \"./shapes/layers/convolutional\";\nimport { Dense } from \"./shapes/layers/dense\";\nimport { Dropout } from \"./shapes/layers/dropout\";\nimport { Flatten } from \"./shapes/layers/flatten\";\nimport { Input } from \"./shapes/layers/input\";\nimport { MaxPooling2D } from \"./shapes/layers/maxpooling\";\nimport { Output } from \"./shapes/layers/output\";\nimport { TextBox } from \"./shapes/textbox\";\nimport { WireGuide } from \"./shapes/wireguide\";\nimport { copyTextToClipboard } from \"./utils\";\nimport { windowProperties } from \"./window\";\n\nexport interface IDraggableData {\n    draggable: Draggable[];\n    input: Input;\n    output: Output;\n}\n\nexport let svgData: IDraggableData = {\n    draggable: [],\n    input: null,\n    output: null,\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n\n    // This function runs when the DOM is ready, i.e. when the document has been parsed\n    setupPlots();\n    setupTestResults();\n\n    setupOptionOnClicks();\n    setupIndividualOnClicks();\n\n    const categoryElements = document.getElementsByClassName(\"categoryTitle\") as HTMLCollectionOf<HTMLElement>;\n    for (const elmt of categoryElements) {\n        makeCollapsable(elmt);\n    }\n\n    window.addEventListener(\"resize\", resizeMiddleSVG);\n    window.addEventListener(\"resize\", setupPlots);\n\n    resizeMiddleSVG();\n\n    window.onkeyup = (event: KeyboardEvent) => {\n        switch (event.key) {\n            case \"Escape\":\n                if (windowProperties.selectedElement) {\n                    windowProperties.selectedElement.unselect();\n                    windowProperties.selectedElement = null;\n                }\n                break;\n            case \"Delete\":\n                if (document.getElementsByClassName(\"focusParam\").length === 0) {\n                    deleteSelected();\n                }\n                break;\n            case \"Backspace\":\n                if (document.getElementsByClassName(\"focusParam\").length === 0) {\n                    deleteSelected();\n                }\n                break;\n            case \"Enter\":\n                break;\n        }\n    };\n\n    windowProperties.wireGuide = new WireGuide();\n    windowProperties.shapeTextBox = new TextBox();\n\n    d3.select(\"#svg\").on(\"mousemove\", () => {\n        if (windowProperties.selectedElement instanceof Layer) {\n            windowProperties.wireGuide.moveToMouse();\n        }\n    });\n\n    svgData = loadStateIfPossible();\n\n    // Select the input block when we load the page\n    svgData.input.select();\n\n});\n\nfunction addOnClickToOptions(categoryId: string, func: (optionValue: string, element: HTMLElement) => void): void {\n    for (const element of document.getElementById(categoryId).getElementsByClassName(\"option\")) {\n        element.addEventListener(\"click\", () => {\n            func(element.getAttribute(\"data-optionValue\"), element as HTMLElement);\n        });\n    }\n}\n\nfunction setupOptionOnClicks(): void {\n    addOnClickToOptions(\"tabselector\", (tabType) => switchTab(tabType));\n    addOnClickToOptions(\"layers\", (layerType) => appendItem(layerType));\n    addOnClickToOptions(\"activations\", (activationType) => appendItem(activationType));\n    addOnClickToOptions(\"templates\", (templateType) => createTemplate(templateType));\n    addOnClickToOptions(\"educationLayers\", (articleType) => {\n        document.getElementById(\"education\" + articleType).scrollIntoView(true);\n    });\n    addOnClickToOptions(\"educationStory\", (articleType) => {\n        document.getElementById(\"education\" + articleType).scrollIntoView(true);\n    });\n    addOnClickToOptions(\"classes\", (_, element) => {\n        selectOption(\"classes\", element);\n        if (model.architecture != null) {\n            showPredictions();\n        }\n    });\n    addOnClickToOptions(\"optimizers\", (optimizerType, element) => {\n        selectOption(\"optimizers\", element);\n        model.params.optimizer = optimizerType;\n    });\n    addOnClickToOptions(\"losses\", (lossType, element) => {\n        selectOption(\"losses\", element);\n        model.params.loss = lossType;\n    });\n}\n\nfunction selectOption(optionCategoryId: string, optionElement: HTMLElement): void {\n    for (const option of document.getElementById(optionCategoryId).getElementsByClassName(\"option\")) {\n        option.classList.remove(\"selected\");\n    }\n    optionElement.classList.add(\"selected\");\n}\n\nfunction createTemplate(template: string): void {\n    switch (template) {\n        case \"blank\": blankTemplate(svgData); break;\n        case \"default\": defaultTemplate(svgData); break;\n        case \"resnet\": resnetTemplate(svgData); break;\n\n    }\n}\n\nfunction appendItem(itemType: string): void {\n    const item: Draggable = new ({\n        add: Add,\n        batchnorm: BatchNorm,\n        concatenate: Concatenate,\n        conv2D: Conv2D,\n        dense: Dense,\n        dropout: Dropout,\n        flatten: Flatten,\n        maxPooling2D: MaxPooling2D,\n        relu: Relu,\n        sigmoid: Sigmoid,\n        tanh: Tanh,\n    } as any)[itemType]();\n\n    svgData.draggable.push(item);\n}\n\nfunction setupIndividualOnClicks(): void {\n    document.getElementById(\"exportPython\").addEventListener(\"click\", () => {\n        changeDataset(svgData.input.getParams().dataset);\n        const filename = svgData.input.getParams().dataset + \"_model.py\";\n        download(generatePython(topologicalSort(svgData.input)), filename);\n    });\n\n    document.getElementById(\"exportJulia\").addEventListener(\"click\", () => {\n        changeDataset(svgData.input.getParams().dataset);\n        if (svgData.input.getParams().dataset === \"cifar\") {\n            displayError(new Error(\"Julia Export does not support CIFAR10, use MNIST instead.\"));\n        } else {\n            const filename = svgData.input.getParams().dataset + \"_model.jl\";\n            download(generateJulia(topologicalSort(svgData.input)), filename);\n        }\n    });\n\n    document.getElementById(\"copyModel\").addEventListener(\"click\", () => {\n        changeDataset(svgData.input.getParams().dataset); // TODO change dataset should happen when the dataset changes\n        const state = graphToJson(svgData);\n        const baseUrl: string = window.location.href;\n        const urlParam: string = storeNetworkInUrl(state);\n        copyTextToClipboard(baseUrl + \"#\" + urlParam);\n    });\n\n    document.getElementById(\"train\").addEventListener(\"click\", trainOnClick);\n\n    document.getElementById(\"informationEducation\").addEventListener(\"click\", () => {\n        document.getElementById(\"informationOverlay\").style.display = \"none\";\n        switchTab(\"education\");\n    });\n\n    document.getElementById(\"informationOverlay\").addEventListener(\"click\", () => {\n        document.getElementById(\"informationOverlay\").style.display = \"none\";\n    });\n\n    document.getElementById(\"x\").addEventListener(\"click\", () => clearError());\n\n    document.getElementById(\"svg\").addEventListener(\"click\", (event) => {\n        // Only click if there is a selected element, and the clicked element is an SVG Element, and its id is \"svg\"\n        // It does this to prevent unselecting if we click on a layer block or other svg shape\n        if (windowProperties.selectedElement && event.target instanceof SVGElement && event.target.id === \"svg\") {\n            windowProperties.selectedElement.unselect();\n            windowProperties.selectedElement = null;\n        }\n    });\n}\n\nfunction deleteSelected(): void {\n    if (windowProperties.selectedElement) {\n        windowProperties.selectedElement.delete();\n        windowProperties.selectedElement = null;\n    }\n}\n\nasync function trainOnClick(): Promise<void> {\n\n    // Only train if not already training\n\n    const training = document.getElementById(\"train\");\n    if (!training.classList.contains(\"train-active\")) {\n        clearError();\n\n        changeDataset(svgData.input.getParams().dataset); // TODO change dataset should happen when the dataset changes\n\n        // Grab hyperparameters\n        setModelHyperparameters();\n\n        const trainingBox = document.getElementById(\"ti_training\");\n        trainingBox.children[1].innerHTML = \"Yes\";\n        training.innerHTML = \"Training\";\n        training.classList.add(\"train-active\");\n        try {\n            model.architecture = buildNetworkDAG(svgData.input);\n            await train();\n        } catch (error) {\n            displayError(error);\n        } finally {\n            training.innerHTML = \"Train\";\n            training.classList.remove(\"train-active\");\n            trainingBox.children[1].innerHTML = \"No\";\n        }\n    }\n}\n\nfunction resizeMiddleSVG(): void {\n    const originalSVGWidth = 1000;\n\n    const svgWidth = document.getElementById(\"middle\").clientWidth;\n    const svgHeight = document.getElementById(\"middle\").clientHeight;\n\n    const ratio = svgWidth / originalSVGWidth;\n\n    const xTranslate = (svgWidth - originalSVGWidth) / 2;\n    const yTranslate = Math.max(0, (svgHeight * ratio - svgHeight) / 2);\n\n    // Modify initialization heights for random locations for layers/activations so they don't appear above the svg\n    const yOffsetDelta = yTranslate / ratio - windowProperties.svgYOffset;\n    ActivationLayer.defaultInitialLocation.y += yOffsetDelta;\n    Activation.defaultLocation.y += yOffsetDelta;\n\n    windowProperties.svgYOffset = yTranslate / ratio;\n    windowProperties.svgTransformRatio = ratio;\n\n    document.getElementById(\"svg\").setAttribute(\"transform\", `translate(${xTranslate}, 0) scale(${ratio}, ${ratio})  `);\n\n    // Call crop position on each draggable to ensure it is within the new canvas boundary\n    if (svgData.input != null) {\n        svgData.input.cropPosition();\n        svgData.input.moveAction();\n    }\n    if (svgData.output != null) {\n        svgData.output.cropPosition();\n        svgData.output.moveAction();\n    }\n    svgData.draggable.forEach((elem) => {\n        elem.cropPosition();\n        elem.moveAction();\n    });\n}\n\nfunction toggleExpanderTriangle(categoryTitle: Element): void {\n    categoryTitle.getElementsByClassName(\"expander\")[0].classList.toggle(\"expanded\");\n}\n\nfunction makeCollapsable(elmt: Element): void {\n    elmt.addEventListener(\"click\", () => {\n        toggleExpanderTriangle(elmt);\n        const arr = Array.prototype.slice.call(elmt.parentElement.children).slice(1);\n\n        if (elmt.getAttribute(\"data-expanded\") === \"false\") {\n            for (const sib of arr) {\n                if (sib.id !== \"defaultparambox\") {\n                    sib.style.display = \"block\";\n                }\n            }\n\n            elmt.setAttribute(\"data-expanded\", \"true\");\n        } else {\n            for (const sib of arr) {\n                sib.style.display = \"none\";\n            }\n            elmt.setAttribute(\"data-expanded\", \"false\");\n        }\n    });\n}\n\n/**\n * Takes the hyperparemeters from the html and assigns them to the global model\n */\nexport function setModelHyperparameters(): void {\n    let temp: number = 0;\n    const hyperparams = document.getElementsByClassName(\"hyperparamvalue\");\n\n    for (const hp of hyperparams) {\n        const name: string = hp.id;\n\n        temp = Number(( document.getElementById(name) as HTMLInputElement).value);\n        if (temp < 0 || temp == null) {\n            const error: Error = Error(\"Hyperparameters should be positive numbers.\");\n            displayError(error);\n            return;\n        }\n        switch (name) {\n            case \"learningRate\":\n                model.params.learningRate = temp;\n                break;\n\n            case \"epochs\":\n                model.params.epochs = Math.trunc(temp);\n                break;\n\n            case \"batchSize\":\n                model.params.batchSize = Math.trunc(temp);\n                break;\n        }\n    }\n}\n\nexport function tabSelected(): string {\n    if (document.getElementById(\"networkTab\").style.display !== \"none\") {\n        return \"networkTab\";\n    } else if (document.getElementById(\"progressTab\").style.display !== \"none\") {\n        return \"progressTab\";\n    } else if (document.getElementById(\"visualizationTab\").style.display !== \"none\") {\n        return \"visualizationTab\";\n    } else if (document.getElementById(\"educationTab\").style.display !== \"none\") {\n        return \"educationTab\";\n    } else {\n        throw new Error(\"No tab selection found\");\n    }\n}\n\nfunction switchTab(tabType: string): void {\n    // Hide all tabs\n    document.getElementById(\"networkTab\").style.display = \"none\";\n    document.getElementById(\"progressTab\").style.display = \"none\";\n    document.getElementById(\"visualizationTab\").style.display = \"none\";\n    document.getElementById(\"educationTab\").style.display = \"none\";\n\n    // Hide all menus\n    document.getElementById(\"networkMenu\").style.display = \"none\";\n    document.getElementById(\"progressMenu\").style.display = \"none\";\n    document.getElementById(\"visualizationMenu\").style.display = \"none\";\n    document.getElementById(\"educationMenu\").style.display = \"none\";\n\n    // Hide all paramshells\n    document.getElementById(\"networkParamshell\").style.display = \"none\";\n    document.getElementById(\"progressParamshell\").style.display = \"none\";\n    document.getElementById(\"visualizationParamshell\").style.display = \"none\";\n    document.getElementById(\"educationParamshell\").style.display = \"none\";\n\n    // Unselect all tabs\n    document.getElementById(\"network\").classList.remove(\"tab-selected\");\n    document.getElementById(\"progress\").classList.remove(\"tab-selected\");\n    document.getElementById(\"visualization\").classList.remove(\"tab-selected\");\n    document.getElementById(\"education\").classList.remove(\"tab-selected\");\n\n    // Display only the selected tab\n    document.getElementById(tabType + \"Tab\").style.display = null;\n    document.getElementById(tabType).classList.add(\"tab-selected\");\n    document.getElementById(tabType + \"Menu\").style.display = null;\n    document.getElementById(tabType + \"Paramshell\").style.display = null;\n    document.getElementById(\"paramshell\").style.display = null;\n    document.getElementById(\"menu\").style.display = null;\n    // document.getElementById(\"menu_expander\").style.display = null;\n\n    switch (tabType) {\n        case \"network\": resizeMiddleSVG(); break;\n        case \"progress\": setupPlots(); break;\n        case \"visualization\": showPredictions(); break;\n        case \"education\":\n            document.getElementById(\"paramshell\").style.display = \"none\";\n            break;\n    }\n\n    // Give border radius to top and bottom neighbors\n    if (document.getElementsByClassName(\"top_neighbor_tab-selected\").length > 0) {\n        document.getElementsByClassName(\"top_neighbor_tab-selected\")[0].classList\n            .remove(\"top_neighbor_tab-selected\");\n        document.getElementsByClassName(\"bottom_neighbor_tab-selected\")[0].classList\n            .remove(\"bottom_neighbor_tab-selected\");\n    }\n\n    const tabMapping = [\"blanktab\", \"network\", \"progress\", \"visualization\",\n        \"middleblanktab\", \"education\", \"bottomblanktab\"];\n    const index = tabMapping.indexOf(tabType);\n\n    document.getElementById(tabMapping[index - 1]).classList.add(\"top_neighbor_tab-selected\");\n    document.getElementById(tabMapping[index + 1]).classList.add(\"bottom_neighbor_tab-selected\");\n}\n"
  },
  {
    "path": "src/ui/error.ts",
    "content": "\nexport function displayError(error: Error): void {\n    document.getElementById(\"error\").style.display = null;\n    document.getElementById(\"errorMessage\").innerHTML = error.message;\n    document.getElementById(\"error\").title = error.message;\n    throw error;\n}\n\nexport function clearError(): void {\n    document.getElementById(\"error\").style.display = \"none\";\n}\n"
  },
  {
    "path": "src/ui/model_templates.ts",
    "content": "import { IDraggableData } from \"./app\";\nimport { Activation, Relu } from \"./shapes/activation\";\nimport { ActivationLayer } from \"./shapes/activationlayer\";\nimport { Layer } from \"./shapes/layer\";\nimport { Add } from \"./shapes/layers/add\";\nimport { BatchNorm } from \"./shapes/layers/batchnorm\";\nimport { Concatenate } from \"./shapes/layers/concatenate\";\nimport { Conv2D } from \"./shapes/layers/convolutional\";\nimport { Dense } from \"./shapes/layers/dense\";\nimport { Dropout } from \"./shapes/layers/dropout\";\nimport { Flatten } from \"./shapes/layers/flatten\";\nimport { MaxPooling2D } from \"./shapes/layers/maxpooling\";\nimport { Point } from \"./shapes/shape\";\nimport { getSvgOriginalBoundingBox } from \"./utils\";\nimport { windowProperties } from \"./window\";\n\nexport function resetWorkspace(svgData: IDraggableData): void {\n    // Deselect current element\n    if (windowProperties.selectedElement != null) {\n        windowProperties.selectedElement.unselect();\n    }\n    // Set input and output locations\n    if (svgData.input != null) {\n        svgData.input.setPosition(svgData.input.defaultLocation);\n        svgData.input.wires.forEach((w) => w.delete());\n    }\n    if (svgData.output != null) {\n        svgData.output.setPosition(svgData.output.defaultLocation);\n    }\n\n    // Remove all other layers\n    for (const layer of svgData.draggable) {\n        layer.delete();\n    }\n\n    // Clear the current list of draggables\n    svgData.draggable = [];\n}\n\nexport function defaultTemplate(svgData: IDraggableData): void {\n    resetWorkspace(svgData);\n\n    // Initialize each of the layers and activations\n    const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement);\n    const convStartingPosition = new Point(canvasBoundingBox.width / 4, canvasBoundingBox.height / 2.5);\n    const flatStartingPosition = new Point(canvasBoundingBox.width / 1.75, canvasBoundingBox.height / 2.5);\n    const denseStartingPosition = new Point(canvasBoundingBox.width * 5 / 6.5, canvasBoundingBox.height / 2.5);\n    const conv: ActivationLayer = new Conv2D(convStartingPosition);\n    const convRelu: Activation = new Relu(convStartingPosition);\n\n    const flat: Layer = new Flatten(flatStartingPosition);\n    const dense: ActivationLayer = new Dense(denseStartingPosition);\n    const denseRelu: Activation = new Relu(denseStartingPosition);\n\n    // Add relationships among layers and activations\n    svgData.input.addChild(conv);\n    conv.addChild(flat);\n    conv.addActivation(convRelu);\n\n    flat.addChild(dense);\n\n    dense.addChild(svgData.output);\n    dense.addActivation(denseRelu);\n\n    // Store the new network\n    svgData.draggable.push(conv);\n    svgData.draggable.push(dense);\n    svgData.draggable.push(flat);\n    svgData.draggable.push(convRelu);\n    svgData.draggable.push(denseRelu);\n}\n\nexport function blankTemplate(svgData: IDraggableData): void {\n    resetWorkspace(svgData);\n}\n\nexport function resnetTemplate(svgData: IDraggableData): void {\n    resetWorkspace(svgData);\n\n    // Initialize each of the layers and activations\n    const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement);\n    const width = canvasBoundingBox.width;\n    const height = canvasBoundingBox.height;\n\n    const conv0Pos = new Point(width * 0.26, height * 0.57);\n    const conv1Pos = new Point(width * 0.26, height * 0.372);\n    const conv2Pos = new Point(width * 0.404, height * 0.372);\n    const conv3Pos = new Point(width * 0.404, height * 0.78);\n    const conv4Pos = new Point(width * 0.537, height * 0.78);\n    const add1Pos = new Point(width * 0.387, height * 0.547);\n    const add2Pos = new Point(width * 0.521, height * 0.547);\n    const flattenPos = new Point(width * 0.708, height * 0.606);\n    const densePos = new Point(width * 0.702, height * 0.566);\n    const dropoutPos = new Point(width * 0.778, height * 0.477);\n\n    const conv0: ActivationLayer = new Conv2D(conv0Pos);\n    const conv1: ActivationLayer = new Conv2D(conv1Pos);\n    const conv2: ActivationLayer = new Conv2D(conv2Pos);\n    const conv3: ActivationLayer = new Conv2D(conv3Pos);\n    const conv4: ActivationLayer = new Conv2D(conv4Pos);\n    const conv1Relu: Activation = new Relu(conv1Pos);\n    const conv3Relu: Activation = new Relu(conv3Pos);\n    const add1: ActivationLayer = new Add(add1Pos);\n    const add2: ActivationLayer = new Add(add2Pos);\n    const add1Relu: Activation = new Relu(add1Pos);\n    const add2Relu: Activation = new Relu(add2Pos);\n    const flatten: Flatten = new Flatten(flattenPos);\n    const dense: ActivationLayer = new Dense(densePos);\n    const denseRelu: Activation = new Relu(densePos);\n    const dropout: Layer = new Dropout(dropoutPos);\n\n    // Add activations to layers\n    conv1.addActivation(conv1Relu);\n    conv3.addActivation(conv3Relu);\n    add1.addActivation(add1Relu);\n    add2.addActivation(add2Relu);\n    dense.addActivation(denseRelu);\n\n    // Add relationships among layers and activations\n    svgData.input.addChild(conv0);\n\n    conv0.addChild(add1);\n    conv0.addChild(conv1);\n\n    conv1.addChild(conv2);\n    conv2.addChild(add1);\n\n    add1.addChild(conv3);\n    add1.addChild(add2);\n\n    conv3.addChild(conv4);\n    conv4.addChild(add2);\n\n    add2.addChild(flatten);\n    flatten.addChild(dense);\n    dense.addChild(dropout);\n    dropout.addChild(svgData.output);\n\n    // Store the new network\n    svgData.draggable.push(conv0);\n    svgData.draggable.push(conv1);\n    svgData.draggable.push(conv2);\n    svgData.draggable.push(conv3);\n    svgData.draggable.push(conv4);\n    svgData.draggable.push(add1);\n    svgData.draggable.push(add2);\n    svgData.draggable.push(flatten);\n    svgData.draggable.push(dense);\n    svgData.draggable.push(dropout);\n    svgData.draggable.push(conv1Relu);\n    svgData.draggable.push(conv3Relu);\n    svgData.draggable.push(add1Relu);\n    svgData.draggable.push(add2Relu);\n    svgData.draggable.push(denseRelu);\n}\n\nexport function complexTemplate(svgData: IDraggableData): void {\n    resetWorkspace(svgData);\n\n    // Initialize each of the layers and activations\n    const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement);\n    const width = canvasBoundingBox.width;\n    const height = canvasBoundingBox.height;\n    const convStartingPosition = new Point(width / 3.5, height / 3);\n    const denseStartingPosition = new Point(width * 3 / 4, height / 2);\n    const conv2StartingPosition = new Point(width / 3.5, height * 2 / 3);\n    const batchStartingPosition = new Point(width / 2.5, height * 2 / 3);\n    const maxpoolingStartingPosition = new Point(width / 2.5, height / 3);\n    const concatStartingPosition = new Point(width * 2 / 3, height / 1.9);\n    const flat1StartingPosition = new Point(width / 1.7, height / 2.2);\n    const flat2StartingPosition = new Point(width / 1.7, height * 2 / 3);\n\n    const conv: ActivationLayer = new Conv2D(convStartingPosition);\n    const convRelu: Activation = new Relu(convStartingPosition);\n    const dense: ActivationLayer = new Dense(denseStartingPosition);\n    const denseRelu: Activation = new Relu(denseStartingPosition);\n    const conv2: ActivationLayer = new Conv2D(conv2StartingPosition);\n    const maxpooling: MaxPooling2D = new MaxPooling2D(maxpoolingStartingPosition);\n    const concat: Concatenate = new Concatenate(concatStartingPosition);\n    const batch: ActivationLayer = new BatchNorm(batchStartingPosition);\n    const batchRelu2: Activation = new Relu(batchStartingPosition);\n    const flat1: Flatten = new Flatten(flat1StartingPosition);\n    const flat2: Flatten = new Flatten(flat2StartingPosition);\n\n    // Add relationships among layers and activations\n    // in -> conv, in -> conv2\n    svgData.input.addChild(conv);\n    svgData.input.addChild(conv2);\n\n    // conv -> maxpool\n    conv.addChild(maxpooling);\n    conv.addActivation(convRelu);\n\n    // maxpooling -> flat1\n    maxpooling.addChild(flat1);\n\n    // conv2 -> batch\n    conv2.addChild(batch);\n\n    // batch -> flat2\n    batch.addChild(flat2);\n    batch.addActivation(batchRelu2);\n\n    // concat -> dense\n    concat.addChild(dense);\n\n    // flat1 -> concat\n    flat1.addChild(concat);\n\n    // flat2 -> concat\n    flat2.addChild(concat);\n\n    // dense -> out\n    dense.addActivation(denseRelu);\n    dense.addChild(svgData.output);\n\n    // Store the new network\n    svgData.draggable.push(conv);\n    svgData.draggable.push(conv2);\n    svgData.draggable.push(dense);\n    svgData.draggable.push(maxpooling);\n    svgData.draggable.push(convRelu);\n    svgData.draggable.push(batchRelu2);\n    svgData.draggable.push(concat);\n    svgData.draggable.push(flat1);\n    svgData.draggable.push(flat2);\n    svgData.draggable.push(batch);\n}\n"
  },
  {
    "path": "src/ui/shapes/activation.ts",
    "content": "import { windowProperties } from \"../window\";\nimport { ActivationLayer } from \"./activationlayer\";\nimport { Draggable } from \"./draggable\";\nimport { Point } from \"./shape\";\n\nexport abstract class Activation extends Draggable {\n    public static defaultLocation: Point = new Point(50, 150);\n\n    public layer: ActivationLayer = null;\n    public abstract activationType: string;\n    public body: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\n\n    constructor(color: string, defaultLocation: Point) {\n        super(defaultLocation);\n\n        this.body = this.svgComponent.append<SVGGraphicsElement>(\"path\")\n                                     .attr(\"d\", \"M0 0 h10 v10 h8 v20 h-26 v-20 h8 v-10 Z\")\n                                     .style(\"fill\", color)\n                                     .style(\"cursor\", \"pointer\");\n\n        this.makeDraggable();\n    }\n\n    public select(): void {\n        super.select();\n        this.body.style(\"stroke\", \"yellow\").style(\"stroke-width\", \"2\");\n    }\n\n    public unselect(): void {\n        super.unselect();\n        this.body.style(\"stroke\", null).style(\"stroke-width\", null);\n    }\n\n    public delete(): void {\n        // Remove the activation from the layer then delete the activation.\n        if (this.layer != null) {\n            this.layer.removeActivation();\n            this.layer = null;\n        }\n        super.delete();\n    }\n\n    public moveAction(): void {\n        let closestLayer: ActivationLayer;\n        let minDist = Infinity;\n        if (this.layer == null) {\n            // Find the closest layer and its distances\n            for (const activationLayer of windowProperties.activationLayers) {\n                const dist = activationLayer.getPosition().distance(this.getPosition());\n                if (dist < minDist) {\n                    minDist = dist;\n                    closestLayer = activationLayer;\n                }\n            }\n        } else {\n            closestLayer = this.layer;\n            minDist = this.layer.getPosition().distance(this.getPosition());\n        }\n\n        // Snap activations if they are close enough\n        const snappingDistance = 20;\n        if (minDist < snappingDistance) {\n            // if snap happens remove old connection\n            if (this.layer != null) {\n                this.layer.removeActivation();\n                this.layer = null;\n            }\n            closestLayer.addActivation(this);\n            this.layer = closestLayer;\n            this.draggedX = this.layer.draggedX;\n            this.draggedY = this.layer.draggedY;\n\n        } else if (this.layer != null) { // otherwise, if we unsnap update as appropriate\n            this.layer.removeActivation();\n            this.layer = null;\n        }\n    }\n\n}\n\nexport class Relu extends Activation {\n    public activationType: string = \"relu\";\n\n    constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) {\n\n        super(\"#B29F9C\", defaultLocation);\n\n        this.svgComponent.append(\"path\").attr(\"d\", \"M-5 20 l10 0 l7 -7\")\n                                        .style(\"stroke\", \"black\")\n                                        .style(\"stroke-width\", 3)\n                                        .style(\"fill\", \"none\")\n                                        .style(\"cursor\", \"pointer\");\n\n    }\n\n    public getHoverText(): string { return \"relu\"; }\n\n}\n\nexport class Sigmoid extends Activation {\n    public activationType: string = \"sigmoid\";\n\n    constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) {\n        super(\"#F2A878\", defaultLocation);\n\n        this.svgComponent.append(\"path\").attr(\"d\", \"M -3 20 Q 5 20 5 17 Q 5 14 13 14 \")\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-width\", 3)\n        .style(\"fill\", \"none\")\n        .style(\"cursor\", \"pointer\");\n\n    }\n\n    public getHoverText(): string { return \"sigmoid\"; }\n\n}\n\nexport class Tanh extends Activation {\n    public activationType: string = \"tanh\";\n\n    constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) {\n        super(\"#A3A66D\", defaultLocation);\n\n        this.svgComponent.append(\"path\").attr(\"d\", \"M -4 26 Q 5 26 5 20 Q 5 14 14 14 \")\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-width\", 3)\n        .style(\"fill\", \"none\")\n        .style(\"cursor\", \"pointer\");\n\n    }\n\n    public getHoverText(): string { return \"tanh\"; }\n}\n\nexport class Softmax extends Activation {\n    public activationType: string = \"softmax\";\n\n    constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) {\n        super(\"#FFFFFF\", defaultLocation);\n\n        // TODO: curvature and color are wrong\n        this.svgComponent.append(\"path\").attr(\"d\", \"M -4 26 Q 5 26 5 20 Q 5 14 14 14 \")\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-width\", 3)\n        .style(\"fill\", \"none\")\n        .style(\"cursor\", \"pointer\");\n\n    }\n\n    public getHoverText(): string { return \"softmax\"; }\n}\n"
  },
  {
    "path": "src/ui/shapes/activationlayer.ts",
    "content": "import { displayError } from \"../error\";\nimport { windowProperties } from \"../window\";\nimport { Activation } from \"./activation\";\nimport { Draggable } from \"./draggable\";\nimport { ILayerJson, Layer } from \"./layer\";\nimport { Point, Shape } from \"./shape\";\n\n/**\n * Layers that can have an activation attached to them.\n */\nexport abstract class ActivationLayer extends Layer {\n    public static defaultInitialLocation: Point = new Point(100, 100);\n    public activation: Activation = null;\n\n    // Note: The activation will snap to the 0,0 point of an ActivationLayer\n    constructor(block: Shape[], defaultLocation: Point = new Point(100, 100)) {\n        super(block, defaultLocation);\n\n        // Keep track of activationLayers in global state for activation snapping\n        windowProperties.activationLayers.add(this);\n    }\n\n    public moveAction(): void {\n        super.moveAction();\n        if (this.activation != null) {\n            const p = this.getPosition();\n            this.activation.setPosition(p);\n            this.activation.draggedX = this.draggedX;\n            this.activation.draggedY = this.draggedY;\n        }\n    }\n\n    public raiseGroup(): void {\n        super.raiseGroup();\n        if (this.activation != null) { this.activation.raiseGroup(); }\n    }\n\n    public delete(): void {\n        super.delete();\n        // Remove this layer from global state\n        windowProperties.activationLayers.delete(this);\n        if (this.activation != null) {\n            this.activation.delete();\n            this.removeActivation();\n        }\n    }\n\n    public outerBoundingBox(): {top: number, bottom: number, left: number, right: number} {\n        const bbox = super.outerBoundingBox();\n        if (this.activation != null) {\n            const nodeBbox = Draggable.nodeBoundingBox(this.activation.svgComponent.node());\n\n            bbox.top = Math.min(nodeBbox.top, bbox.top);\n            bbox.bottom = Math.max(nodeBbox.bottom, bbox.bottom);\n            bbox.left = Math.min(nodeBbox.left, bbox.left);\n            bbox.right = Math.max(nodeBbox.right, bbox.right);\n\n        }\n        return bbox;\n    }\n\n    public addActivation(activation: Activation): void {\n        if (this.activation != null && this.activation !== activation) {\n            this.activation.delete();\n        }\n        this.activation = activation;\n        this.activation.layer = this;\n        this.activation.setPosition(this.getPosition());\n        this.activation.draggedX = this.draggedX;\n        this.activation.draggedY = this.draggedY;\n    }\n\n    public getActivationText(): string {\n        return this.activation != null ? this.activation.activationType : null;\n    }\n\n    public removeActivation(): void {\n        this.activation = null;\n    }\n\n    public toJson(): ILayerJson {\n        const json = super.toJson();\n        if (this.activation != null) {\n            json.params.activation = this.activation.activationType;\n        }\n        return json;\n    }\n\n    public generateTfjsLayer(): void {\n        const parameters = this.parameterDefaults;\n        const config = this.getParams();\n        for (const param of Object.keys(config)) {\n            parameters[param] = config[param];\n        }\n        if (this.activation != null) {\n            parameters.activation = this.activation.activationType;\n        }\n\n        let parent: Layer = null;\n\n        if (this.parents.size > 1) {\n            displayError(new Error(\"Must use a concatenate when a layer has multiple parents\"));\n        }\n\n        for (const p of this.parents) { parent = p; break; }\n        // Concatenate layers handle fan-in\n\n        this.tfjsLayer = this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer());\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/draggable.ts",
    "content": "import * as d3 from \"d3\";\r\nimport { getSvgOriginalBoundingBox } from \"../utils\";\r\nimport { windowProperties } from \"../window\";\r\nimport { Point } from \"./shape\";\r\n\r\nexport abstract class Draggable {\r\n\r\n    protected static nodeBoundingBox(node: SVGGraphicsElement):\r\n            {top: number, bottom: number, left: number, right: number} {\r\n        const nodeBbox = node.getBBox();\r\n        return {bottom: nodeBbox.y + nodeBbox.height,\r\n                left: nodeBbox.x,\r\n                right: nodeBbox.x + nodeBbox.width,\r\n                top: nodeBbox.y};\r\n    }\r\n\r\n    public readonly wireGuidePresent: boolean = false;\r\n    public draggedX: number = null; // Use these to let draggables return to user dragged position after cropping\r\n    public draggedY: number = null;\r\n\r\n    public svgComponent: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n\r\n    protected moveTimeout: any;\r\n    protected hoverText: any = d3.select(\"body\")\r\n                                 .append(\"div\")\r\n                                 .style(\"position\", \"absolute\")\r\n                                 .style(\"font-weight\", \"bold\")\r\n                                 .style(\"padding\", \"6px\")\r\n                                 .style(\"background\", \"rgba(0, 0, 0, 0.8)\")\r\n                                 .style(\"color\", \"#eee\")\r\n                                 .style(\"border-radius\", \"2px\")\r\n                                 .style(\"display\", \"none\")\r\n                                 .style(\"font-family\", \"Helvetica\")\r\n                                 .style(\"user-select\", \"none\")\r\n                                 .text(this.getHoverText());\r\n\r\n    constructor(defaultLocation: Point = new Point(50, 100)) {\r\n        this.svgComponent = d3.select<SVGGraphicsElement, {}>(\"#svg\")\r\n                            .append<SVGGraphicsElement>(\"g\")\r\n                            .attr(\"transform\", \"translate(\" + defaultLocation.x + \",\" + defaultLocation.y + \")\")\r\n                            .on(\"click\", () => {\r\n                                this.select();\r\n                                window.clearTimeout(this.moveTimeout);\r\n                                this.hoverText.style(\"visibility\", \"hidden\");\r\n                                })\r\n                            .on(\"contextmenu\", () => {\r\n                                window.clearTimeout(this.moveTimeout);\r\n                                this.hoverText.style(\"visibility\", \"hidden\");\r\n                                })\r\n                            .on(\"mousemove\", () => {\r\n                                this.hoverText.style(\"visibility\", \"hidden\");\r\n                                clearTimeout(this.moveTimeout);\r\n                                this.moveTimeout = setTimeout(() => {\r\n                                    this.hoverText.style(\"display\", \"\");\r\n                                    this.hoverText.style(\"visibility\", \"visible\");\r\n                                }, 280);\r\n                                this.hoverText.style(\"top\", (d3.event.pageY - 40) + \"px\")\r\n                                              .style(\"left\", (d3.event.pageX - 30) + \"px\");\r\n                            })\r\n                            .on(\"mouseout\", () => {\r\n                                clearTimeout(this.moveTimeout);\r\n                                this.hoverText.style(\"visibility\", \"hidden\");\r\n                            });\r\n        this.makeDraggable();\r\n        this.draggedX = defaultLocation.x;\r\n        this.draggedY = defaultLocation.y;\r\n    }\r\n\r\n    public makeDraggable(): void {\r\n        let firstDrag = true;\r\n        // Fix the offset from the mouse by calculating the distance from the mouse\r\n        // to the center of the object upon mousedown\r\n        let mousePosRelativeToCenter: Point;\r\n        this.svgComponent.on(\"mousedown\", function(): void {\r\n            const coords = d3.mouse(this);\r\n            mousePosRelativeToCenter = new Point(coords[0], coords[1]);\r\n        });\r\n\r\n        const dragThings = () => {\r\n            clearTimeout(this.moveTimeout);\r\n            this.hoverText.style(\"visibility\", \"hidden\");\r\n            if (firstDrag) {\r\n                // Since touch drags don't activate the mousedown event,\r\n                // catch touch drags here, even though there might be a slight offset\r\n                if (mousePosRelativeToCenter == null) {\r\n                    const coords = d3.mouse(this.svgComponent.node());\r\n                    mousePosRelativeToCenter = new Point(coords[0], coords[1]);\r\n                }\r\n                // Perform on drag start here instead of using on(\"start\", ...)\r\n                // since d3 calls drag starts weirdly (on mousedown,\r\n                // instead of after actually dragging a little bit)\r\n                this.raise();\r\n                firstDrag = false;\r\n            }\r\n\r\n            this.draggedX = d3.event.x - mousePosRelativeToCenter.x;\r\n            this.draggedY = d3.event.y - mousePosRelativeToCenter.y;\r\n\r\n            this.setPosition(new Point(this.draggedX, this.draggedY));\r\n            this.cropPosition();\r\n            this.moveAction();\r\n            // Dragging seems to force mousemove event to be ignored. Since we\r\n            // use the mousemove event on the svg to move the wire guide, just do that\r\n            // here unless we find a way to not ignore the mousemove event.\r\n            windowProperties.wireGuide.moveToMouse();\r\n        };\r\n\r\n        const dragHandler = d3.drag().touchable(true).clickDistance(4)\r\n            .on(\"drag\", dragThings)\r\n            .on(\"end\", () => {firstDrag = true; mousePosRelativeToCenter = null; });\r\n\r\n        this.svgComponent.call(dragHandler);\r\n    }\r\n\r\n    // Special behavior when being dragged e.g. activations snap to Layers\r\n    public moveAction(): void { return; }\r\n\r\n    // Bring in front of the other UI elements\r\n    public raise(): void {\r\n        this.svgComponent.raise();\r\n    }\r\n\r\n    public raiseGroup(): void {\r\n        this.svgComponent.raise();\r\n    }\r\n\r\n    // The text to display when hovering over an object\r\n    public getHoverText(): string { return \"\"; }\r\n\r\n    public select(): void {\r\n        if (windowProperties.selectedElement != null) {\r\n            if (windowProperties.selectedElement === this) {\r\n                return;\r\n            }\r\n            windowProperties.selectedElement.unselect();\r\n        }\r\n        windowProperties.selectedElement = this;\r\n        this.raise();\r\n        this.svgComponent.selectAll(\"rect\").style(\"stroke\", \"yellow\").style(\"stroke-width\", \"2\");\r\n        if (this.wireGuidePresent) {\r\n            windowProperties.wireGuide.moveToMouse();\r\n            windowProperties.wireGuide.show();\r\n        }\r\n    }\r\n\r\n    public unselect(): void {\r\n        if (windowProperties.selectedElement === this) {\r\n            windowProperties.selectedElement = null;\r\n            windowProperties.wireGuide.hide();\r\n        }\r\n        this.svgComponent.selectAll(\"rect\").style(\"stroke\", null).style(\"stroke-width\", null);\r\n    }\r\n\r\n    public delete(): void {\r\n        this.unselect();\r\n        this.svgComponent.remove();\r\n        this.hoverText.remove();\r\n    }\r\n\r\n    public center(): Point {\r\n        const bbox = this.svgComponent.node().getBBox();\r\n        return new Point(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2);\r\n    }\r\n\r\n    public outerBoundingBox(): {top: number, bottom: number, left: number, right: number} {\r\n        const bbox = Draggable.nodeBoundingBox(this.svgComponent.nodes()[0]);\r\n\r\n        for (const node of this.svgComponent.nodes().slice(1)) {\r\n            const nodeBbox = Draggable.nodeBoundingBox(node);\r\n\r\n            bbox.top = Math.min(nodeBbox.top, bbox.top);\r\n            bbox.bottom = Math.max(nodeBbox.bottom, bbox.bottom);\r\n            bbox.left = Math.min(nodeBbox.left, bbox.left);\r\n            bbox.right = Math.max(nodeBbox.right, nodeBbox.right);\r\n        }\r\n        return bbox;\r\n    }\r\n\r\n    public getPosition(): Point {\r\n        const transformation = this.svgComponent.attr(\"transform\");\r\n        const numArr = transformation.substring(\r\n                transformation.indexOf(\"(\") + 1 , transformation.indexOf(\")\") )\r\n            .split(\",\").map((value) => Number(value));\r\n        return new Point(numArr[0], numArr[1]);\r\n    }\r\n\r\n    public cropPosition(): void {\r\n        const canvasBoundingBox = getSvgOriginalBoundingBox( document.getElementById(\"svg\") as any as SVGSVGElement);\r\n        const componentBBox  = this.outerBoundingBox();\r\n\r\n        const bottomBoundary = (canvasBoundingBox.height - componentBBox.bottom) - windowProperties.svgYOffset;\r\n\r\n        this.setPosition(new Point( Math.min(\r\n                                        Math.max(-componentBBox.left, this.draggedX),\r\n                                        canvasBoundingBox.width - componentBBox.right),\r\n                                    Math.min(\r\n                                        Math.max(-componentBBox.top + windowProperties.svgYOffset, this.draggedY),\r\n                                        bottomBoundary)));\r\n    }\r\n\r\n    public setPosition(position: Point): void {\r\n        this.svgComponent.attr(\"transform\", \"translate(\" + position.x + \",\" + position.y + \")\");\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/layer.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\r\nimport * as d3 from \"d3\";\r\nimport { generateTfjsModel, topologicalSort } from \"../../model/build_network\";\r\nimport { changeDataset } from \"../../model/data\";\r\nimport { svgData } from \"../app\";\r\nimport { displayError } from \"../error\";\r\nimport { parseString } from \"../utils\";\r\nimport { windowProperties } from \"../window\";\r\nimport { Draggable } from \"./draggable\";\r\nimport { Point, Shape } from \"./shape\";\r\nimport { Wire } from \"./wire\";\r\n\r\nexport interface ILayerJson {\r\n    layer_name: string;\r\n    id: number;\r\n    children_ids: number[];\r\n    parent_ids: number[];\r\n    params: any;\r\n    xPosition: number;\r\n    yPosition: number;\r\n}\r\n\r\n// TODO params for entering things in UI for layer properties\r\n\r\nexport abstract class Layer extends Draggable {\r\n\r\n    public static getNextID(): number {\r\n        const id = Layer.nextID;\r\n        Layer.nextID += 1;\r\n        return id;\r\n    }\r\n\r\n    private static nextID: number = 0;   // a global id counter for labeling layers\r\n    public layerType: string = \"\";  // A string indicating layer type for each layer used for serialization\r\n    public parameterDefaults: { [key: string]: any };  // tfjs keys for layer parameters to input values\r\n    public children: Set<Layer> = new Set();  // Predecessors (closer to the input layer)\r\n    public parents: Set<Layer> = new Set();  // Successors (closer to the output layer)\r\n    public wires: Set<Wire> = new Set();  // The line objects connecting this layer to other layers\r\n    public uid: number;  // Each layer gets a unique ID\r\n    public shape: number[];  // The shape/dimensions of the layer.\r\n\r\n    public readonly outputWiresAllowed: boolean = true;\r\n    public readonly wireGuidePresent: boolean = true;\r\n    protected tfjsLayer: tf.SymbolicTensor;\r\n\r\n    protected readonly tfjsEmptyLayer: any;\r\n    protected paramBox: HTMLElement;\r\n    private selectText: any = d3.select(\"body\")\r\n                        .append(\"div\")\r\n                        .style(\"position\", \"absolute\")\r\n                        .style(\"padding\", \"6px\")\r\n                        .style(\"background\", \"rgba(0, 0, 0, 0.8)\")\r\n                        .style(\"color\", \"#eee\")\r\n                        .style(\"border-radius\", \"2px\")\r\n                        .style(\"display\", \"none\")\r\n                        .style(\"font-family\", \"Helvetica\")\r\n                        .style(\"user-select\", \"none\");\r\n\r\n    private block: Shape[];\r\n\r\n    constructor(block: Shape[], defaultLocation: Point) {\r\n        super(defaultLocation);\r\n        this.uid = Layer.nextID;\r\n        Layer.nextID += 1;\r\n        this.block = block;\r\n\r\n        for (const rect of this.block) {\r\n            this.svgComponent.call(rect.svgAppender.bind(rect));\r\n        }\r\n\r\n        this.paramBox = document.createElement(\"div\");\r\n        this.paramBox.className = \"parambox\";\r\n        this.paramBox.style.visibility = \"hidden\";\r\n        this.paramBox.style.position = \"absolute\";\r\n        document.getElementById(\"paramtruck\").appendChild(this.paramBox);\r\n\r\n        this.svgComponent.on(\"click\", () => {\r\n                             this.select();\r\n                             window.clearTimeout(this.moveTimeout);\r\n                             this.hoverText.style(\"visibility\", \"hidden\");\r\n                        });\r\n        this.populateParamBox();\r\n    }\r\n    public abstract lineOfPython(): string;\r\n    public abstract getHoverText(): string;\r\n    public abstract clone(): Layer;\r\n\r\n    public moveAction(): void {\r\n        for (const wire of this.wires) {\r\n            wire.updatePosition();\r\n        }\r\n\r\n        if (windowProperties.selectedElement === this) {\r\n            windowProperties.shapeTextBox.setPosition(this.getPosition());\r\n        }\r\n    }\r\n\r\n    public raise(): void {\r\n        this.wires.forEach((w) => w.raiseGroup());\r\n        this.parents.forEach((p) => p.raiseGroup());\r\n        this.children.forEach((c) => c.raiseGroup());\r\n        this.raiseGroup();\r\n    }\r\n\r\n    public select(): void {\r\n        const currSelected = windowProperties.selectedElement;\r\n        if (currSelected != null && currSelected !== this &&\r\n                currSelected instanceof Layer && currSelected.outputWiresAllowed) {\r\n            currSelected.addChild(this);\r\n        }\r\n        super.select();\r\n        document.getElementById(\"defaultparambox\").style.display = \"none\";\r\n        this.paramBox.style.visibility = \"visible\";\r\n        this.svgComponent.selectAll(\"path\").style(\"stroke\", \"yellow\").style(\"stroke-width\", \"2\");\r\n        this.svgComponent.selectAll(\".outerShape\").style(\"stroke\", \"yellow\").style(\"stroke-width\", \"2\");\r\n\r\n        const bbox = this.outerBoundingBox();\r\n        windowProperties.shapeTextBox.setOffset(new Point((bbox.left + bbox.right) / 2, bbox.bottom + 25));\r\n        windowProperties.shapeTextBox.setText(\"[\" + this.layerShape().toString() + \"]\");\r\n        windowProperties.shapeTextBox.setPosition(this.getPosition());\r\n        windowProperties.shapeTextBox.show();\r\n    }\r\n\r\n    public unselect(): void {\r\n        super.unselect();\r\n        document.getElementById(\"defaultparambox\").style.display = null;\r\n        this.paramBox.style.visibility = \"hidden\";\r\n        this.svgComponent.selectAll(\"path\").style(\"stroke\", null).style(\"stroke-width\", null);\r\n        this.svgComponent.selectAll(\".outerShape\").style(\"stroke\", null).style(\"stroke-width\", null);\r\n        this.selectText.style(\"visibility\", \"hidden\");\r\n        windowProperties.shapeTextBox.hide();\r\n\r\n    }\r\n\r\n    /**\r\n     * Add a child layer of this node (successor).\r\n     * @param child the layer pointed to by the given wire\r\n     */\r\n    public addChild(child: Layer): void {\r\n        if (!this.children.has(child) && !child.children.has(this)) {\r\n            this.children.add(child);\r\n            child.parents.add(this);\r\n\r\n            const newWire = new Wire(this, child);\r\n            this.wires.add(newWire);\r\n            child.wires.add(newWire);\r\n\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Add a parent layer of this node (predecessor).\r\n     * @param parent the layer pointed to by the given wire\r\n     */\r\n    public addParent(parent: Layer): void {\r\n        parent.addChild(this);\r\n    }\r\n\r\n    public delete(): void {\r\n        super.delete();\r\n        this.wires.forEach((w) => w.delete()); // deleting wires should delete layer connection sets\r\n    }\r\n\r\n    public toJson(): ILayerJson {\r\n        return {\r\n            children_ids: Array.from(this.children, (child) => child.uid),\r\n            id: this.uid,\r\n            layer_name: this.layerType,\r\n            params: this.getJSONParams(),\r\n            parent_ids: Array.from(this.parents, (parent) => parent.uid),\r\n            xPosition: this.getPosition().x,\r\n            yPosition: this.getPosition().y,\r\n        };\r\n    }\r\n\r\n    public getJSONParams(): { [key: string]: any } {\r\n        const params: { [key: string]: any } = {};\r\n        const defaultParams = this.parameterDefaults;\r\n        for (const line of this.paramBox.children) {\r\n            const name = line.children[0].getAttribute(\"data-name\");\r\n            if (line.children[1].className === \"select\") {\r\n                const selectElement: HTMLSelectElement =  line.children[1].children[0] as HTMLSelectElement;\r\n                params[name] = selectElement.options[selectElement.selectedIndex].value;\r\n            } else {\r\n                const value = ( line.children[1] as HTMLInputElement).value;\r\n                // Need to not parse as integer for float parameters\r\n                if ((defaultParams[name].toString()).indexOf(\".\") >= 0) {\r\n                    params[name] = parseFloat(value);\r\n                } else {\r\n                    params[name] = parseString(value);\r\n                }\r\n            }\r\n        }\r\n        return params;\r\n    }\r\n\r\n    public getParams(): { [key: string]: any; } {\r\n        const params: { [key: string]: any } = {};\r\n        const defaultParams = this.parameterDefaults;\r\n        for (const line of this.paramBox.children) {\r\n            const name = line.children[0].getAttribute(\"data-name\");\r\n            if (line.children[1].className === \"select\") {\r\n                const selectElement: HTMLSelectElement =  line.children[1].children[0] as HTMLSelectElement;\r\n                params[name] = selectElement.options[selectElement.selectedIndex].value;\r\n            } else {\r\n                const value = ( line.children[1] as HTMLInputElement).value;\r\n                // Need to not parse as integer for float parameters\r\n                if ((defaultParams[name].toString()).indexOf(\".\") >= 0) {\r\n                    params[name] = parseFloat(value);\r\n                } else {\r\n                    params[name] = parseString(value);\r\n                }\r\n            }\r\n        }\r\n        return params;\r\n    }\r\n\r\n    public setParams(params: Map<string, any>): void {\r\n        for (const line of this.paramBox.children) {\r\n            const name = line.children[0].getAttribute(\"data-name\");\r\n            if (line.children[1].className === \"select\") {\r\n                const selectElement: HTMLSelectElement =  line.children[1].children[0] as HTMLSelectElement;\r\n                // Get index with the correct value and select it\r\n                for (let i = 0; i < selectElement.options.length; i++) {\r\n                    if (selectElement.options.item(i).value === params.get(name)) {\r\n                        selectElement.selectedIndex = i;\r\n                        break;\r\n                    }\r\n                }\r\n            } else {\r\n                ( line.children[1] as HTMLInputElement).value = params.get(name);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Make parent -> this become parent -> layer -> this.\r\n     * @param layer a layer that will become the new parent\r\n     * @param parent a parent of this\r\n     */\r\n    public addParentLayerBetween(layer: Layer, parent: Layer): void {\r\n        parent.children.delete(this);\r\n        parent.children.add(layer);\r\n\r\n        layer.parents.add(parent);\r\n        layer.children.add(this);\r\n\r\n        this.parents.delete(parent);\r\n        this.parents.add(layer);\r\n    }\r\n\r\n    /**\r\n     * Make parents -> this become parents -> layer -> this.\r\n     * @param parent a parent of this\r\n     */\r\n    public addParentLayer(layer: Layer): void {\r\n        for (const parent of this.parents) {\r\n            parent.children.delete(this);\r\n            parent.children.add(layer);\r\n        }\r\n\r\n        layer.parents = new Set([...layer.parents, ...this.parents]);\r\n        layer.children.add(this);\r\n\r\n        this.parents.clear();\r\n        this.parents.add(layer);\r\n    }\r\n\r\n    /**\r\n     * Make new child -> this become this -> newChild -> old children.\r\n     * @param newChild a new child of this\r\n     */\r\n    public addChildLayerBetween(newChild: Layer): void {\r\n        for (const child of this.children) {\r\n            newChild.addChild(child);\r\n            child.parents.delete(this);\r\n        }\r\n        this.children.clear();\r\n        this.addChild(newChild);\r\n        newChild.addParent(this);\r\n    }\r\n\r\n    public getTfjsLayer(): tf.SymbolicTensor {\r\n        return this.tfjsLayer;\r\n    }\r\n\r\n    public generateTfjsLayer(): void {\r\n        // TODO change defaults to class level\r\n        const parameters = this.getParams();\r\n\r\n        let parent: Layer = null;\r\n        for (const p of this.parents) { parent = p; break; }\r\n        // Concatenate layers handle fan-in\r\n\r\n        if (this.parents.size > 1) {\r\n            displayError(new Error(\"Must use a concatenate when a layer has multiple parents\"));\r\n        }\r\n\r\n        this.tfjsLayer = this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer());\r\n    }\r\n\r\n    public layerShape(): number[] {\r\n        // Computes all of the predecessors to determine shape\r\n        if (this.layerType === \"Input\") {\r\n            changeDataset(svgData.input.getParams().dataset);\r\n        }\r\n        try {\r\n            generateTfjsModel(topologicalSort(svgData.input, false));\r\n            return this.getTfjsLayer().shape;\r\n        } catch (err) {  // Hide errors while building the network\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public initLineOfJulia(): string {\r\n        return \"\";\r\n    }\r\n\r\n    public lineOfJulia(): string {\r\n        let connections = \"\";\r\n        for (const child of this.children) {\r\n            connections += `connect!(net, x${this.uid}, x${child.uid})\\n`;\r\n        }\r\n        return connections;\r\n    }\r\n\r\n    public hasParentType(type: any ): boolean {\r\n        for (const p of this.parents) {\r\n            if (p instanceof type) {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    protected abstract populateParamBox(): void;\r\n\r\n    protected focusing(): void {\r\n        for (const line of this.paramBox.children) {\r\n            ( line.children[1] as HTMLInputElement).onfocus = this.toggleFocus.bind(line.children[1]);\r\n            ( line.children[1] as HTMLInputElement).onblur = this.toggleFocus.bind(line.children[1]);\r\n        }\r\n    }\r\n\r\n    private toggleFocus(textField: any): void {\r\n        textField.target.classList.toggle(\"focusParam\");\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/layers/add.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\r\nimport { displayError } from \"../../error\";\r\nimport { ActivationLayer } from \"../activationlayer\";\r\nimport { Line, PathShape, Point } from \"../shape\";\r\n\r\nexport class Add extends ActivationLayer {\r\n    public layerType: string = \"Add\";\r\n    public parameterDefaults: { [key: string]: any }  = {};\r\n    public readonly tfjsEmptyLayer: any = tf.layers.add;\r\n\r\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\r\n        super([new PathShape(\"m10,10 v-10 h-10 v10 a30,30 0 1,1 10,0Z\", \"#73A665\"),\r\n               new Line(new Point(-10, -20), new Point(20, -20), 5, \"#040\"),\r\n               new Line(new Point(5, -35), new Point(5, -5), 5, \"#040\")], defaultLocation);\r\n        // Path for Layer plus: m15,10 h-5 v-10 h-10 v10 h-5 v-20 h-20 v-20 h20 v-20 h20 v20 h20 v20 h-20 v20Z\r\n\r\n    }\r\n\r\n    public populateParamBox(): void { return; }\r\n\r\n    public getHoverText(): string { return \"Add\"; }\r\n\r\n    public lineOfPython(): string {\r\n        return `Add()`;\r\n    }\r\n\r\n    public initLineOfJulia(): string {\r\n        displayError(Error(\"Export to Julia does not support Add Layers\"));\r\n        throw Error;\r\n    }\r\n\r\n    public generateTfjsLayer(): void {\r\n        // Concatenate layers handle fan-in\r\n        const parents = [];\r\n        for (const parent of this.parents) {\r\n            parents.push(parent.getTfjsLayer());\r\n        }\r\n        this.tfjsLayer = this.tfjsEmptyLayer().apply(parents) as tf.SymbolicTensor;\r\n    }\r\n\r\n    public clone(): Add {\r\n        const newLayer = new Add();\r\n        return newLayer;\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/layers/batchnorm.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { SymbolicTensor } from \"@tensorflow/tfjs\";\nimport { displayError } from \"../../error\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { PathShape, Point } from \"../shape\";\n\nexport class BatchNorm extends ActivationLayer {\n\n    public static readonly blockSize: number = 50;\n    public layerType: string = \"BatchNorm\";\n    public parameterDefaults: { [key: string]: any } = {momentum: 0.99};\n    protected tfjsEmptyLayer: any  = tf.layers.batchNormalization;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new PathShape(\"M-10 -90 L 20 -60 v70 h-10 v-10 h-10 v10 h-10 v-100 Z\", \"#CFB53B\")],\n               defaultLocation);\n    }\n\n    public populateParamBox(): void {\n        const line1 = document.createElement(\"div\");\n        line1.className = \"paramline\";\n\n        const name1 = document.createElement(\"div\");\n        name1.className = \"paramname\";\n        name1.innerHTML = \"Momentum:\";\n        name1.setAttribute(\"data-name\", \"momentum\");\n\n        const value1 = document.createElement(\"input\");\n        value1.className = \"paramvalue layerparamvalue\";\n        value1.value = \"0.99\";\n\n        line1.appendChild(name1);\n        line1.appendChild(value1);\n\n        this.paramBox.append(line1);\n\n        this.focusing();\n    }\n\n    public getHoverText(): string { return \"BatchNorm\"; }\n\n    public lineOfPython(): string {\n        const params = this.getParams();\n        return `BatchNormalization(momentum=${params.momentum})`;\n    }\n\n    public initLineOfJulia(): string {\n        // displayError(new Error('Batch Normalization is not yet supported for Julia.'));\n        const params = this.getParams();\n        const activation = this.getActivationText();\n        const activationText = activation == null ? \"\" : `, ${activation}`;\n        return `x${this.uid} = insert!(net, (shape) -> BatchNorm(shape[3]${activationText},` +\n                `momentum=Float32(${params.momentum})))\\n`;\n    }\n\n    public clone(): BatchNorm {\n        const newBN: BatchNorm = new BatchNorm(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation));\n        newBN.activation = this.activation;\n        newBN.paramBox = this.paramBox;\n\n        return newBN;\n\n    }\n\n    public generateTfjsLayer(): void {\n        const parameters: { [key: string]: any } = {momentum: 0.99};\n        const config = this.getParams();\n        for (const param of Object.keys(config)) {\n            parameters[param] = config[param];\n        }\n\n        let parent: Layer = null;\n        for (const p of this.parents) { parent = p; break; }\n        // Concatenate layers handle fan-in\n        this.tfjsLayer =  this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer()) as SymbolicTensor;\n\n        if (this.activation != null) {\n\n            if (this.activation.activationType !== \"relu\") {\n                displayError(new Error(\"Batch Normalization does not support activations other than ReLu\"));\n            }\n            this.tfjsLayer =  tf.layers.reLU().apply(this.tfjsLayer) as SymbolicTensor;\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/concatenate.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { PathShape, Point } from \"../shape\";\n\nexport class Concatenate extends Layer {\n    public layerType: string = \"Concatenate\";\n    public parameterDefaults: { [key: string]: any } = {};\n    public readonly tfjsEmptyLayer: any = tf.layers.concatenate;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new PathShape(\"M-23 -120 h23 v120 h-23 v-120 Z\", \"#F27493\"),\n               new PathShape(\"M-23 -81 h23 v2 h-23 v-2  Z\", \"rgba(20, 20, 20, 0.3)\"),\n               new PathShape(\"M-23 -41 h23 v2 h-23 v-2  Z\", \"rgba(20, 20, 20, 0.3)\")], defaultLocation);\n    }\n\n    public populateParamBox(): void {return; }\n\n    public getHoverText(): string { return \"Concatenate\"; }\n\n    public lineOfPython(): string {\n        return `Concatenate()`;\n    }\n\n    public initLineOfJulia(): string {\n        return `x${this.uid}  = insert!(net, (x) -> vcat(x...))\\n`;\n    }\n\n    public generateTfjsLayer(): void {\n        // Concatenate layers handle fan-in\n        const parents = [];\n        for (const parent of this.parents) {\n            parents.push(parent.getTfjsLayer());\n        }\n        this.tfjsLayer = this.tfjsEmptyLayer().apply(parents) as tf.SymbolicTensor;\n    }\n\n    public clone(): Concatenate {\n        const newLayer = new Concatenate();\n        // newLayer.paramBox = this.paramBox\n\n        return newLayer;\n\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/convolutional.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { PathShape, Point, Rectangle } from \"../shape\";\n\nexport class Conv2D extends ActivationLayer {\n    public static readonly blockSize: number = 50;\n    public layerType: string = \"Conv2D\";\n    public parameterDefaults: { [key: string]: any } = {\n        filters: 16,\n        kernelRegularizer: \"none\",\n        kernelSize: [3, 3],\n        padding: \"same\",\n        regScale: 0.1,\n        strides: [1, 1],\n    };\n    protected tfjsEmptyLayer: any = tf.layers.conv2d;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new Rectangle(new Point(-54, -80), Conv2D.blockSize, Conv2D.blockSize, \"#3B6B88\"),\n               new Rectangle(new Point(-37, -60), Conv2D.blockSize, Conv2D.blockSize, \"#3B7B88\"),\n               new PathShape(\"M-20 -40 h50 v50 h-20 v-10 h-10 v10 h-20 v-50 Z\", \"#3B8B88\")],\n               defaultLocation);\n    }\n\n    public populateParamBox(): void {\n        const line1 = document.createElement(\"div\");\n        line1.className = \"paramline\";\n\n        const name1 = document.createElement(\"div\");\n        name1.className = \"paramname\";\n        name1.innerHTML = \"Filters:\";\n        name1.setAttribute(\"data-name\", \"filters\");\n\n        const value1 = document.createElement(\"input\");\n        value1.className = \"paramvalue layerparamvalue\";\n        value1.value = \"16\";\n\n        line1.appendChild(name1);\n        line1.appendChild(value1);\n\n        this.paramBox.append(line1);\n\n        const line2 = document.createElement(\"div\");\n        line2.className = \"paramline\";\n        const name2 = document.createElement(\"div\");\n        name2.className = \"paramname\";\n        name2.innerHTML = \"Kernel size:\";\n        name2.setAttribute(\"data-name\", \"kernelSize\");\n        const value2 = document.createElement(\"input\");\n        value2.className = \"paramvalue layerparamvalue\";\n        value2.value = \"3, 3\";\n        line2.appendChild(name2);\n        line2.appendChild(value2);\n        this.paramBox.append(line2);\n\n        const line3 = document.createElement(\"div\");\n        line3.className = \"paramline\";\n        const name3 = document.createElement(\"div\");\n        name3.className = \"paramname\";\n        name3.innerHTML = \"Stride:\";\n        name3.setAttribute(\"data-name\", \"strides\");\n        const value3 = document.createElement(\"input\");\n        value3.className = \"paramvalue layerparamvalue\";\n        value3.value = \"1, 1\";\n        line3.appendChild(name3);\n        line3.appendChild(value3);\n        this.paramBox.append(line3);\n\n        // Dataset input box\n        // TODO: separate this logic out.\n        const line4 = document.createElement(\"div\");\n        line4.className = \"paramline selectline\";\n\n        const name4 = document.createElement(\"div\");\n        name4.className = \"paramname\";\n        name4.innerHTML = \"Norm:\";\n        name4.setAttribute(\"data-name\", \"kernelRegularizer\");\n\n        const selectDiv = document.createElement(\"div\");\n        selectDiv.className = \"select\";\n\n        const arrow = document.createElement(\"div\");\n        arrow.className = \"select__arrow\";\n\n        const select = document.createElement(\"select\");\n        select.className = \"parameter-select\";\n\n        for (const value of [[\"none\", \"None\"], [\"l1\", \"L1\"], [\"l2\", \"L2\"]]) {\n            const option = document.createElement(\"option\");\n            option.value = value[0];\n            option.innerHTML = value[1];\n            select.appendChild(option);\n        }\n\n        line4.appendChild(name4);\n        line4.appendChild(selectDiv);\n        selectDiv.appendChild(select);\n        selectDiv.appendChild(arrow);\n        this.paramBox.append(line4);\n\n        const line5 = document.createElement(\"div\");\n        line5.className = \"paramline\";\n        const name5 = document.createElement(\"div\");\n        name5.className = \"paramname\";\n        name5.innerHTML = \"Scale:\";\n        name5.setAttribute(\"data-name\", \"regScale\");\n        const value5 = document.createElement(\"input\");\n        value5.className = \"paramvalue layerparamvalue\";\n        value5.value = \"0.1\";\n        line5.appendChild(name5);\n        line5.appendChild(value5);\n        this.paramBox.append(line5);\n        line5.classList.add(\"hidden_div\");\n        select.addEventListener(\"change\", () => {\n            if (select.value !== \"none\" && line5.classList.contains(\"hidden_div\")) {\n                line5.classList.toggle(\"hidden_div\");\n            }\n\n            if (select.value === \"none\" && !line5.classList.contains(\"hidden_div\")) {\n                line5.classList.add(\"hidden_div\");\n            }\n        });\n        this.focusing();\n\n    }\n\n    public getHoverText(): string { return \"Conv\"; }\n\n    public lineOfPython(): string {\n        const params = this.getParams();\n        const activation = this.getActivationText();\n        const activationText = activation == null ? \"\" : `, activation='${activation}'`;\n        return `Conv2D(${params.filters}, (${params.kernelSize}),` +\n            `strides=(${params.strides})${activationText}, padding='same')`;\n    }\n\n    public initLineOfJulia(): string {\n        const params = this.getParams();\n        const activation = this.getActivationText();\n        const activationText = activation == null ? \"\" : `, ${activation}`;\n        return `x${this.uid} = insert!(net, (shape) -> Conv((${params.kernelSize}),` +\n            `shape[3] =>${params.filters}${activationText}, stride=(${params.strides})))\\n`;\n    }\n\n    public clone(): Conv2D {\n        const newConv: Conv2D = new Conv2D(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation));\n        newConv.activation = this.activation;\n        newConv.paramBox = this.paramBox;\n\n        return newConv;\n\n    }\n\n    public getParams(): { [key: string]: any } {\n        const parameters = super.getParams();\n        const scale = parameters.regScale;\n        delete parameters.regScale;\n        switch (parameters.kernelRegularizer) {\n            case \"none\":\n                delete parameters.kernelRegularizer;\n            case \"l1\":\n                parameters.kernelRegularizer = tf.regularizers.l1({l1: scale});\n            case \"l2\":\n                parameters.kernelRegularizer = tf.regularizers.l2({l2: scale});\n        }\n        return parameters;\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/dense.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { PathShape, Point } from \"../shape\";\n\nexport class Dense extends ActivationLayer {\n    public layerType: string = \"Dense\";\n    public parameterDefaults: { [key: string]: any } = {units: 32};\n    public readonly tfjsEmptyLayer: any = tf.layers.dense;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new PathShape(\"M-8 -90 h26 v100 h-8 v-10 h-10 v10 h-8 v-100 Z\", \"#F7473B\")], defaultLocation);\n    }\n\n    public populateParamBox(): void {\n        const line = document.createElement(\"div\");\n        line.className = \"paramline\";\n        const name = document.createElement(\"div\");\n        name.className = \"paramname\";\n        name.innerHTML = \"Units:\";\n        name.setAttribute(\"data-name\", \"units\");\n        const value = document.createElement(\"input\");\n        value.className = \"paramvalue layerparamvalue\";\n        value.value = \"32\";\n        line.appendChild(name);\n        line.appendChild(value);\n        this.paramBox.append(line);\n        this.focusing();\n    }\n\n    public getHoverText(): string { return \"Dense\"; }\n\n    public lineOfPython(): string {\n        const params = this.getParams();\n        const activation = this.getActivationText();\n        const activationText = activation == null ? \"\" : `, activation='${activation}'`;\n        return `Dense(${params.units}${activationText})`;\n    }\n\n    public initLineOfJulia(): string {\n        const params = this.getParams();\n        const activation = this.getActivationText();\n        const activationText = activation == null ? \"\" : `, ${activation}`;\n        return `x${this.uid} = insert!(net, (shape) -> Dense(shape[1], ${params.units}${activationText}))\\n`;\n    }\n\n    public clone(): Dense {\n        const newLayer = new Dense(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation));\n        newLayer.paramBox = this.paramBox;\n        newLayer.activation = this.activation;\n        return newLayer;\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/dropout.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { PathShape, Point } from \"../shape\";\n\nexport class Dropout extends Layer {\n    public layerType: string = \"Dropout\";\n    public parameterDefaults: { [key: string]: any } = {rate: 0.5};\n    public readonly tfjsEmptyLayer: any = tf.layers.dropout;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new PathShape(\"M0 0 h60 v60 h-60 v-60 Z\", \"#99BCE0\"),\n               new PathShape(\"M18 0 h4 v60 h-4 v-60 Z\", \"rgba(20, 20, 20, 0.2)\"),\n               new PathShape(\"M38 0 h4 v60 h-4 v-60 Z\", \"rgba(20, 20, 20, 0.2)\"),\n               new PathShape(\"M0 18 v4 h60 v-4 h-60 Z\", \"rgba(20, 20, 20, 0.2)\"),\n               new PathShape(\"M0 38 v4 h60 v-4 h-60 Z\", \"rgba(20, 20, 20, 0.2)\")], defaultLocation);\n    }\n\n    public populateParamBox(): void {\n\n        const line = document.createElement(\"div\");\n        line.className = \"paramline\";\n        const name = document.createElement(\"div\");\n        name.className = \"paramname\";\n        name.innerHTML = \"Rate:\";\n        name.setAttribute(\"data-name\", \"rate\");\n        const value = document.createElement(\"input\");\n        value.className = \"paramvalue layerparamvalue\";\n        value.value = \"0.5\";\n        line.appendChild(name);\n        line.appendChild(value);\n        this.paramBox.append(line);\n        this.focusing();\n    }\n\n    public getHoverText(): string { return \"Dropout\"; }\n\n    public lineOfPython(): string {\n        const params = this.getParams();\n\n        return `Dropout(rate=${params.rate})`;\n    }\n\n    public initLineOfJulia(): string {\n        const params = this.getParams();\n        return `x${this.uid} = insert!(net, (shape) -> Dropout(${params.rate}))\\n`;\n    }\n\n    public clone(): Dropout {\n        const newLayer = new Dropout();\n        newLayer.paramBox = this.paramBox;\n\n        return newLayer;\n\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/flatten.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { PathShape, Point } from \"../shape\";\n\nexport class Flatten extends Layer {\n    public layerType: string = \"Flatten\";\n    public parameterDefaults: { [key: string]: any } = {};\n    public readonly tfjsEmptyLayer: any  = tf.layers.flatten;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new PathShape(\"M-90 -90 h15 v-30 h15 v100 h-15 v-30 h-15 v-40 Z\", \"#AA222F\")], defaultLocation);\n    }\n\n    public populateParamBox(): void {return; }\n\n    public getHoverText(): string { return \"Flatten\"; }\n\n    public lineOfPython(): string {\n        return `Flatten()`;\n    }\n\n    public initLineOfJulia(): string {\n        return `x${this.uid} = insert!(net, (shape) -> (x) -> reshape(x, :, size(x, 4)))\\n`;\n    }\n\n    public clone(): Flatten {\n        return new Flatten();\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/input.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { dataset } from \"../../../model/data\";\nimport { getSvgOriginalBoundingBox } from \"../../utils\";\nimport { Layer } from \"../layer\";\nimport { Point, Rectangle } from \"../shape\";\n\nexport class Input extends Layer {\n    public layerType: string = \"Input\";\n    public parameterDefaults: { [key: string]: any } = {};\n    public readonly tfjsEmptyLayer: any = tf.input;\n\n    public defaultLocation: Point = new Point(100,\n        getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).height / 2);\n\n    constructor() {\n        super([new Rectangle(new Point(0, 0), 40, 40, \"#806CB7\")],\n              new Point(100,\n                getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).height / 2));\n    }\n\n    public getHoverText(): string { return \"Input\"; }\n\n    public delete(): void { this.unselect(); }\n\n    public populateParamBox(): void {\n        // Dataset input box\n        // TODO: separate this logic out.\n        const line = document.createElement(\"div\");\n        line.className = \"paramline selectline\";\n\n        const name = document.createElement(\"div\");\n        name.className = \"paramname\";\n        name.innerHTML = \"Dataset:\";\n        name.setAttribute(\"data-name\", \"dataset\");\n\n        const selectDiv = document.createElement(\"div\");\n        selectDiv.className = \"select\";\n\n        const arrow = document.createElement(\"div\");\n        arrow.className = \"select__arrow\";\n\n        const select = document.createElement(\"select\");\n        select.className = \"parameter-select\";\n\n        for (const value of [[\"mnist\", \"MNIST\"], [\"cifar\", \"Cifar-10\"]]) {\n            const option = document.createElement(\"option\");\n            option.value = value[0];\n            option.innerHTML = value[1];\n            select.appendChild(option);\n        }\n\n        line.appendChild(name);\n        line.appendChild(selectDiv);\n        selectDiv.appendChild(select);\n        selectDiv.appendChild(arrow);\n        this.paramBox.append(line);\n        this.focusing();\n    }\n\n    public generateTfjsLayer(): void {\n        // TODO make this a member variable\n        this.tfjsLayer = this.tfjsEmptyLayer({shape: [\n            dataset.IMAGE_HEIGHT,\n            dataset.IMAGE_WIDTH,\n            dataset.IMAGE_CHANNELS]});\n    }\n\n    public lineOfPython(): string {\n        // Relies on an input_shape being defined in the python skeleton\n        return `Input(shape=input_shape)`;\n    }\n\n    public initLineOfJulia(): string {\n        return `x${this.uid} = insert!(net, (shape) -> x -> x)\\n`;\n    }\n\n    public clone(): Input {\n        const newLayer = new Input();\n        return newLayer;\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/maxpooling.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { Point, Rectangle } from \"../shape\";\n\nexport class MaxPooling2D extends Layer {\n    public static readonly blockSize: number = 30;\n    public layerType: string = \"MaxPooling2D\";\n    public parameterDefaults: { [key: string]: any } = {poolSize: [2, 2], strides: [2, 2]};\n    public readonly tfjsEmptyLayer: any = tf.layers.maxPool2d;\n\n    constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) {\n        super([new Rectangle(new Point(-44, -60), MaxPooling2D.blockSize, MaxPooling2D.blockSize, \"#F76034\"),\n               new Rectangle(new Point(-27, -40), MaxPooling2D.blockSize, MaxPooling2D.blockSize, \"#F77134\"),\n               new Rectangle(new Point(-10, -20), MaxPooling2D.blockSize, MaxPooling2D.blockSize, \"#F78234\")],\n               defaultLocation);\n    }\n\n    public populateParamBox(): void {\n        const line = document.createElement(\"div\");\n        line.className = \"paramline\";\n        const name = document.createElement(\"div\");\n        name.className = \"paramname\";\n        name.innerHTML = \"Pool size:\";\n        name.setAttribute(\"data-name\", \"poolSize\");\n        const value = document.createElement(\"input\");\n        value.className = \"paramvalue layerparamvalue\";\n        value.value = \"2, 2\";\n        line.appendChild(name);\n        line.appendChild(value);\n        this.paramBox.append(line);\n\n        const line2 = document.createElement(\"div\");\n        line2.className = \"paramline\";\n        const name2 = document.createElement(\"div\");\n        name2.className = \"paramname\";\n        name2.innerHTML = \"Strides:\";\n        name2.setAttribute(\"data-name\", \"strides\");\n        const value2 = document.createElement(\"input\");\n        value2.className = \"paramvalue layerparamvalue\";\n        value2.value = \"2, 2\";\n        line2.appendChild(name2);\n        line2.appendChild(value2);\n        this.paramBox.append(line2);\n\n        this.focusing();\n    }\n\n    public getHoverText(): string { return \"Maxpool\"; }\n\n    public lineOfPython(): string {\n        const params = this.getParams();\n        return `MaxPooling2D(pool_size=(${params.poolSize}), strides=(${params.strides}))`;\n    }\n\n    public initLineOfJulia(): string {\n        const params = this.getParams();\n        return `x${this.uid} = insert!(net, (shape) -> (x) -> maxpool(x, (${params.poolSize})))\\n`;\n    }\n\n    public clone(): MaxPooling2D {\n        const newLayer = new MaxPooling2D(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation));\n\n        newLayer.paramBox = this.paramBox;\n        return newLayer;\n    }\n\n}\n"
  },
  {
    "path": "src/ui/shapes/layers/output.ts",
    "content": "import * as tf from \"@tensorflow/tfjs\";\nimport { displayError } from \"../../error\";\nimport { getSvgOriginalBoundingBox } from \"../../utils\";\nimport { ActivationLayer } from \"../activationlayer\";\nimport { Layer } from \"../layer\";\nimport { Point, Rectangle } from \"../shape\";\n\nexport class Output extends ActivationLayer {\n    public layerType: string = \"Output\";\n    public parameterDefaults: { [key: string]: any } = {units: 10, activation: \"softmax\"};\n    public readonly tfjsEmptyLayer: any = tf.layers.dense ;\n    public readonly outputWiresAllowed: boolean = false;\n    public readonly wireGuidePresent: boolean = false;\n\n    public defaultLocation: Point = new Point(\n        getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).width - 100,\n        getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).height / 2);\n    private juliaFinalLineId: number = null;\n    constructor() {\n        super([new Rectangle(new Point(-8, -90), 30, 200, \"#806CB7\")],\n               new Point(getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).width - 100,\n               getSvgOriginalBoundingBox(document.getElementById(\"svg\") as any as SVGSVGElement).height / 2));\n\n    }\n\n    public getHoverText(): string { return \"Output\"; }\n\n    public delete(): void { this.unselect(); }\n\n    public populateParamBox(): void {return; }\n\n    public lineOfPython(): string {\n        return `Dense(10, activation='softmax')`;\n    }\n\n    public initLineOfJulia(): string {\n        let init = `x${this.uid} = insert!(net, (shape) -> Dense(shape[1], 10))\\n`;\n        if (this.juliaFinalLineId == null) {\n            this.juliaFinalLineId = Layer.getNextID();\n        }\n        init += `x${this.juliaFinalLineId} = insert!(net, (shape) -> (x) -> softmax(x))`;\n        return init;\n    }\n\n    public lineOfJulia(): string {\n        const connections = super.lineOfJulia();\n        return connections + `connect!(net, x${this.uid}, x${this.juliaFinalLineId})`;\n    }\n\n    public clone(): Output {\n        const newLayer = new Output();\n        newLayer.paramBox = this.paramBox;\n        return newLayer;\n    }\n\n    public addChild(_: Layer): void {\n        displayError(new Error(\"Output cannot have children. \"));\n    }\n}\n"
  },
  {
    "path": "src/ui/shapes/shape.ts",
    "content": "import * as d3 from \"d3\";\r\n\r\nexport abstract class Shape {\r\n    public color: string;\r\n    public location: Point;\r\n    public svgComponent: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n\r\n    constructor(location: Point, color: string) {\r\n        this.color = color;\r\n        this.location = location;\r\n    }\r\n\r\n    public abstract svgAppender(selection: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>): void;\r\n\r\n}\r\n\r\nexport class PathShape extends Shape {\r\n    public path: string;\r\n\r\n    constructor(path: string, color: string) {\r\n        super(new Point(0, 0), color);\r\n        this.path = path;\r\n    }\r\n\r\n    public svgAppender(selection: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>): void {\r\n        this.svgComponent = selection.append<SVGGraphicsElement>(\"path\")\r\n                                     .attr(\"d\", this.path)\r\n                                     .attr(\"x\", this.location.x)\r\n                                     .attr(\"y\", this.location.y)\r\n                                     .style(\"fill\", this.color)\r\n                                     .style(\"cursor\", \"pointer\");\r\n    }\r\n\r\n}\r\n\r\nexport class Rectangle extends Shape {\r\n    public width: number;\r\n    public height: number;\r\n\r\n    constructor(location: Point, width: number, height: number, color: string) {\r\n        super(location, color);\r\n        this.width = width;\r\n        this.height = height;\r\n    }\r\n\r\n    public svgAppender(selection: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>): void {\r\n        this.svgComponent = selection.append<SVGGraphicsElement>(\"rect\")\r\n                                     .attr(\"x\", this.location.x)\r\n                                     .attr(\"y\", this.location.y)\r\n                                     .attr(\"width\", this.width)\r\n                                     .attr(\"height\", this.height)\r\n                                     .style(\"fill\", this.color)\r\n                                     .style(\"cursor\", \"pointer\");\r\n\r\n    }\r\n}\r\n\r\nexport class Circle extends Shape {\r\n    public radius: number;\r\n    private outerShape: boolean;\r\n\r\n    constructor(location: Point, radius: number, color: string, outerShape: boolean = false) {\r\n        super(location, color);\r\n        this.radius = radius;\r\n        this.outerShape = outerShape;\r\n    }\r\n\r\n    public svgAppender(selection: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>): void {\r\n        this.svgComponent = selection.append<SVGGraphicsElement>(\"circle\")\r\n                                     .attr(\"cx\", this.location.x)\r\n                                     .attr(\"cy\", this.location.y)\r\n                                     .attr(\"r\", this.radius)\r\n                                     .style(\"fill\", this.color)\r\n                                     .style(\"cursor\", \"pointer\");\r\n\r\n        if (this.outerShape) {\r\n            this.svgComponent.attr(\"class\", \"outerShape\");\r\n        }\r\n    }\r\n}\r\n\r\nexport class Line extends Shape {\r\n    public endPoint: Point;\r\n    public lineWidth: number;\r\n\r\n    constructor(location: Point, endPoint: Point, lineWidth: number, color: string) {\r\n        super(location, color);\r\n        this.endPoint = endPoint;\r\n        this.lineWidth = lineWidth;\r\n    }\r\n\r\n    public svgAppender(selection: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>): void {\r\n        this.svgComponent = selection.append<SVGGraphicsElement>(\"line\")\r\n                                     .attr(\"x1\", this.location.x)\r\n                                     .attr(\"y1\", this.location.y)\r\n                                     .attr(\"x2\", this.endPoint.x)\r\n                                     .attr(\"y2\", this.endPoint.y)\r\n                                     .style(\"stroke-width\", this.lineWidth)\r\n                                     .style(\"stroke\", this.color)\r\n                                     .style(\"cursor\", \"pointer\");\r\n    }\r\n}\r\n\r\nexport class Point {\r\n\r\n    public static randomPoint(width: number, height: number, initial: Point): Point {\r\n        return new Point(Math.random() * width + initial.x, Math.random() * height + initial.y);\r\n    }\r\n    public x: number;\r\n    public y: number;\r\n\r\n    constructor(x: number, y: number) {\r\n        this.x = x;\r\n        this.y = y;\r\n    }\r\n\r\n    public distance(other: Point): number {\r\n        return Math.sqrt((this.x - other.x) ** 2 + (this.y - other.y) ** 2);\r\n    }\r\n\r\n    public add(other: Point): Point {\r\n        return new Point(this.x + other.x, this.y + other.y);\r\n    }\r\n\r\n    public minus(other: Point): Point {\r\n        return new Point(this.x - other.x, this.y - other.y);\r\n    }\r\n\r\n    public angleTo(other: Point): number {\r\n        return Math.atan2(other.y - this.y, other.x - this.x) * 180 / Math.PI; // angle for tangent\r\n    }\r\n\r\n    public midpoint(other: Point): Point {\r\n        return new Point((this.x + other.x) / 2, (this.y + other.y) / 2);\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/textbox.ts",
    "content": "import * as d3 from \"d3\";\r\nimport { Point } from \"./shape\";\r\n\r\nexport class TextBox {\r\n    private group: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n    private textElement: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n    private offset: Point;\r\n\r\n    constructor() {\r\n        this.group = d3.select(\"#svg\").append(\"g\")\r\n        .attr(\"transform\", \"translate(5, 50)\")\r\n        .style(\"display\", \"none\");\r\n\r\n        this.group.append(\"rect\")\r\n            .attr(\"x\", -50)\r\n            .attr(\"y\", -15)\r\n            .attr(\"width\", 100)\r\n            .attr(\"height\", 30)\r\n            .attr(\"rx\", 3)\r\n            .attr(\"fill\", \"rgb(0,0,0,0.8)\");\r\n\r\n        this.textElement = this.group.append(\"text\")\r\n            .attr(\"font-family\", \"Helvetica\")\r\n            .attr(\"alignment-baseline\", \"middle\")\r\n            .attr(\"text-anchor\", \"middle\")\r\n            .attr(\"font-size\", 16)\r\n            .attr(\"fill\", \"#eeeeee\");\r\n    }\r\n\r\n    public show(): void {\r\n        this.group.style(\"display\", null);\r\n        this.group.raise();\r\n    }\r\n\r\n    public hide(): void {\r\n        this.group.style(\"display\", \"none\");\r\n    }\r\n\r\n    public raise(): void {\r\n        this.group.raise();\r\n    }\r\n\r\n    public setText(text: string): void {\r\n        this.textElement.text(text);\r\n        // TODO get text width and set rectangle to be large enough\r\n    }\r\n\r\n    public setOffset(offset: Point): void {\r\n        this.offset = offset;\r\n    }\r\n\r\n    public setPosition(position: Point): void {\r\n        this.raise();\r\n        this.group.attr(\"transform\", `translate(${position.x + this.offset.x}, ${position.y + this.offset.y})`);\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/wire.ts",
    "content": "import * as d3 from \"d3\";\r\nimport { windowProperties } from \"../window\";\r\nimport { Layer } from \"./layer\";\r\n\r\nexport class Wire {\r\n    public readonly wireGuidePresent: boolean = false;\r\n\r\n    private source: Layer;\r\n    private dest: Layer;\r\n    private line: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n    private triangle: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n    private group: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n\r\n    constructor(source: Layer, dest: Layer) {\r\n        this.source = source;\r\n        this.dest = dest;\r\n\r\n        const sourceCenter = this.source.getPosition().add(this.source.center());\r\n        const destCenter = this.dest.getPosition().add(this.dest.center());\r\n\r\n        this.group = d3.select<SVGGraphicsElement, {}>(\"#svg\")\r\n                        .append<SVGGraphicsElement>(\"g\");\r\n\r\n        this.line = this.group.append<SVGGraphicsElement>(\"line\")\r\n                            .attr(\"x1\", sourceCenter.x)\r\n                            .attr(\"y1\", sourceCenter.y)\r\n                            .attr(\"x2\", destCenter.x)\r\n                            .attr(\"y2\", destCenter.y)\r\n                            .style(\"stroke\", \"black\")\r\n                            .style(\"stroke-width\", 6)\r\n                            .style(\"cursor\", \"pointer\");\r\n\r\n        this.triangle = this.group.append<SVGGraphicsElement>(\"polygon\")\r\n                                .attr(\"points\", \"0,16, 20,0, 0,-16\")\r\n                                .style(\"cursor\", \"pointer\");\r\n\r\n        this.updatePosition();\r\n        this.source.raise();\r\n        this.dest.raise();\r\n\r\n        this.line.on(\"click\", () => {this.select(); });\r\n        this.triangle.on(\"click\", () => {this.select(); });\r\n    }\r\n\r\n    public raise(): void {\r\n        this.group.raise();\r\n        this.source.raiseGroup();\r\n        this.dest.raiseGroup();\r\n    }\r\n\r\n    public raiseGroup(): void {\r\n        this.group.raise();\r\n    }\r\n\r\n    public select(): void {\r\n        if (windowProperties.selectedElement != null) {\r\n            if (windowProperties.selectedElement === this) {\r\n                return;\r\n            }\r\n            windowProperties.selectedElement.unselect();\r\n        }\r\n        windowProperties.selectedElement = this;\r\n        this.raise();\r\n        this.line.style(\"stroke\", \"yellow\");\r\n        this.triangle.style(\"fill\", \"yellow\");\r\n    }\r\n\r\n    public unselect(): void {\r\n        this.line.style(\"stroke\", \"black\");\r\n        this.triangle.style(\"fill\", \"black\");\r\n    }\r\n\r\n    public delete(): void {\r\n        this.line.remove();\r\n        this.triangle.remove();\r\n        this.source.children.delete(this.dest);\r\n        this.dest.parents.delete(this.source);\r\n        this.source.wires.delete(this);\r\n        this.dest.wires.delete(this);\r\n    }\r\n\r\n    public updatePosition(): void {\r\n        const sourceCenter = this.source.getPosition().add(this.source.center());\r\n        const destCenter = this.dest.getPosition().add(this.dest.center());\r\n        const midPoint = sourceCenter.midpoint(destCenter);\r\n        this.line.attr(\"x1\", sourceCenter.x)\r\n                 .attr(\"y1\", sourceCenter.y)\r\n                 .attr(\"x2\", destCenter.x)\r\n                 .attr(\"y2\", destCenter.y);\r\n\r\n        this.triangle.attr(\"transform\", \"translate(\" + midPoint.x + \",\"\r\n                + midPoint.y + \")rotate(\" + sourceCenter.angleTo(destCenter) + \")\");\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "src/ui/shapes/wireguide.ts",
    "content": "import * as d3 from \"d3\";\r\nimport { windowProperties } from \"../window\";\r\nimport { Draggable } from \"./draggable\";\r\n\r\nexport class WireGuide {\r\n    private dashedLine: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n    private circle: d3.Selection<SVGGraphicsElement, {}, HTMLElement, any>;\r\n\r\n    constructor() {\r\n        this.dashedLine =  d3.select(\"#svg\").append<SVGGraphicsElement>(\"line\")\r\n            .attr(\"x1\", 0)\r\n            .attr(\"y1\", 0)\r\n            .attr(\"x2\", 0)\r\n            .attr(\"y2\", 0)\r\n            .style(\"stroke\", \"black\")\r\n            .style(\"stroke-width\", 6)\r\n            .style(\"stroke-dasharray\", (\"8, 8\"))\r\n            .style(\"display\", \"none\")\r\n            .style(\"pointer-events\", \"none\");\r\n\r\n        this.circle = d3.select(\"#svg\").append<SVGGraphicsElement>(\"circle\")\r\n            .attr(\"cx\", 0)\r\n            .attr(\"cy\", 0)\r\n            .attr(\"r\", 10)\r\n            .style(\"fill\", \"black\")\r\n            .style(\"stroke-width\", \"4\")\r\n            .style(\"display\", \"none\")\r\n            .style(\"pointer-events\", \"none\");\r\n    }\r\n\r\n    public show(): void {\r\n        this.dashedLine.style(\"display\", null);\r\n        this.circle.style(\"display\", null);\r\n        this.dashedLine.raise();\r\n        this.circle.raise();\r\n    }\r\n\r\n    public hide(): void {\r\n        this.dashedLine.style(\"display\", \"none\");\r\n        this.circle.style(\"display\", \"none\");\r\n    }\r\n\r\n    public raise(): void {\r\n        this.dashedLine.raise();\r\n        this.circle.raise();\r\n    }\r\n\r\n    public moveToMouse(): void {\r\n        this.raise();\r\n        if (windowProperties.selectedElement != null &&\r\n            windowProperties.selectedElement.wireGuidePresent &&\r\n            windowProperties.selectedElement instanceof Draggable) {\r\n\r\n            const sourceCenter = windowProperties.selectedElement.getPosition()\r\n                .add(windowProperties.selectedElement.center());\r\n            // Catch the error when there the mouse does not yet have a relative position\r\n            let endCoords;\r\n            try {\r\n                endCoords = d3.mouse( d3.select(\"#svg\").node() as any);\r\n            } catch (error) {\r\n                endCoords = [0, 0];\r\n            }\r\n\r\n            this.dashedLine.attr(\"x1\", sourceCenter.x)\r\n                .attr(\"y1\", sourceCenter.y)\r\n                .attr(\"x2\", endCoords[0])\r\n                .attr(\"y2\", endCoords[1]);\r\n\r\n            this.circle.attr(\"cx\", sourceCenter.x)\r\n                .attr(\"cy\", sourceCenter.y);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/ui/style.scss",
    "content": "$color-menu-bg: #E5E5FC;\r\n\r\nbody {\r\n   margin: 0px;\r\n   overflow: hidden;\r\n}\r\n\r\n#main {\r\n    width:100%;\r\n    height:100%;\r\n    background-color: #D3D3DE;\r\n    /* border: solid 3px #555; */\r\n\r\n}\r\n\r\n#tabselector {\r\n    width: 50px;\r\n    height: 100%;\r\n    float:left;\r\n    //background-color: #A8A8BD;\r\n    background-color: $color-menu-bg;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n    user-select:none;\r\n}\r\n\r\n#menu {\r\n    width: 160px;\r\n    height: calc(100% - 15px);\r\n    float:left;\r\n    background-color: $color-menu-bg;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n    user-select:none;\r\n    padding: 7.5px 10px;\r\n    display: block;\r\n}\r\n\r\n#menu_expander {\r\n  width:10px;\r\n  height:100%;\r\n  float:left;\r\n  margin-left: -10px;\r\n}\r\n\r\n#menu_expander_handle {\r\n  width: 200%;\r\n  height:30px;\r\n  margin-top:calc(50vh - 15px);\r\n  cursor: pointer;\r\n}\r\n\r\n#menu_expander_handle > svg {\r\n    height: 30px;\r\n    width: 20px;\r\n}\r\n\r\n#right_menu_expander {\r\n  width: 10px;\r\n  height: 100%;\r\n  float: right;\r\n  background: #E5E5FC;\r\n  margin-right: -10px;\r\n}\r\n\r\n#right_menu_expander_handle {\r\n  width: 200%;\r\n  height:30px;\r\n  margin-top:calc(50vh - 15px);\r\n  cursor: pointer;\r\n  float:right;\r\n}\r\n\r\n#right_menu_expander_handle > svg {\r\n    height: 30px;\r\n    width: 20px;\r\n}\r\n\r\n#paramshell {\r\n    width: 180px;\r\n    height: 100%;\r\n    float:right;\r\n    background-color: $color-menu-bg;\r\n    font-size:18px;\r\n    font-family: Helvetica;\r\n    user-select:none;\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n    display: block;\r\n}\r\n\r\n#blanktab {\r\n    min-height: calc(25% - 100px);\r\n    width: 100%;\r\n    background-color: #A8A8BD;\r\n}\r\n\r\n#middleblanktab {\r\n    min-height: calc(75% - 200px);\r\n    width: 100%;\r\n    vertical-align: middle;\r\n    background-color: #A8A8BD;\r\n    float:left;\r\n}\r\n\r\n#bottomblanktab {\r\n    width: 100%;\r\n    height: 100%;\r\n    vertical-align: middle;\r\n    background-color: #A8A8BD;\r\n    float:left;\r\n}\r\n\r\n.icon{\r\n    padding-top: 23;\r\n    padding-left: 1;\r\n}\r\n\r\n.tab:hover {\r\n    background-color: #C7C7E0;\r\n}\r\n\r\n.category{\r\n    padding-bottom: 15px;\r\n    width:100%;\r\n}\r\n\r\n.categoryTitle {\r\n    background: #555;\r\n    text-align: center;\r\n    height:35px;\r\n    line-height: 35px;\r\n    color: #eee;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n\r\n    cursor: pointer;\r\n}\r\n\r\n.categoryTitleText {\r\n    position:relative;\r\n    float:left;\r\n    margin-left:10px;\r\n    margin-top:2px;\r\n}\r\n\r\n.trainbox {\r\n    text-align: center;\r\n    margin-top: 20px;\r\n    width:180px;\r\n    height:70px;\r\n    line-height: 50px;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n}\r\n\r\n.train {\r\n    background: #447344;\r\n    color: #eee;\r\n    text-align:center;\r\n    height:50px;\r\n    line-height:50px;\r\n    font-size:24px;\r\n    font-family: Helvetica;\r\n    border-radius: 6px;\r\n    cursor:pointer;\r\n}\r\n\r\n.train:hover {\r\n    background-color: #00008B;\r\n}\r\n\r\n.train-active {\r\n   background: #00008B;\r\n}\r\n.expander {\r\n    float:right;\r\n    margin-top:5px;\r\n    margin-right:5px;\r\n}\r\n.expanded{\r\n    float:right;\r\n    margin-top:5px;\r\n    margin-right:5px;\r\n    transform: rotate(180deg)\r\n}\r\n\r\n.bottomCategory{\r\n    position: absolute;\r\n    bottom: 10px;\r\n    width: 160px;\r\n    padding-bottom: 15px;\r\n}\r\n\r\n.category{\r\n    padding-bottom: 20px;\r\n    width:100%;\r\n}\r\n\r\n.parambox{\r\n    width:calc(197px - 20px);\r\n    padding-left: 10px;\r\n    padding-right:10px;\r\n    padding-top: 20px;\r\n    text-align: center;\r\n}\r\n\r\n.paramline{\r\n    width:100%;\r\n    text-align:left;\r\n    height:30px;\r\n    line-height:30px;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n    background-color: transparent;\r\n    user-select:none;\r\n}\r\n\r\n.paramname{\r\n    text-align:left;\r\n    height:100%;\r\n    font-size:16px;\r\n    font-family: Helvetica;\r\n    background-color: transparent;\r\n    user-select:none;\r\n    float:left;\r\n}\r\n\r\n.layerparamvalue {\r\n    margin-top: 5px\r\n}\r\n\r\n.paramvalue{\r\n    width:30%;\r\n    text-align:center;\r\n    height:20px;\r\n    font-size:16px;\r\n    font-family: Helvetica;\r\n    margin-right: 10px;\r\n    float:right;\r\n}\r\n\r\n.option:hover {\r\n    background-color: #ccc;\r\n}\r\n\r\n.select-option {\r\n    width:calc(100% - 20px);\r\n    text-align: left;\r\n    border-bottom: 1px solid gray;\r\n    height:30px;\r\n    line-height:30px;\r\n    font-size:18px;\r\n    font-family: Helvetica;\r\n    cursor:pointer;\r\n\r\n    padding: 10px 10px 0px 10px;\r\n\r\n    background-color: transparent;\r\n    user-select:none;\r\n\r\n    &:hover {\r\n        background-color: #ccc;\r\n    }\r\n}\r\n\r\n.tab-option {\r\n    vertical-align: middle;\r\n    line-height: 70px;\r\n    width: 50px;\r\n    height: 70px;\r\n    text-align: center;\r\n    float:left;\r\n    font-size:22px;\r\n    font-family: Helvetica;\r\n    cursor:pointer;\r\n    user-select:none;\r\n    background-color: #A8A8BD;\r\n}\r\n\r\n.tab-selected {\r\n    background-color: $color-menu-bg;\r\n}\r\n\r\n.last-dropdown {\r\n    border-bottom: 0px;\r\n}\r\n\r\n.right-option {\r\n    width:calc(100% - 30px);\r\n    padding: 10px 0px 0px 10px;\r\n    margin: 0px 10px 0px 10px;\r\n}\r\n\r\ndiv.option.selected {\r\n    background-color: #C4B7D1;\r\n\r\n }\r\n\r\ndiv.top_neighbor_tab-selected {\r\n    border-bottom-right-radius: 5px;\r\n}\r\n\r\n div.bottom_neighbor_tab-selected {\r\n    border-top-right-radius: 5px;\r\n }\r\n\r\n.option-dropdown {\r\n    width:calc(100% - 20px);\r\n    text-align: left;\r\n    border-bottom: 1px solid gray;\r\n    height:30px;\r\n    line-height:30px;\r\n    font-size:18px;\r\n    font-family: Helvetica;\r\n    cursor:pointer;\r\n\r\n    padding: 10px 10px 0px 10px;\r\n\r\n    background-color: transparent;\r\n    user-select:none;\r\n    position: relative;\r\n    display: inline-block;\r\n}\r\n\r\n.dropdown-content {\r\n    border-radius: 6px;\r\n    float: right;\r\n    display: none;\r\n    position: fixed;\r\n    min-width: 160px;\r\n    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\r\n    z-index: 1;\r\n    background-color: $color-menu-bg;\r\n    border: 1px solid rgba(128, 128, 128, 0.5);\r\n\r\n}\r\n.left {\r\n    left: 218px;\r\n    margin-top: -11px;\r\n}\r\n\r\n\r\n.option-dropdown:hover .dropdown-content {display: block;}\r\n\r\n.toggle {\r\n    width: calc(100% - 10px);\r\n    height: 30px;\r\n    line-height: 30px;\r\n    padding-top: 10px;\r\n    padding-left:5px;\r\n    padding-right:5px;\r\n}\r\n\r\n.toggleOption {\r\n    float:left;\r\n    width: calc(50% - 10px);\r\n    text-align: center;\r\n    height: 100%;\r\n    cursor: pointer;\r\n\r\n    margin-left: 5px;\r\n    margin-right: 5px\r\n}\r\n\r\n#middle {\r\n    position: relative;\r\n    float: left;\r\n    width : calc(100% - 430px);\r\n    height: 100%;\r\n}\r\n\r\n\r\n#svg {\r\n    width: 1000px;\r\n    height: 100%;\r\n    background: #e3e3eE;\r\n}\r\n\r\n#networkTab {\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: hidden;\r\n}\r\n\r\n#progressTab {\r\n    width: calc(100% - 20px);\r\n    grid-column-gap: 20px;\r\n    box-sizing: border-box;\r\n    padding: 10px;\r\n    height: calc(100% - 20px);\r\n    display: grid;\r\n    grid-template-columns: 1fr 2fr;\r\n    grid-template-rows: 1fr 1fr;\r\n}\r\n\r\n#visualizationTab {\r\n    width: 100%;\r\n    height: 100%;\r\n}\r\n\r\n#images {\r\n    display: grid;\r\n    grid-template-columns: repeat(10, 1fr);\r\n    grid-template-rows:  repeat(6, 1fr);\r\n    width: 100%;\r\n    height: 100%;\r\n}\r\n\r\n.informationRow {\r\n    display: flex;\r\n}\r\n.informationColumn {\r\n    font-size: 36;\r\n    cursor: pointer;\r\n    float: left;\r\n    width: 49%;\r\n    padding-top: 2%;\r\n    padding-bottom: 2%;\r\n    background-color: rgba(168,168,189,0.85);\r\n}\r\n\r\n.informationBlankColumn {\r\n    float: left;\r\n    height: 10%;\r\n    width: 2%;\r\n}\r\n\r\n.informationColumn:hover {\r\n    background-color: rgba(168,168,189,0.5);\r\n}\r\n\r\na.overlayLinks {\r\n    color: lightblue;\r\n}\r\n\r\n#informationOverlay {\r\n    position: fixed;\r\n    padding: 4%;\r\n    text-align: center;\r\n    color: $color-menu-bg;\r\n    font-size: 48;\r\n    width: 92%;\r\n    height: 100%;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    background-color: rgba(0,0,0,0.85);\r\n\r\n    cursor: pointer;\r\n    font-family: Helvetica;\r\n    z-index: 9999;\r\n}\r\n\r\n#loadingDataTab {\r\n    position: fixed;\r\n    padding: 5%;\r\n    text-align: center;\r\n    color: $color-menu-bg;\r\n    font-size: 48;\r\n    width: 90%;\r\n    height: 85%;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    background-color: rgba(0,0,0,0.8);\r\n    cursor: pointer;\r\n    font-family: Helvetica;\r\n    z-index: 9999;\r\n}\r\n#footer {\r\n    position: fixed;\r\n    bottom: 0;\r\n    width: 100%;\r\n    z-index: 99;\r\n    margin-left: 48%;\r\n}\r\n#acknowledgements {\r\n    text-align: center;\r\n    font-size: 18;\r\n    display: inline-block;\r\n    padding: 3%;\r\n    cursor: pointer;\r\n    font-family: Helvetica;\r\n}\r\n\r\n#informationBody {\r\n    text-align: center;\r\n    color: $color-menu-bg;\r\n    font-size: 24;\r\n    font-family: Helvetica;\r\n    padding-bottom: 3%;\r\n}\r\n\r\n#educationTab {\r\n    width: 90%;\r\n    height: 100%;\r\n    background: #F1FAFF;\r\n    padding-left: 5%;\r\n    padding-right: calc(5% + 200px);\r\n    padding-top: 3%;\r\n    overflow-y : auto;\r\n}\r\n\r\n.educationTitle {\r\n    font-size: 40;\r\n    text-align: center;\r\n    padding-top: 30px;\r\n    padding-bottom: 10px;\r\n    font-family: Helvetica;\r\n    font-weight: bolder;\r\n}\r\n\r\n.educationSection {\r\n    font-size: 30;\r\n    line-height: 1.7em;\r\n    font-family: Helvetica;\r\n    font-weight: bold;\r\n}\r\n\r\n.educationContent {\r\n    font-size: 18;\r\n    word-wrap: break-word;\r\n    line-height: 1.7em;\r\n    font-family: Helvetica;\r\n}\r\n\r\n.educationVideo {\r\n    // margin-right: 5%;\r\n    // object-fit: contain;\r\n    padding: 20px;\r\n    width: 40%;\r\n    height: 34%;\r\n    display: table;\r\n    margin: 0 auto;\r\n    // text-align: left;\r\n    overflow:hidden !important;\r\n}\r\n\r\n.educationImage {\r\n    padding-top: 15px;\r\n    // padding: 20px;\r\n    // width: 40%;\r\n    // height: 34%;\r\n    display: table;\r\n    margin: 0 auto;\r\n    // text-align: left;\r\n    overflow:hidden !important;\r\n}\r\n\r\n.educationAuthor{\r\n    font-size: 14;\r\n    font-family: Helvetica;\r\n    text-align: center;\r\n    padding-bottom: 10px;\r\n\r\n}\r\n\r\n\r\n#error {\r\n    width: 200px;\r\n    position: absolute;\r\n    padding: 20px 5px 5px 5px;\r\n    bottom: 10px;\r\n    right: 20px;\r\n    background-color: #dca7a7;\r\n    border-style: solid;\r\n    border-width: 3px;\r\n    border-color: #555;\r\n}\r\n\r\n#x {\r\n    position: absolute;\r\n    top: 0px;\r\n    right: 0px;\r\n    cursor: pointer;\r\n}\r\n\r\n#errorMessage {\r\n    height: 80px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n}\r\n\r\n.modelLink {\r\n    margin: 0 auto;\r\n    position: relative;\r\n    text-align: center;\r\n    padding-bottom: 15px;\r\ntop: 50%;\r\ntransform: translateY(-50%);\r\n}\r\n\r\nlabel {\r\n    display: inline-block;\r\n    width: 250px;\r\n    padding: 6px 0 6px 0;\r\n}\r\n\r\n.canvases {\r\n    display: inline-block;\r\n}\r\n\r\n#loss-canvas {\r\n    grid-column: 1;\r\n    grid-row: 1;\r\n}\r\n\r\n#accuracy-canvas {\r\n    grid-column: 1;\r\n    grid-row: 2;\r\n}\r\n\r\n#confusion-matrix-canvas {\r\n    grid-column: 2 / span 3;\r\n    grid-row: 1 / span 2;\r\n}\r\n\r\n.prediction-canvas {\r\n    width: 100%;\r\n}\r\n\r\n.pred {\r\n    font-size: 1.2vw;\r\n    line-height: 1.5vw;\r\n    width: 100%;\r\n    font-family: Helvetica;\r\n    text-align: center;\r\n}\r\n\r\n.pred-correct {\r\n    background-color: #79BD8F;\r\n}\r\n\r\n.pred-none {\r\n    background-color: #aaa;\r\n}\r\n\r\n.pred-incorrect {\r\n    background-color: #FF6138\r\n}\r\n\r\n.pred-container {\r\n    display: inline-block;\r\n    margin: 13%;\r\n}\r\n\r\n.selectline {\r\n    margin-bottom: 10px;\r\n}\r\n\r\n.select {\r\n    position: relative;\r\n    display: inline-block;\r\n    margin-bottom: 0px;\r\n    width: 50%;\r\n    margin-right: 10px;\r\n    float: right;\r\n  }\r\n  .select select {\r\n    display: inline-block;\r\n    width: 100%;\r\n    cursor: pointer;\r\n    padding: 7px 10px;\r\n    outline: 0;\r\n    border: 0;\r\n    border-radius: 0;\r\n    background: #ccc;\r\n    color: #000;\r\n    appearance: none;\r\n    -webkit-appearance: none;\r\n    -moz-appearance: none;\r\n  }\r\n  .select select::-ms-expand {\r\n    display: none;\r\n  }\r\n  .select select:hover,\r\n  .select select:focus {\r\n    color: #000;\r\n    background: #bbb;\r\n  }\r\n  .select select:disabled {\r\n    opacity: 0.5;\r\n    pointer-events: none;\r\n  }\r\n  .select__arrow {\r\n    position: absolute;\r\n    top: 12px;\r\n    right: 15px;\r\n    width: 0;\r\n    height: 0;\r\n    pointer-events: none;\r\n    border-style: solid;\r\n    border-width: 8px 5px 0 5px;\r\n    border-color: #000 transparent transparent transparent;\r\n  }\r\n  .select select:hover ~ .select__arrow,\r\n  .select select:focus ~ .select__arrow {\r\n    border-top-color: #000;\r\n  }\r\n  .select select:disabled ~ .select__arrow {\r\n    border-top-color: #000;\r\n  }\r\n\r\n  .hidden_div {\r\n      display: none;\r\n  }\r\n"
  },
  {
    "path": "src/ui/utils.ts",
    "content": "export function copyTextToClipboard(text: string): void {\n    // https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\n    const textArea = document.createElement(\"textarea\");\n\n    //\n    // *** This styling is an extra step which is likely not required. ***\n    //\n    // Why is it here? To ensure:\n    // 1. the element is able to have focus and selection.\n    // 2. if element was to flash render it has minimal visual impact.\n    // 3. less flakyness with selection and copying which **might** occur if\n    //    the textarea element is not visible.\n    //\n    // The likelihood is the element won't even render, not even a flash,\n    // so some of these are just precautions. However in IE the element\n    // is visible whilst the popup box asking the user for permission for\n    // the web page to copy to the clipboard.\n    //\n\n    // Place in top-left corner of screen regardless of scroll position.\n    textArea.style.position = \"fixed\";\n    textArea.style.top = \"0\";\n    textArea.style.left = \"0\";\n\n    // Ensure it has a small width and height. Setting to 1px / 1em\n    // doesn't work as this gives a negative w/h on some browsers.\n    textArea.style.width = \"2em\";\n    textArea.style.height = \"2em\";\n\n    // We don't need padding, reducing the size if it does flash render.\n    textArea.style.padding = \"0\";\n\n    // Clean up any borders.\n    textArea.style.border = \"none\";\n    textArea.style.outline = \"none\";\n    textArea.style.boxShadow = \"none\";\n\n    // Avoid flash of white box if rendered for any reason.\n    textArea.style.background = \"transparent\";\n\n    textArea.value = text;\n\n    document.body.appendChild(textArea);\n    textArea.focus();\n    textArea.select();\n\n    try {\n        document.execCommand(\"copy\");\n    } finally {\n        document.body.removeChild(textArea);\n    }\n}\n\nexport function parseString(s: string): number | number[] {\n    if (s.indexOf(\",\") === -1) {\n        return Number(s);\n    }\n    s = s.replace(\"(\", \"\").replace(\")\", \"\").replace(\"[\", \"\").replace(\"]\", \"\");\n    return s.split(\",\").map((x) => Number(x));\n}\n\nexport function getSvgOriginalBoundingBox(svg: SVGSVGElement): {width: number, height: number} {\n\n    const width  = svg.width.baseVal.value;\n\n    const height = svg.height.baseVal.value;\n\n    return {width, height};\n\n}\n"
  },
  {
    "path": "src/ui/window.ts",
    "content": "import { ActivationLayer } from \"./shapes/activationlayer\";\nimport { Draggable } from \"./shapes/draggable\";\nimport { TextBox } from \"./shapes/textbox\";\nimport { Wire } from \"./shapes/wire\";\nimport { WireGuide } from \"./shapes/wireguide\";\n\nexport enum Mode {\n    Move,\n    Connect,\n}\n\nclass WindowProperties {\n    private static instance: WindowProperties;\n    public selectedElement: Draggable | Wire;\n    public activationLayers: Set<ActivationLayer> = new Set();\n    public mode: Mode = Mode.Move;\n    public draggedElement: any;\n    public selectState: any;\n    public xClickOffset: any;\n    public yClickOffset: any;\n    public wireInputElement: any;\n    public defaultparambox: any;\n    public wireGuide: WireGuide;\n    public svgTransformRatio: number = 1;\n    public svgYOffset: number = 0;\n    public shapeTextBox: TextBox;\n\n    private constructor() {}\n\n    public static get Instance(): WindowProperties {\n        return this.instance || (this.instance = new this());\n    }\n}\n\nexport const windowProperties = WindowProperties.Instance;\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"outDir\": \"./built\",\n        \"allowJs\": false,\n        \"target\": \"es6\",\n        \"module\": \"commonjs\",\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"alwaysStrict\": true,\n        \"noImplicitReturns\": true,\n        \"noImplicitAny\": true,\n\t    \"moduleResolution\": \"node\",\n    },\n    \"include\": [\n        \"./src/**/*\",\n        \"package.json\",\n    ]\n}\n"
  },
  {
    "path": "tslint.json",
    "content": "{\n    \"defaultSeverity\": \"error\",\n    \"extends\": [\n        \"tslint:recommended\"\n    ],\n    \"jsRules\": {},\n    \"rules\": {\n        \"typedef\": [true,\n            \"call-signature\",\n            \"parameter\",\n            \"property-declaration\",\n            \"member-variable-declaration\"],\n        \"max-classes-per-file\": false,\n        \"prefer-const\": true,\n        \"ban-types\": [true, [\"Object\", \"Use {} instead.\"], [\"String\"]]\n    },\n    \"rulesDirectory\": []\n}\n"
  },
  {
    "path": "webpack.config.js",
    "content": "module.exports = {\r\n    entry: \"./built/ui/app.js\",\r\n    output: {\r\n      filename: \"bundle.js\"\r\n    },\r\n    target: 'web',\r\n    // type: 'javascript/auto',\r\n    // test: /\\.(json)$/,\r\n    // exclude: /node_modules/,\r\n    // loader: [\r\n    //   `file-loader?publicPath=./&name=[name].[ext]`\r\n    // ],\r\n    // {\r\n    //   test: /\\.(jpg|jpeg|gif|png)$/,\r\n    //   // exclude: /node_modules/, <-- Delete this line\r\n    //   loader: [\r\n    //   `url-loader?limit=4112&publicPath=./&name=[name].[ext]`\r\n    //   ]\r\n    // }\r\n    externals: {\r\n      // '@tensorflow/tfjs': '@tensorflow/tfjs',\r\n      // '@tensorflow/tfjs-node': '@tensorflow/tfjs-node',\r\n      'canvas': 'canvas'\r\n    },\r\n    module: {\r\n      rules: [\r\n        {\r\n          type: 'javascript/auto',\r\n          test: /\\.(json)$/,\r\n          exclude: /node_modules/,\r\n          use: [\r\n            { loader: `file-loader?publicPath=./&name=[name].[ext]` },\r\n            // {\r\n            //   loader: 'css-loader',\r\n            //   options: {\r\n            //     modules: true\r\n            //   }\r\n            // },\r\n            // { loader: 'sass-loader' }\r\n          ]\r\n        },\r\n        {\r\n          test: /\\.(jpg|jpeg|gif|png)$/,\r\n          // exclude: /node_modules/,\r\n          loader: [\r\n            `url-loader?limit=4112&publicPath=./dist/&name=[name].[ext]`\r\n          ]\r\n        },\r\n        {\r\n          type: 'javascript/auto',\r\n          test: /\\.(json)$/,\r\n          exclude: /node_modules/,\r\n          loader: [\r\n            `file-loader?publicPath=./dist/&name=[name].[ext]`\r\n          ]\r\n        },\r\n      ]\r\n    }\r\n  }"
  }
]